MapReduce数据流

整个MapReduce总体可以分为以下五个阶段:

一、input

该阶段指定输入要处理的文件,mapreduce框架提供TextInputFormate、SequenceInputFormate、HBaseInputFormate,默认使用TextInputFormate,开发者也可以实现自己的inputformate,但仅限于java。读取数据后,将原始文件split成不同的切片,对于HDFS文件,默认1个block切成一个split,对于跨行的切分,被切分的整行被分配给上一个split,然后将切分后的切片解析为kv对,以wordcount为例,key为每行文本的偏移量,value为每行文本内容。

二、map

该阶段处理input阶段生成的kv对,开发者可用java或者hadoop streaming接口实现业务逻辑,通常继承Mapper类,形参为map阶段的输入和输出kv对泛型,mapreduce实现了自己的数据类型,比如object,text,intWritable等,开发者需要重写mapper方法实现自己的业务逻辑,以wordcount为例,将每行的文本切分成单个单词,放入数组,然后在for循环中用context.write()生成并输出新的kv对。

三、shuffle

输出的kv对被写到ring buffer中,当达到一定阈值时flush到磁盘,该过程会进行归并排序,即相同的key的kv对会归并到一起,随着flush出的文件数量增多,小文件会合并(按照归并排序的原则合并),这个过程中也实现了partitioner,即决定每个kv对发给那个reducer处理,默认partitioner方式为hash key MOD Reduce task数目,开发者也可以用java实现自己的业务逻辑,比如制定相同的url的kv对发给相同的reduce task处理,比如制定某个年龄段的kv对分发给特定的reducer处理,实现分类统计不同年龄段的信息;用户自定义partitioner需要在mapper端、partitioner端、reducer端都开发相应代码。在这个过程中,也会进行local combiner,即将部分相同key值得value先合并,从而减小网络IO和磁盘IO的压力;但对于有些业务场景不可用local combiner,比如求平均数。

此外,落盘的kv文件还会被压缩,从而降低网络IO和磁盘IO。(问题:压缩是否默认开启???)

四、reduce

开发者可以通过java和hadoop streaming接口实现这一阶段自定义的用户逻辑,将上一阶段落盘的kv对文件远程拉倒计算节点上,继承Reducer类,重写reduce方法,实现业务逻辑。以wordcount为例,将key相同的kv对的value求和。

五、output

mapreduce提供了TextOutputFormate、SequenceOutputFormate、HBaseOutputFormate,开发者也可用java实现自定义的outputformate。


容错性:

task周期性向MRAppMaster发送心跳,一旦任务挂掉,MRAppMaster重新向RM申请资源并重试task,默认重试次数为4.

推测执行机制:对于运行速度远低于平均运行速度的task,为其启动备份任务,哪个先完成,则以哪个为准。推测执行机制不是用的场景:数据严重倾斜和向数据库写数据的场景。


其他:

可配置最多失败map/reducer容忍数

可配置map task/reduce task是否开启推测执行机制

可配置最小split大小,从而控制map数量


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值