她理财-下载领115元红包
新手专享,人人有份!
用 App 打开,
参与话题与讨论
扫码直接下载
【我们有钱而且过得好】任务5:拯救幸福之花
任务1、任务2见这里?:任务3见这里?:任务4见这里?:====================攒一个亿的最新进度:在【我们有钱而且过得好】的所有家族成员以及财蜜们的共同努力下,我们终于集齐了三件神器,帮助迷失的女神恢复了身份,从“吃土少女”变回了圣洁美丽的女神。女神祭出“月光戒”,大片的“没钱花”化为灰烬,重新长出了美丽的“有钱花”。但是,女神亲手种下的“幸福之花”,由于长久无人打理,快要蔫掉了。拯救幸福之花,需要:①100颗感恩之心的浇灌;②至少38名幸福使者的守护。紧急求助财蜜们来帮忙。方法:①集齐100颗感恩之心②寻找38名幸福使者做如下的测试,总得分在20分以上的同学请跟帖回复“幸福使者”总得分在20分以下的家族成员,请参考如下的表格查缺补漏,根据实际情况努力提升幸福感。关于上表的解释:1,人口统计学方面的因素比如年龄、性别、种族、教育程度和收入等,往往是人们如何生活的重要决定因素----都跟幸福有关,但相关度比较低。也就是所有人都可以获得幸福。2,决定幸福的更加稳定的决定因素就是社会或者人际因素:朋友的个数、婚姻、外倾性和感激。其他一些更稳定的相关因素包括宗教信仰、娱乐活动、是否有份工作(不是指收入如何)等,这些都能够促进人与人的接触。----良好的社会关系可能确实是通往极度幸福的必备条件。3,一些人格特质,比如乐观、外倾性、知觉能力、自尊、内部控制能力(认为你能够控制发生在自己身上的事),与幸福存在中度至高度相关,较低的神经质性也是如此。一种可能的解释是:快乐的人能够帮助自己拥有更多积极特质,不快乐的人则相反----幸福可能就是一个人及其外在表现的结果。PS:很多列出来的因素与因素之间也存在着相关的关系。比如:宗教信仰由于这个因素是根据去往教堂的次数确定的,所以在身体健康的状态从中也有影响,比如患有严重躯体疾病的人是很难去教堂的。经济状况比较差的人,受教育的机会也很少,接受医疗健康补助的可能性也不大,也很少有机会进行休闲娱乐等。有些因素看起来相关性不大,但如果对此因素进行细致的观察和研究,其相关性也会变大。比如:收入和幸福的相关度总体上,收入跟幸福之间的相关性比较微弱,但对那些经济收入水平较低的人来说,相关性就明显增强。是因为,人们必须先满足基本的物质生活需要,才有可能谈得上幸福。如果满足了这个条件之后,收入对幸福的影响就没那么明显了。BTW,上表呈现出的是幸福与生活满意度相关的因素,但相关关系并不意味着因果关系,也就是说,两个变量之间存在关联,但不存在因果方面的关联。参考资料:《积极心理学》(作者:[美]克里斯托弗?彼得森)完成以上任务,获得成长值20。请如下家族成员紧急集合来完成任务:
@小蕾同志在努力
@小妮子来了
@看着她伤心
@努力的小cc
@水杯里的鱼
@天亮说早安
@winnie_Yue
@Edith杨杨
@L婷婷婷婷婷子
@情深似狗何必狗咬狗
@frederika
@Tethys槿凤
@我若安好.便是晴天
@BlahBlahBlah
@我家亦平芳
@小溪Lacky
@最初的梦想9851
@细雨来了 |
@echoyang9011
@小慵懒么么哒
@安妮利不安丽
@张太太要存钱
668888想去青迈
@假装在美国
@qinqin_queen
@盆盆的麻豆dana
@Sunflower60
4112人参与
4112人参与
19人参与讨论
335人参与讨论
面对意外收入,你是攒还是花?快来亮出你的观点吧!
iOS • Android
& 2012- 京ICP备号-2
加入她理财,与姐妹们一起理财、理生活。
第三方登录经过优化的逻辑算子,被Hive转化成底层计算引擎能运行的任务,这个过程称为物理任务的生成。Hive支持MapReduce、Tez以及Spark三种计算引擎,可以将逻辑算子转换成对应三种计算引擎的物理任务。本文主要介绍Hive将逻辑算子转换成MapReduce作业的过程。
5.1 物理任务的表示
Hive将算子DAG转换成一系列具有依赖关系的任务,这些任务构成一个DAG图。Hive中使用Task对象来表示一个任务,Task记录其在Task DAG中父节点和子节点以及其他运行时状态信息,主要数据结构和方法如下:
abstract class Task&T extends Serializable& {
//任务状态变量
protected trans
protected transient
protected tran
//任务描述信息
protected T
//是否为根任务
protected boolean rootT
protected List&Task&? extends Serializable&& childT
protected List&Task&? extends Serializable&& parentT
//任务执行方法
protected abstract int execute(DriverContext driverContext)
其中DriverContext为Task DAG执行过程中的上下文,主要记录当前正在运行的任务列表等运行的任务等信息。
work为任务的描述信息,封装了任务运行时所需的数据结构。不同任务work类型不同,如对于MapRedTask任务,其work类型为MapredWork类型。
5.2 主要Task类的实现
Task是一个抽象类,主要实现如下:
5.2.1 MapRedTask
MapRedTask表示一个mapreduce作业,用于执行MapReduce程序。其execute方法通过JobClient向hadoop提交作业执行。
1) MapredWork数据结构
MapRedTask使用MapredWork对象描述任务信息(Task的work变量), MapredWork包含MapWork和ReduceWork两类对象,分别表示map端任务信息和reduce端任务信息。
(1)MapWork数据结构
LinkedHashMap&String, ArrayList&String&&()
pathToAliases
LinkedHashMap&String, PartitionDesc&
pathToPartitionInfo
LinkedHashMap&String, Operator&
aliasToWork
LinkedHashMap&String, PartitionDesc&
aliasToPartnInfo
pathToAliases表示表分区文件路径和表别名的映射关系,由于一张表可以有多个别名,因此这里value是数组(如selecta.*,b.* from tbl a join tbl b on a.id=b.id)。在没有分区的情况下,path为整个表的路径。
pathToPartitionInfo表示表分区文件路径和分区描述信息PartitionDesc的映射关系。PartitionDesc包含表描述信息、分区名称和分区值、分区InputFormat和OutputFormat等内容。
aliasToWork表示表别名和DAG顶层算子(TS算子)的映射关系。
aliasToPartnInfo表示表别名和分区描述信息PartitionDesc的映射关系。
(2)ReduceWork数据结构
主要数据结构如下:
private TableDesc
private List&TableDesc&
tagToValueDesc
private Operator&?&
//是否打标
private boolean
keyDesc表示reduce key的字段结构信息。
tagToValueDesc为reducevalue的字段结构信息。在包含join的情况下,reduce端会包含多张表的数据,不同数据通过tag进行区分,因此tagToValueDesc数组包含了不同表的value的字段结构信息,通过表对应的tag下标来获取该表reduce value的结构信息。
reducer为reduce端任务执行的算子DAG。Hive在将算子DAG转换成mapreduce任务时,会将算子DAG拆分成map端算子和reduce端算子,后面会讲到。
needsTagging表是reduce端是否使用tag打标。在join的情况下该字段为true,reduce通过tag字段区分不同表的数据。
2) execute方法主要实现
MapRedTask的execute方法完成mapreduce作业的参数配置和提交。mapreduce作业的主要配置如下表:
ExecMapper
ExecReducer
InputFormat
CombineHiveInputFormat
OuputFormat
HiveOutputFormatImpl
空实现,hive不依赖mapreduce框架的数据输出机制,而由FS算子输出数据。
Partitioner
DefaultHivePartitioner
基于hash值得partition,同时提供对分桶的支持。
MapOutputKeyClass
MapOutputValueClass
BytesWritable
execute方法会将MapWork和ReduceWork序列化后写入HDFS,并添加到分布式缓存。map任务和reduce任务执行阶段会反序列化得到这两个对象。
&3) map端执行过程
map端执行的mapper类为ExecMapper。ExecMapper先进行初始化,初始化过程首先从分布式缓存中读取MapWork对象,接着创建MapOperator对象并对MapOperator对象进行初始化操作,初始化主要完成以下操作:
(1)构建分区路径和MapOpCtx对象映射关系表,该表数据结构如下:
Map&String, Map&Operator, MapOpCtx&& opCtxMap
opCtxMap的key是分区路径(无分区则为整张表的路径),value是一个map,该map是该分区路径对应的算子和MapOpCtx对象的映射关系。由于一个分区路径会同时有多个处理逻辑(即一条HiveQL语句中,可以对同一张表进行不同的数据处理,如select a.*,b.*from tabl a join table b on a.id=b.id对表tbl进行了两次读操作,对应两个TS算子),因此一个路径对应多个算子和MapOpCtx对象,这里用map来存放算子和MapOpCtx对象。MapOpCtx主要字段和方法如下:
//分区处理算子
Operator&?&
//分区信息
PartitionDesc
//分区反序列化器
//分区名称
//记录读取方法
readRow(Writable value);
//记录处理方法
forward(Object row);
MapOpCtx中包含分区的反序列化器以及分区描述信息等内容,提供readRow方法读取记录,process方法处理记录。readRow方法对分区数据进行反序列化处理(Hive表中的数据被序列化后存储),process方法调用当前分区处理算子op的process方法进行数据处理。op算子是map端算子DAG的顶层算子,记录沿着op算子传递给DAG图所有算子进行处理。
数据处理阶段,ExecMapper#map方法每次调用MapOperator#process方法处理一条记录的数据。process方法根据当前记录的分区路径从opCtxMap表里找到对应的MapOpCtx对象,调用MapOpCtx对象的readRow读取记录,然后通过forward方法进行处理。process方法实现的伪代码如下:
process(Writable
if(当前记录分区文件路径改变) {
currentMapOtCtxs=opCtxMap.get(当前记录分区文件路径).values();
for(mapOptCtx: currentMapOtCtxs) {
row= mapOptCtx.readRow(value);//对value进行反序列化
//调用当前路径的算子处理记录
mapOptCtx.forward(row);
4) reduce端处理
reduce端对应的reducer类为ExecReducer。ExecReducer首先进行初始化:从分布式缓存读取ReduceWork对象到work、初始化key和value的反序列化器(inputKeyDeserializer和inputValueDeserializers)、初始化reduce端算子;
然后在reduce方法中处理数据(格式为&key,values&),reduce方法的伪代码如下:
reduce(BytesWriable key,Iterator values) {
Object groupKey=
int tag=0;
if(work.needsTagging) {//需要tag标记位(用于join情况)
tag=key[key.length-1];//key的最后一位存放tag信息
key.setLength(key.length-1);//key不包含tag信息
if(key!=groupKey) {
reducer.startGroup();//分组开始
if(groupKey==null)
reducer.endGroup();//分组结束
for(value:values) {
row[0]= inputKeyDeserializer.deserialize(key);
row[1]= inputValueDeserializers[tag].deserialize(value)
reducer.process(row,tag);//reducer算子处理数据
5.2.2 其他Task介绍
1)FetchTask
FetchTask表示读取数据任务,用于读取HiveQL最后执行的结果。
2)MoveTask
数据迁移任务,在不同目录之间左数据迁移。如insertoverwrite语句,查询语句执行完成后将数据从临时路径移动到目标数据源的表路径中。
3)DDLTask
执行DDL语句的任务,如create table、drop table等。
4)ExplainTask
HiveQL语句性能分析任务。打印HiveQL语句生成的物理任务DAG等信息。
5) MapredLocalTask
执行本地任务,即client端的任务。比如map端join会先启动MapRedLocalTask将小表数据转换成hash表(key为joinkey,value为其他字段)。
5.3 Task DAG的生成
Task DAG的生成是将逻辑算子DAG转换成Task DAG的过程。Hive支持将逻辑算子DAG转换成MapReduce平台、Tez平台以及Spark平台上的Task DAG,下面介绍MapReduce平台上Task DAG的生成。
&& 1)Task DAG生成
&& Hive根据RS算子将算子DAG进行***成多个map-reduce过程,每个map-reduce过程生成对应的MapRedTask任务, 任务之间存在前后执行的依赖关系,形成Task DAG。每个map-reduce过程中包含算子DAG被***后的一个分支。map过程处理分支中RS算子以及其前面的算子; reduce过程处理分支中RS算子后面的算子。
&& 下图所示算子DAG被***成两MapRedTask:MapRedTask1和
MapRedTask2,MapRedTask2执行依赖MapRedTask1,MapRedTask1的输出数据作为MapRedTask2的输入数据。在MapRedTask1中,存在两个RS算子分支,每个分支对应一个map过程;RS子节点指向同一个JOIN算子,需要一个reduce过程,整个过程需要一次map-reduce过程。因此这里生产了一个MapRedTask。接着SEL算子之后为RS算子,该RS算子前面已经存在一个MapRedTask,这时需要对算子DAG进行***,RS前面算子划分到MapRedTask1,后面的算子则划分到MapRedTask2,同时在SEL算子后面补一个FS算子(图中虚线FS算子)用于输出MapRedTask1的数据;在RS算子前面补一个TS算子(图中虚线TS算子),用于MapRedTask2读取MapRedTask1的输出数据。
&& 当算子DAG中包含Union算子时,根据Union输入分支是否包含map-reduce过程,分两种情况:
&& (1)分支都是map-only类型
&& 即不包含map-reduce过程。这种情况下,union以及其所有分支被划分到一个MapRedTask中。
& &如下图所示:
(2)分支中至少有一个包含map-reduce过程
包含map-reduce的分支被划分给一个MapRedTask任务,该任务作为父任务,其他不包含map-reduce过程的分支和union算子构成子任务。如下图所示:
图中虚线的FS算子是补充给任务MapRedTask1用于输出输出,虚线的TS算子则是补充给MapRedTask2 union的分支,用于读取MapRedTask1的输出。
2)Task DAG生成的实现
Hive对算子DAG进行深度优先遍历且节点能访问多次(即一个节点可以有不同的分支访问多次)。遍历过程中Hive记录当前遍历分支已访问的节点。对于访问的不同节点进行相应的处理:
(1) TS节点
&TS节点为算子DAG的起始节点,这时Hive生成一个MapRedTask对象。同时将该MapRedTask存放在遍历上下文中,供后面读取。
(2)遇到第一个RS节点
在当前遍历路径上遇到第一个RS节点时,表明这个一个map-reduce过程。这时从上下文中读取MapRedTask对象,然后调用GenMapRedUtils#initPlan方法对MapRedTask的work字段(MapredWork类型)进行初始化。初始化主要对MapredWork的MapWork和ReduceWork对象进行相应的字段填充。
在有JOIN 算子的情况下,情况会复杂一些。有JOIN的情况下,会有多个RS算子分支对应到一个JOIN算子,这些RS算子分支属于同一个Map过程,需要将这些RS分支合并到一个Map过程中(存储在MapWork的aliasToWork结构中)。Hive会记录节点和MapRedTask的对应关系的映射表。在访问到RS算子时,先从映射关系表中获取Join算子对应的MapRedTask任务,如果该任务不存在,说明这是第一个访问的RS分支,这是按照上面的方法调用GenMapRedUtils#initPlan方法进行work字段的初始化,同时将MapRedTask对象存放在映射关系表中;否则,说明该RS分支不是第一个被访问的RS分支,这时调用GenMapRedUtils.joinPlan进行分支合并,将该RS分支添加到MapRedTask任务的MapWork#aliasToWork结构中。
(3)遇到第n个RS节点(n&=2)
&如果该RS节点是当前访问路径下的第n个(n&=2)RS算子,这时候进行算子DAG***,将算子DAG从当前RS算子处***成两部分,RS前面的部分属于第n-1个RS对应的MapRedTask,同时给该Task补充一个FS算子,用于将任务的输出数据写入临时文件;RS算子以及其后面的部分属于当前RS算子的MapRedTask(这时会新生成一个MapRedTask对象),同时在RS算子前面补充一个TS算子,用于读取前面MapRedTask的输出。
(4) 遇到Union节点
前面讲过,union节点的任务生成分两种情况,如果该union节点的至少有一个分支为map-reduce类型,那么Hive将map-reduce类型分支从算子DAG中***出来,该分支属于该分支对应的MapRedTask任务,并给分支添加FS算子用于输出数据。union的输入端则添加TS算子用于读取该分支的数据。union分支全是map-only类型的情况下,不进行DAG***。
(5) 遇到FS节点
FS节点表示分支的结束,如果该分支是map-only类型,那么这里将调用GenMapRedUtils.setTaskPlan方法进行MapredWork数据结构的初始化。setTaskPlan方法和initPlan的区别在于initPlan方法还包含对ReduceWork结构的初始化,而setTaskPlan只对MapWork进行初始化。
如果当前分支对应HiveQL的insert分支,这里会生成对应的MoveTask将HiveQL语句的执行结果拷贝到目标数据源中。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:633次
排名:千里之外AOA《怦然心动》舞蹈镜面***教学(TSDANCE) - 练习室舞蹈版&舞蹈教学合辑 - 腾讯视频
登录之后可以领V币换礼品喔~
专辑总数据(共63个视频)
今日播放量:635
总播放量:310.2万
通用代码支持视频在iPhone/iPad/Android上播放
扫码分享到微信
扫描二维码随身看视频
立即下载腾讯视频APP
请根据您的设备选择下载版本
class="btn_next "
r-on="{click: onNext}"
r-show="{page
?1,468,632
?1,191,272