MapReduce(二)Mapper

原文链接:
https://data-flair.training/blogs/hadoop-mapper-in-mapreduce/

MapReduce(二)Mapper

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。

MapReduce(二)Mapper

上一篇:CentOS8 中 Samba环境搭建(满足Linux和Windows系统之间文件共享传输)


下一篇:SptingBoot报错处理:required a bean of type 'XXX' that could not be found、@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})注解作用、@Mapper和@Repository注解的区别