Inplutsplit,RecordReader&映射instace和Mapper

时间:2015-06-07 01:55:35

标签: hadoop mapreduce

如果我有一个包含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???个实例

如果我说错了,请更正我的问题。

2 个答案:

答案 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有助于理解记录阅读器和输入分割。