hadoop学习;datajoin;chain签名;combine()


hadoop有种简化机制来管理job和control的非线性作业之间的依赖,job对象时mapreduce的表现形式。job对象的实例化可通过传递一个jobconf对象到作业的构造函数中来实现。

x.addDeopendingJob(y)意味着x在y完成之前不会启动。

鉴于job对象存储着配置和依赖信息,jobcontrol对象会负责监管作业的执行,通过addjob(),你可以为jobcontrol添加作业,当所有作业和依赖关系添加完成后,调用jobcontrol的run()方法,生成一个线程提交作业并监视其执行,有allFinised(),getFailedJobs()方法

hadoop引入chainMapper和chainReducer来简化预处理和后处理

driver会先设置“全局”jobconf对象,包含作业名,输入路径和输出路径等,它一次性添加所有步骤,然后按顺序执行

ChainMapper.addMapper()方法的签名来详细了解如何一步步的链接作业


byvalue用于判断是否是值传递,若为false则采用引用传递,初始mapper的输出内容保存在内存中,如果后期不再调用传入的值,可以这样,效率高,一般设为true


reduce函数接收输入数据,并对其值进行交叉乘积,reduce生成这些值的所有合并结果。交叉乘积得到的每个合并结果被送入函数combine()(不是combiner)生成一个输出记录,对于任意特定的合并,combine可以选择不输出。交叉乘积的本质确保了combine看到的记录都有相同的连接键

在解释如何使用DatajoingMapperBase和DataJoinReduceBase之前,你需要了解在代码通篇所使用的一个抽象数据类TaggedMapOutput(用Text标签封装记录的数据类型)

在数据流的描述中,mapper输出的包带有一个组键和一个被标签记录的值,datajoin软件包指定组键为text类型,而值为TaggerMapOutput类型,它具体实现了getTag()和setTag(Text Tag)方法

作为mapper的输出,TaggerMapOutput必须是Writable类型,因此我们的子类必须实现readFile()和write()方法

DataJoinMapper执行所有的封装,指定了三个可以填充的抽象方法

generateInputTag在map任务开始前调用,来为这个map任务所处理的所有记录指定一个全局标签

如果横跨几个文件,可以用它们的前缀作为标签

完成map任务初始化后,为每个记录调用DataJoinMapperBase的map()方法。里面调用generateTaggedOutput()和generateGroupKey()方法

原则上,在同一文件中,不同的记录可以用不同的标签,在标准情况下,我们希望一个标签代表一个数据源,它早先由generateInputTag()计算好并存在this.InputTag中


相关内容