MapReduce程序运行流程

2016年4月6日10:34:10

MapReduce程序运行流程

参考:https://blog.csdn.net/alex_bean/article/details/51469630

作者:数据分析玩家

    一直以来虽然都在学习hadoop,也打算写一篇关于MapReduce程序运行流程的博客文章,但是一直没有时间,今天抽空写一篇,本篇文章尽量写的详细,如有问题请读者留言。

    为了方便理解,先用作图的方式进行阐述:

        

MapReduce程序的执行过程分为两个阶段:Mapper阶段和Reducer阶段。

需要说明的shi:group by在map阶段和reduce阶段的分全过程都会发生.

排序涉及到的具体函数:

	1.order
		通过一个reduce实现数据的全排序.

		select * from orders order by price desc ;				//全排序

	2.sort
		部分排序,等价于排序对比器。(在每个reduce内部进行局部排序,按照用户指定的字段进行排序.)
		set hive.auto.convert.join=true ;
		set mapreduce.input.fileinputformat.split.minsize=70 ;
		set mapreduce.input.fileinputformat.split.maxsize=70 ;
		set mapreduce.job.reduces=2 ;
		
		//
		create table res as SELECT a.id aid,a.name aname,b.id bid,b.price bprice FROM custs a left outer JOIN orders b on a.id = b.cid sort by aname desc;
		//
		select * from orders sort by id desc ;					//转成mr,对reduce内部按照id进行降序排序。

	3.distribute by
		分发,控制分区过程,按照指定字段分区,单独使用不保证reduce
		数据有序的,和sort by组合使用,必须位于Sort by之前.
		create table res2 as select * from orders distribute by cid sort by id desc ;
		
		//使用case when then end控制分区字段
		create table res3  as select * from orders distribute by case when cid < 3 then 0 else 1 end sort by id desc ;

	4.cluster by(本身是一种快捷方式.)
		快捷方式,等价于distribute by a sort by a ;
		不支持desc 和 asc。
		select * from orders clutser by id ;

其中Mapper阶段可以分为6个步骤:

第一阶段:先将HDFS中的输入文件file按照一定的标准进行切片,默认切片的类为FileInputFormat,通过切片输入文件将会变成split1、split2、split3……;随后对输入切片split按照一定的规则解析成键值对<k1,v1>,默认处理的类为TextInputFormat。其中k1就是我们常说的起始偏移量,v1就是行文本的内容。

第二阶段:调用自己编写的map逻辑,将输入的键值对<k1,v1>变成<k2,v2>。在这里要注意:每一个键值对<k1,v1>都会调用一次map函数。

第三阶段:按照一定的规则对输出的键值对<k2,v2>进行分区:分区的规则是针对k2进行的,比如说k2如果是省份的话,那么就可以按照不同的省份进行分区,同一个省份的k2划分到一个区。注意:默认分区的类是HashPartitioner类,这个类默认只分为一个区,因此Reducer任务的数量默认也是1.

注意:如reduce要求得到的是全局的结果,则不适合分区!

第四阶段:对每个分区中的键值对进行排序。注意:所谓排序是针对k2进行的,v2是不参与排序的,如果要让v2也参与排序,需要自定义排序的类,具体过程可以参看博主文章。

第五阶段:排序完之后要进行分组,即相同key的value放到同一个集合当中,例如在WordCount程序中的<hello,{1,1}>执行的就是这个步骤,但是要注意:分组也是针对key进行的,经过分组完之后,就得到了我们熟悉的键值对<k2,v2s>.

第六阶段(可选):对分组后的数据进行归约处理。通过归约处理键值对<k2,v2s>变成了<k2,v2>,经过这一阶段,传送到Reducer任务端的数据量会减少。但是规约的使用是有条件的,所以这一阶段是可以选择的。

上面的三四五:分区排序分组三个阶段可以归结为shuffle阶段,在shuffle阶段对键值对<k2,v2>处理后变成了<k2,v2s>.

Mapper任务处理完之后,就进入到了我们的Reducer阶段:

Reducer任务的执行过程可以分为3个阶段:

第一阶段:对多个Mapper任务的输出,按照不同的分区,通过网络拷贝到不同的Reducer节点上进行处理,将数据按照分区拷贝到不同的Reducer节点之后,对多个Mapper任务的输出在进行合并,排序。例如:在WordCount程序中,若一个Mapper任务输出了<hello,{1,1}>,另外一个Mapper任务的输出为<hello,{1,1,1}>,经过在次合并之后变为<hello,{1,1,1,1,1}>.

第二阶段:调用自己的reduce逻辑,将键值对<k2,v2s>变为<k3,v3>.在这里注意:每一个键值对<k2,v2s>都会调用一次reduce函数。

第三阶段:将Reducer任务的输出保存到指定的文件中。

    经过上面的具体分析之后,我们在通过WordCount业务进行具体的说明,假设输入文件的内容为:

在这里我们通过第一条记录“helloyou”进行具体的说明MapReduce程序的执行过程,注:默认一个分区,整个过程处理如下:

到此,MapReduce程序的流程大致就讲述完了,其实从宏观上来看,无非就是对键值的不断处理。

                                                                            

                                                                    2016年4月6日13:41:22

 

 

 

 

 

 

 

 

 

 

 

 

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只懒得睁眼的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值