如果我有一个包含1000行的数据文件..我在我的TextInputFormat
方法中使用map
作为我的字数统计程序。因此,数据文件中的每一行都将被视为一个split
。
RecordReader会将每一行(or split
)作为(Key, Value)
对提供给map()
方法。
根据我的理解......对于每一行或记录,应执行1000次map()
方法。
表示会运行多少Mappers
?
抱歉困惑在这里.. map()
方法只是mapper的一个实例..所以每个Mapper任务有多少个地图实例是根据什么决定的???
注意:当我为1000行数据执行WordCount MapReduce
计划时..我看到Mappers
的数量为2.因此每个map
运行500 map tasks???
个实例
如果我说错了,请更正我的问题。
答案 0 :(得分:0)
首先,它取决于hdfs块的大小 程序调用的映射器数量与maper代码运行的次数有所不同。
单个映射器实例将在代码的情况下运行与行数一样多的次数,因为输入格式是textinput格式。但是mapper的运行数量纯粹取决于blocksize。
答案 1 :(得分:0)
如何分配地图集
映射器数量由Map / Reduce作业中使用的InputFormat
确定的拆分数决定。在典型的InputFormat
中,它与文件数和文件大小成正比。
假设您的HDFS块配置配置为64MB(默认大小),并且您有一个100MB大小的文件,那么它将占用2个块,然后将根据块分配2个映射器
假设您有2个文件,大小为30MB(每个文件),那么每个文件将占用一个块,并且将根据该文件分配映射器。
假设您有一个60MB的文件,那么它将占用1个块,但如果您在代码中指定了输入分割大小,则表示分割大小为30MB,则将为此作业分配2个映射器。
RecordReader()
- 记录阅读器将数据分成键/值对,以输入Mapper。它需要参数:
拆分 - 定义要读取的记录范围的拆分。
InputSplt()
- 获取拆分的大小,以便可以按大小对输入拆分进行排序。
如果你没有指定任何InputSplit
大小,那么它将整个块作为一个分割,并将读取数据并为Mapper生成键值对。
在您的情况下,分配了2个Mapper。它表示您已指定InputSplit
大小,或者您的数据位于2个区块中。
这个link有助于理解记录阅读器和输入分割。