|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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通