如果我有一个1000行的数据文件…我在我的map
方法中使用TextInputFormat
用于我的单词计数程序。因此,数据文件中的每一行都将被视为一个split
。
一个RecordReader将把每一行(or split
)作为(Key, Value)
对提供给map()
方法。
根据我的理解…每行或每条记录执行1000次map()
方法。
意味着有多少Mappers
将运行??对不起,我搞糊涂了。map()
方法只是mapper的一个实例。那么每个Mapper任务有多少个地图实例是基于什么来决定的??
注意:当我执行WordCount MapReduce
程序1000行数据…我看到Mappers
的数量为2。因此,每个map tasks???
运行500个map
实例
如果我问错了,请纠正我的问题
映射器如何分配
映射器的数量由Map/Reduce作业中使用的InputFormat
决定的分割数量决定。在典型的InputFormat
中,它与文件数量和文件大小成正比。
假设您的HDFS块配置配置为64MB(默认大小),并且您有一个大小为100MB的文件,那么它将占用2个块,然后根据块分配2个映射器
假设你有两个30MB大小的文件(每个文件),那么每个文件将占用一个块,映射器将基于此分配。
假设你有一个60MB的文件,那么它将占用1块,但如果你在代码中指定了输入分割大小,假设分割大小为30MB,那么将为该作业分配2个映射器。
RecordReader()
-记录读取器将数据分解成键/值对输入到Mapper。它接受以下参数:
split -定义读取记录范围的分割。
InputSplt()
-获取分割的大小,以便输入分割可以按大小排序。
如果您没有指定任何InputSplit
大小,那么它将把整个块作为一个分割,并将读取数据并为Mapper生成键,值对。
在你的情况下2 Mapper被分配。它表示您已经指定了InputSplit
大小或您的数据驻留在2块中。
这个链接可以帮助您理解记录读取器和输入分割。
首先它取决于hdfs块的大小。
程序调用映射器的数量和映射器代码运行的次数是不同的。
如果输入格式是textinput格式,则单个mapper实例将运行与代码行数相同的次数。但是运行映射器的数量完全取决于块大小。