博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
高阶MapReduce_1_链接多个MapReduce作业
阅读量:6342 次
发布时间:2019-06-22

本文共 3064 字,大约阅读时间需要 10 分钟。

链接MapReduce作业

1.      顺序链接MapReduce作业

顺序链接MapReduce作业就是将多个MapReduce作业作为生成的一个自己主动化运行序列,将上一个MapReduce作业的输出作为下一个MapReduce作业的输入。

MapReduce作业的链接就类似于Unix 的管道:

mapreduce – 1 | mapreduce – 2 | mapreduce – 3 | ···

                  顺序链接MapReduce作业的执行过程,就是driver为MapReduce作业创建一个带有配置參数的JobConf对象,并将该对象传递给JobClient.runJob()来启动这个作业。而当JobClient.runJob()执行到作业结尾处时会被阻止,MapReduce作业的链接就会在这个时候调用另外一个MapReduce作业的driver。每一个作业的driver都必须创建一个新的JobConf对象。并将其输入路径设置为前一个作业的输出路径。

2.      具有复杂依赖的MapReduce链接

假设两个或者多个MapReduce作业之间存在运行的先后顺序关系的话。那么这个时候就不能用顺序链接。

Hadoop怎样处理这样的MapReduce作业之间的关系的呢,Hadoop通过Job和JobControl类来管理这样的(非线性)作业之间的依赖。

Job对象是MapReduce作业的表现形式。

Job对象的实例化通过传递一个JobConf对象到作业的构造函数中来实现。也就是说通过public Job(JobConf jobConf){}来实现实例化一个MapReduce作业。Job通过Job1.addDependingJob(Job2)来维护作业间的依赖关系这也意味着Job1在Job2完毕之前是不会启动的。

JobControl对象负责管理并监视作业Job的运行。加入作业:addJob()方法。而当全部作业和依赖关系加入完毕之后,调用JobControl的run()方法。就会生成一个专门提交作业并监视作业运行的线程,这样就实现了JobControl对Job的管理和监视。

3.      预处理和后处理阶段的链接

Hadoop关于预处理和后处理作业的链接提供了两种解决方式。

方案一:为预处理和后处理步骤各自编写一个MapReduce作业。并将其链接起来。在这些步骤中能够使用IdentityReducer。而在此过程中每个步骤的中间结果都须要占用I/O和存储资源,所以这样的方案是很低效的,普通情况下Hadoop是不建议使用的。

方案二:自己组合mapper和reducer,也就是说自己写mapper去预先调用全部的预处理步骤,再让reducer调用全部的后处理步骤。在Hadoop中呢,是引入了ChainMapper和ChainReducer类来简化预处理和后处理的构成,生成的作业表达式类似于:MAP+ | REDUCE | MAP+   通过依照这个顺序来运行运行多个mapper来预处理数据,并在reduce之后可选的地按序运行多个mapper来做数据的后处理。

比如:有4个mapper作业和一个reduce作业,顺序例如以下:

Map1 | Map2| Reduce | Map3 | Map4

在这个组合中呢。我们就能够把Map2和Reduce来作业MapReduce作业的核心,把Map1作业预处理步骤,把Map3和Map4作业后处理步骤。

... conf.setJobName("chain"); conf.setInputFormat(TextInputFormat.class); conf.setOutputFormat(TextOutputFormat.class);  JobConf mapAConf = new JobConf(false); ...ChainMapper.addMapper(conf, AMap.class, LongWritable.class, Text.class,Text.class, Text.class, true, mapAConf); JobConf mapBConf = new JobConf(false); ...ChainMapper.addMapper(conf, BMap.class, Text.class, Text.class,LongWritable.class, Text.class, false, mapBConf); JobConf reduceConf = new JobConf(false); ...ChainReducer.setReducer(conf, XReduce.class, LongWritable.class, Text.class,Text.class, Text.class, true, reduceConf); ChainReducer.addMapper(conf, CMap.class, Text.class, Text.class,LongWritable.class, Text.class, false, null); ChainReducer.addMapper(conf, DMap.class, LongWritable.class,Text.class, LongWritable.class, LongWritable.class, true, null); FileInputFormat.setInputPaths(conf, inDir);FileOutputFormat.setOutputPath(conf, outDir); ... JobClient jc = new JobClient(conf); RunningJob job =jc.submitJob(conf); ...

 

 

值得注意的是:在ChainMapper.addMapper()方法的签名中:

publicstatic <k1,v1,k2,v2> void addMapper(JobConf job,

                      Class<?

extends Mapper<k1,v1,k2,v2> kclass,

                       Class<? extends k1> inputKeyClass,

                       Class<? extends v2> inputValueClass,

                       Class<?

extends k2> outputKeyClass,

                       Class<? extends v2> outputValueClass,

                       boolean byValue,

                       JobConf mapperConf)

            第8个參数为boolean byValue,第一个和最后一个是全局和本地jobconf对象,第二个是mapper类,接下来四个mapper使用的类。

byValue參数:true表示值传递,false表示引用传递。

在标准Mapper中,<k2,v2>是採用值传递被洗牌到不同节点上(传递副本),可是眼下我们能够将mapper与还有一个链接,就在统一个JVM线程运行,就能够採取引用传递。可是一般来说,map1在调用context.write()写出数据后,这些数据是按约定不会更改的。

假设引用传递就会破坏约定。可是使用引用传递会提高效率。假设确定数据不会被破坏。能够设置为false,一般安全起见,设置为true就可以。。

 

 

转载地址:http://atkla.baihongyu.com/

你可能感兴趣的文章
艰困之道中学到的经验教训
查看>>
互联网生态建设落地五大挑战——保险科技生态建设 ...
查看>>
进行短视频app开发工作时,可以加入它来保护青少年 ...
查看>>
25G DAC无源高速线缆和25G光模块之间的区别
查看>>
乐乐茶完成近2亿元Pre-A轮融资,祥峰投资领投
查看>>
clickhouse修改时区
查看>>
CSS_定位
查看>>
第二十四章:页面导航(六)
查看>>
IP_VFR-4-FRAG_TABLE_OVERFLOW【cisco设备报错】碎片***
查看>>
Codeforces Round #256 (Div. 2) D. Multiplication Table 【二分】
查看>>
ARM汇编指令格式
查看>>
HDU-2044-一只小蜜蜂
查看>>
HDU-1394-Minimum Inversion Number
查看>>
京东基于Spark的风控系统架构实践和技术细节
查看>>
什么时候使用CountDownLatch
查看>>
C#之MemberwiseClone与Clone
查看>>
Android性能优化之利用Rxlifecycle解决RxJava内存泄漏
查看>>
转: 如何为你的开源项目选择一个合适的开源协议?
查看>>
Atitit 记录方法调用参数上下文arguments
查看>>
webstorm常用功能FTP,及常用快捷键
查看>>