|NO.Z.00033|——————————|BigDataEnd|——|Hadoop&MapReduce.V06|——|Hadoop.v06|MapReduce原理分析之MapTask运行机制|并行度|

一、MapTask运行机制详解:MapTask流程
### ---  MapReduce原理分析

~~~     [MapReduce原理分析之MapTask运行机制]
~~~     [MapReduce原理分析之MapTask并行度]
### ---  详细步骤:

~~~     首先,读取数据组件InputFormat(默认TextInputFormat)
~~~     会通过getSplits方法对输入目录中文件进行逻辑切片规划得到splits,
~~~     有多少个split就对应启动多少个MapTask。split与block的对应关系默认是一对一。
~~~     将输入文件切分为splits之后,由RecordReader对象(默认LineRecordReader)进行读取,
~~~     以\n作为分隔符,读取一行数据,返回<key,value>。Key表示每行首字符偏移值,
~~~     value表示这一行文本内容。
~~~     读取split返回<key,value>,进入用户自己继承的Mapper类中,执行用户重写的map函数。
~~~     RecordReader读取一行这里调用一次。
~~~     map逻辑完之后,将map的每条结果通过context.write进行collect数据收集。
~~~     在collect中,会先对其进行分区处理,默认使用HashPartitioner。
~~~     # MapReduce提供Partitioner接口,
~~~     它的作用就是根据key或value及reduce的数量来决定当前的这对输出数据
~~~     最终应该交由哪个reduce task处理。默认对key hash后再以reduce task数量取模。
~~~     默认的取模方式只是为了平均reduce的处理能力,如果用户自己对Partitioner有需求,
~~~     可以订制并设置到job上。
~~~     # 接下来,会将数据写入内存,内存中这片区域叫做环形缓冲区,
~~~     缓冲区的作用是批量收集map结果,减 少磁盘IO的影响。
~~~     我们的key/value对以及Partition的结果都会被写入缓冲区。
~~~     当然写入之前,key与value值都会被序列化成字节数组。
~~~     # 环形缓冲区其实是一个数组,数组中存放着key、value的序列化数据和key、
~~~     value的元数据信息,包括partition、key的起始位置、value的起始位置以及value的长度。
~~~     环形结构是一个抽象概念。
~~~     # 缓冲区是有大小限制,默认是100MB。当map task的输出结果很多时,就可能会撑爆内存,
~~~     所以需要在一定条件下将缓冲区中的数据临时写入磁盘,然后重新利用这块缓冲区。
~~~     这个从内存往磁盘写数据的过程被称为Spill,中文可译为溢写。
~~~     这个溢写是由单独线程来完成,不影响往缓冲区写map结果的线程。
~~~     溢写线程启动时不应该阻止map的结果输出,所以整个缓冲区有个溢写的比例spill.percent。
~~~     这个比例默认是0.8,也就是当缓冲区的数据已经达到阈值(buffer size * spillpercent = 100MB * 0.8 = 80MB),
~~~     溢写线程启动,锁定这80MB的内存,执行溢写过程。Maptask的输出结果还可以往剩下的20MB内存中写,互不影响。
~~~     # 当溢写线程启动后,需要对这80MB空间内的key做排序(Sort)。排序是MapReduce模型默认的行为!
~~~     # 如果job设置过Combiner,那么现在就是使用Combiner的时候了。
~~~     将有相同key的key/value对的value加起来,减少溢写到磁盘的数据量。
~~~     Combiner会优化MapReduce的中间结果,所以它在整个模型中会多次使用。
~~~     # 那哪些场景才能使用Combiner呢?从这里分析,Combiner的输出是Reducer的输入,
~~~     Combiner绝不能改变最终的计算结果。
~~~     Combiner只应该用于那种Reduce的输入key/value与输出key/value类型完全一致,
~~~     且不影响最终结果的场景。比如累加,最大值等。Combiner的使用一定得慎重,
~~~     如果用好,它对job执行效率有帮助,反之会影响reduce的最终结果。
~~~     # 合并溢写文件:每次溢写会在磁盘上生成一个临时文件(写之前判断是否有combiner),
~~~     如果map的输出结果真的很大,有多次这样的溢写发生,磁盘上相应的就会有多个临时文件存在。
~~~     当整个数据处理结束之后开始对磁盘中的临时文件进行merge合并,因为最终的文件只有一个,
~~~     写入磁盘,并且为这个文件提供了一个索引文件,以记录每个reduce对应数据的偏移量。
~~~     # 至此map整个阶段结束!!
二、MapTask的一些配置
### --- 官方参考地址

https://hadoop.apache.org/docs/r2.9.2/hadoop-mapreduce-client/hadoop-mapreduceclient-core/mapred-default.xml
三、MapTask的并行度
### --- MapTask并行度思考

~~~     MapTask的并行度决定Map阶段的任务处理并发度,从而影响到整个Job的处理速度。
~~~     思考:MapTask并行任务是否越多越好呢?哪些因素影响了MapTask并行度?
### --- MapTask并行度决定机制

~~~     数据块:Block是HDFS物理上把数据分成一块一块。
~~~     切片:数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储。

 
 
 
 
 
 
 
 
 

Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
                                                                                                                                                   ——W.S.Landor

 

 

posted on   yanqi_vip  阅读(17)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示