请说下MR中Map Task的⼯作机制

提问者:帅平 问题分类:面试刷题
请说下MR中Map Task的⼯作机制
1 个回答
唯宠她
唯宠她
inputFile通过split被切割为多个split⽂件,通过Record按⾏读取内容给map(⾃⼰写的处理逻辑的⽅法) ,数据被map处理完之后交给OutputCollect收集器,对其结果key进⾏分区(默认使⽤的hashPartitioner),然后写⼊buffer, 每个map task 都有⼀个内存缓冲区 (环形缓冲区),存放着map的输出结果,当缓冲区快满的时候需要将缓冲区的数据以⼀个临时⽂件的⽅式溢写到磁盘,当整个map task 结束后再对磁盘中这个maptask产⽣的所有临时⽂件做合并,⽣成最终的正式输出⽂件,然后等待reduce task的拉取。
发布于:2年前 (2023-02-16) IP属地:四川省
白鸥掠海
白鸥掠海
1. 读取数据组件 InputFormat (默认 TextInputFormat) 会通过 getSplits ⽅法对输⼊⽬录中的⽂件进⾏逻辑切⽚规划得到 block,有多少个 block就对应启动多少个 MapTask。
2. 将输⼊⽂件切分为 block 之后,由 RecordReader 对象 (默认是LineRecordReader) 进⾏读取,以 \n 作为分隔符, 读取⼀⾏数据, 返回 <key,value>, Key 表示每⾏⾸字符偏移值,Value 表示这⼀⾏⽂本内容。
3. 读取 block 返回 <key,value>, 进⼊⽤户⾃⼰继承的 Mapper 类中,执⾏⽤户重写的map 函数,RecordReader 读取⼀⾏这⾥调⽤⼀次。
4. Mapper 逻辑结束之后,将 Mapper 的每条结果通过 context.write 进⾏collect数据收集。在 collect 中,会先对其进⾏分区处理,默认使⽤ HashPartitioner。
5. 接下来,会将数据写⼊内存,内存中这⽚区域叫做环形缓冲区(默认100M),缓冲区的作⽤是 批量收集 Mapper 结果,减少磁盘 IO 的影响。我们的 Key/Value 对以及 Partition 的结果都会被写⼊缓冲区。当然,写⼊之前,Key 与 Value 值都会被序列化成字节数组 。
6. 当环形缓冲区的数据达到溢写⽐列(默认0.8),也就是80M时,溢写线程启动, 需要对这80MB 空间内的 Key 做排序 (Sort) 。排序是 MapReduce 模型默认的⾏为,这⾥的排序也是对序列化的字节做的排序。
7. 合并溢写⽂件,每次溢写会在磁盘上⽣成⼀个临时⽂件 (写之前判断是否有 Combiner),如果 Mapper 的输出结果真的很⼤,有多次这样的溢写发⽣,磁盘上相应的就会有多个临时⽂件存在。当整个数据处理结束之后开始对磁盘中的临时⽂件进⾏ Merge 合并,因为最终的⽂件只有⼀个写⼊磁盘,并且为这个⽂件提供了⼀个索引⽂件,以记录每个reduce对应数据的偏移量。
发布于:2年前 (2023-02-16) IP属地:四川省
我来回答