hadoop 面试
MapTask工作机制
-
Read阶段:假设待读取数据为200m,客户端对数据先进行切片划分,然后提交资源给yarn,资源包含(切片信息,jar包,xml配置文件),然后yarn会开启一个MrAppMaster,由MrAppMaster根据切片信息计算出要开启2个MapTask,MapTask通过InputFormat获得的RecordReader,从输入InputSplit中解析出一个个key/value
-
Map阶段:将解析到的数据返回给Mapper,然后交由用户自定义map方法,对数据进行逻辑处理
-
Collect收集阶段:处理过后的数据,首先会进入入到分区方法,把数据标记好分区,然后把数据发送到环形缓冲区
(1) 环形缓冲区大小100m,一侧存索引,一侧存数据
(2)数据是以分区的形式进行存储
(3)数据到达80%时会进行反向溢写
(4)溢写之前会对数据进行排序,按照key的索引进行字典排序,排序的手段为快排
底层:
① 当数据经过逻辑处理完后,一般会调用OutputCollector.collect()输出结果。在该函数内部,它会将生成的key/value分区(调用Partitioner),然后写入一个环形内存缓冲区中
②分区数据的元信息写到内存索引数据结构SpillRecord中,其中每个分区的元信息包括在临时文件中的偏移量、压缩前数据大小和压缩后数据大小。如果当前内存索引大小超过1MB,则将内存索引写到文件output/spillN.out.index中
③具体的排序方式是,先按照分区编号Partition进行排序,然后按照key进行排序。经过排序后,数据以分区为单位聚集在一起,且同一分区内所有数据按照key有序
- Spill(溢写)阶段:当环形缓冲区满后,MapTask会将数据写到本地磁盘上,生成一个临时文件
底层:
按照分区编号由小到大依次将每个分区中的数据写入任务工作目录下的临时文件output/spillN.out(N表示当前溢写次数)中
- Merge阶段:溢写完成之后,会产生大量的小文件,然后MapTask对所有临时小文件进行归并排序,对溢写的文件也可以进行Combiner操作,前提是汇总操作,求平均值不行,最后将文件按照分区存储到磁盘,等待Reduce端拉取
底层:
① MapTask以分区为单位进行合并。对于某个分区,它将采用多轮递归合并的方式。每轮合并mapreduce.task.io.sort.factor(默认10)个文件,并将产生的文件重新加入待合并列表中,对文件排序后,重复以上过程,直到最终得到一个大文件,并保存到文件output/file.out中,同时生成相应的索引文件output/file.out.index
② 每个MapTask最终只生成一个数据文件
ReduceTask工作机制
-
Copy阶段:每个ReduceTask去拉取Map端对应分区的数据,拉取过来的数据先存储到内存中,内存不够了,再存储到磁盘
-
Merge阶段:采用归并排序将内存和磁盘中的数据都进行排序。在进入Reduce方法前,可以对数据进行分组操作
注意:
由于各个MapTask已经对自己处理的数据进行了局部排序,因此ReduceTask只需对所有数据进行一次归并排序即可
- Reduce阶段:排序后,相同的key进入reduce方法,然后向外写数据