记录拆分是否需要为hadoop中的每条记录生成唯一键?

Does record splitting need to generate unique keys for each record in hadoop?

我对 hadoop 世界还比较陌生。我一直在关注我能找到的示例,以了解记录拆分步骤如何适用于 mapreduce 作业。我注意到 TextInputFormat 将文件拆分为记录,键作为字节偏移量,值作为字符串。在这种情况下,我们可以在一个映射器中有两个不同的记录,它们具有来自不同输入文件的相同偏移量。

它会以任何方式影响映射器吗?我认为如果我们不处理它(例如 wordcount),映射器键的唯一性是无关紧要的。但是如果我们必须在mapper中处理它,那么key可能必须是唯一的。谁能详细说明一下?

提前致谢。

映射器的输入是文件(或 hdfs 块)而不是键值对。换句话说,mapper 本身会创建键值对,并且不会受到重复键的影响。

Mapper 生成的 "final" 输出是一个多值哈希图。

< Key, <List of Values>>

此输出成为 Reducer 的输入。一个键的所有值都由同一个 reducer 处理。映射器可以为一个键创建多个值。事实上,一些解决方案依赖于这种行为。

其实你的问题的答案完全看场景。

如果您没有使用密钥(即在 textinputformat 情况下使用最少的字节偏移量,但如果您正在使用 keyvalusepairInputformat 你可能正在使用它。)那么它永远不会影响,但是如果你的 map() 函数逻辑是这样的,你正在根据键进行一些计算那么它肯定会影响。

所以这完全取决于场景。

有误会。实际情况,

For every input split of the file one Mapper will be assigned. All the records from a single input split will be processed by only one Mapper for a given job.

不需要担心带有重复键的记录到达映射器,因为映射器的执行范围在任何时间点始终是一对 key/value。

mapper 任务的输出是 n 个 key/value 对,最终根据键进行合并、排序和分区。

reducer 将根据分区从所有映射器收集所需的输出,并将其带到 reducer 的内存中,在那里它处理将 key/value 对排列为 <key , Iterable <value> >