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 和输入拆分。
如果我有一个包含 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 和输入拆分。