Inputsplit、RecordReader & Map 实例和 Mapper 之间的数据流

Data flow among Inplutsplit, RecordReader & Map instace and Mapper

如果我有一个包含 1000 行的数据文件.. 并且我在我的 map 方法中使用 TextInputFormat 我的字数统计程序。因此,数据文件中的每一行都将被视为一个 split.

A RecordReader 会将每一行 (or split) 作为 (Key, Value) 对提供给 map() 方法。

根据我的理解.. 1000 次 map() 方法应该对每一行或记录执行。

表示有多少Mappers会运行?? 抱歉在这里混淆了.. map() 方法只是映射器的一个实例吧.. 那么每个映射器任务有多少个映射实例是根据什么决定的???

注意:当我为 1000 行数据执行 WordCount MapReduce 程序时。我看到 Mappers 的数量为 2。所以 500 map 个实例 运行每个 map tasks???

如果我问错了,请指正。

首先取决于hdfs块的大小。
程序调用的映射器数量与映射器代码调用的次数不同 运行。

如果您的代码的输入格式是 textinput,单个映射器实例将 运行 行数的倍数 format.But 映射器的数量将 运行完全取决于块大小。

如何分配映射器

映射器的数量由 Map/Reduce 作业中使用的 InputFormat 确定的分割数决定。在典型的 InputFormat 中,它与文件数量和文件大小成正比。

假设您的 HDFS 块配置配置为 64MB(默认大小)并且您有一个大小为 100MB 的文件,那么它将占用 2 个块,然后将根据块分配 2 个映射器

假设您有 2 个 30MB 大小的文件(每个文件),那么每个文件将占用一个块,并且映射器将基于此分配。

假设您有一个 60MB 的文件,那么它将占用 1 个块,但是如果您在代码中指定了输入拆分大小,假设拆分大小为 30MB,那么将为该作业分配 2 个映射器。

RecordReader()- 记录reader将数据分成key/value对输入到Mapper.It接受参数:

拆分 - 定义要读取的记录范围的拆分。

InputSplt()-获取split的大小,这样输入的splits就可以按大小排序了

如果您没有指定任何 InputSplit 大小,那么它将把整个块作为一个分割并读取数据并为 Mapper 生成键值对。

在您的情况下,分配了 2 个 Mapper。这表示您指定了 InputSplit 大小或您的数据驻留在 2 个块中。

link 有助于理解记录 reader 和输入拆分。