原文链接:
https://data-flair.training/blogs/hadoop-mapper-in-mapreduce/
1、什么是Mapper?
Mapper任务处理每一个输入的record然后生成一个新的key value键值对。这个键值对可以和输入的键值对完全不同。在mapper任务中,输出是key value对的集合。在每个mapper任务输出结果之前,输出会被根据分区和排序。This partitioning specifies that all the values for each key are grouped together. MapReduce框架会为每个InputFormat生成的InputSplit创建一个map任务。
Mapper仅仅理解key value键值对的数据,所以在传递数据给mapper之前,数据应该要首先转换成key value对。
2、key value对是如何在Hadoop中生成的?
- InputSplit – 它是数据的逻辑视图.
- RecordReader – 它和InputSplit通信然后将数据转换成适合mapper读取的key value对。默认情况下,它会使用TextInputFormat来转换key value对。
3、Mapper是如何工作的?
InputSplits 为mapper将实质的block(HDFS的每个文件都是由若干个块组成的)转化成逻辑视图,如果要读取100MB的文件,需要有两个InputSplit(默认是64MB一个块)。MapReduce会为每个block会创建一个InputSplit,同时为每一个InputSplit创建一个RecordReader和mapper。
InputSplit并非依赖block数,我们能调整split的数量,通过设置参数mapred.max.split.size即可。
RecordReader的职责是将读到的数据转化称为key value对。Byte offset (unique number) is assigned to each line present in the file by RecordReader。紧接着,这个key value对会发送给mapper。mapper的输出被称为中间数据。
4、计算map任务的数量
一般情况下,输入文件有多少个块就有多少个map任务。对于map,一个比较好的并行度大约是10-100 maps/node,尽管有些对CPU时间要求少的map任务甚至可以达到300maps/node。因为task的启动需要一些时间,所以最好是让map至少执行1分钟。
举个例子,如果一个block是128MB,我们知道输入数据有10TB,这个情况我们会有82,000个map。因此,InputFormat决定了map的数量。因此,#mapper = {(total data size)/ (input split size)}, 再举个例子,如果数据是1TB且InputSplit的大小是100MB,那么#mapper = (1000*1000)/100= 10,000。