MapReduce工作流

当处理变得非常复杂的时候,复杂性通过更多MapReduce任务,而不是更多的map和reduce函数来适应。换句话说,作为一个经验规则,考虑添加更多的jobs,而不是添加更多的复杂性给jobs。

 

对于更复杂的问题,值得考虑高层语言来代替MapReduce,像是Pig,Hive或者是Cascading。一个显而易见的好处是,这把你从把问题翻译成MR任务的过程中解放出来,允许你精力放在本身算法上。

 

将问题分解为MapReduce任务

 

让我们看一个更加复杂的问题,我们将它转换为一个MapReduce工作流。

 

假如我们想要找出每天和每个气象站的平均最大记录温度。具体来说,要计算029070-99999气象站的平均最大每日温度,也就是说,在1月1号,我们获取到这个气象站的在1901-01-01,1902-01-01等等,直到2000-01-01的日最高气温的平均值。

 

我们怎样通过MapReduce来计算这个呢?计算的分解通常自然地分成两个阶段:

 

1. 为每一个气象站-日期对算出日最高气温。MapReduce在这个情况下就是年最高气温程序的一个变体,出了这里的键变成了气象站-日期对,而不是仅仅是年。

 

2. 为气象站-日-月份键计算日最高气温的最大值。这个mapper从前一个job的输出获取输入(气象站-日期,最大温度)记录,并把它转化为去除年份元素的记录(气象站-日-月份)。reduce函数然后获取到每个气象站-日-月份键的最高气温平均值。

 

第一个阶段的输出看上去像这个样子(对我们感兴趣的月份):

 

029070-99999    19010101    0

029070-99999    19020101    -94

 

前两个字段形成键,最后一列是这个气象站当日所有气温记录中的最高气温。第二个阶段在把年份去掉之后,按照日期和月份聚合平均这些日最高值:

 

029070-99999    0101    -68

 

这将被解释说成是:上个世纪气象站029070-99999在1月1号的日最高值的平均值为-6.8摄氏度。

 

可以在一个MR阶段完成这个计算,但是在程序员这边会要求更多的程序员工作。

 

拥有更多(但是更简单)的MR阶段,这样会得到更可组合的和更易维护的mappers和reducers。16章的案例研究涉及到真实世界中用MR解决问题的实例,并且在每个实例中,数据处理任务是使用两个或者多个MR任务来实现的。那一章的细节对于感受怎么将处理的问题分解为MR流是非常有借鉴意义的。

 

可以把map和reduce做的比我们以前做的更具组合性。一个mapper通常做的是输入格式的解析、推算(获取相应的字段)和过滤(去除不感兴趣的记录)。迄今你所见到的mappers,我们在一个mapper中实现了所有这些功能。然而,可以将这些分成不同的mapper并且用Hadoop的ChainMapper库类将它们链起来。结合一个ChainReducer,你可以在一个MapReduce任务里运行一系列的mappers,接着是一个reducer和其他mappers的链。

 

运行独立的任务

 

当在MapReduce流中有一个以上的job时,问题来了:你怎样安排这些任务按照顺序执行?有几种方法,最重要的考察点是你是否有一个线性的任务链,或者是一个更复杂的任务有向非循环图。

 

对于线性链,最简单的方法就是一个接着一个任务运行,在一个任务完成之后,才开始运行另一个:

 

 

JobClient.runJob(conf1);

JobClient.runJob(conf2);

 

 

如果一个任务失败,runJob()方法将抛出一个IOException,所以管道中的后来的任务不会执行。基于你的应用,你可能想要不活这个异常并清理前面任务产生的任何的中间数据。

 

对于比线性链更复杂的情况,有库可以帮助协调你的工作流。最简单的就是org.apache.hadoop.mapred.jobcontrol包:JobControl类。JobControl的一个实例代表一个即将执行的任务图。你添加任务配置,然后告诉JobControl实例这些任务之间的依赖。你在一个线程里运行这个JobControl,然后它会根据依赖关系顺序执行这些任务。你可以获得执行进程,并且在这些任务完成的时候,你可以查询所有任务的状态和相关的错误。如果一个任务失败,JobControl将不会执行依赖于它的任务。

 

Oozie

 

不同于JobControl运行在提交任务的客户端机器,Oozie作为一个服务器运行,一个客户端提交一个工作流到这个服务器。在Oozie里,一个工作流是一个动作节点和控制流节点的有向无环图。一个动作节点做工作流任务,像是在HDFS中移动文件,运行一个MR任务或者是一个Pig任务。一个控制流节点通过允许诸如条件逻辑或者并行执行的方式来管理工作流执行。当工作流完毕,Oozie可以做一个HTTP回调给客户端来通知它工作流状态。也可以在工作流进入或者退出一个动作节点时获取回调。

 

Oozie允许失败的工作流冲任意的点重新运行。这对于处理临时性的错误非常有用。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值