【发布时间】:2015-08-12 22:53:15
【问题描述】:
我正在编写一个自定义的 recordReader,它将键值对输出到我的映射器。我真的只需要输出值而不需要键,所以我打算使用 NullWritable 作为我的键,使用 Text 作为我的值。
我实际上使用的是 WholeFileInputFormat,如本书中的示例,它也使用 NullWritable 键:book link
但是,查看 hadoop 使用的默认哈希分区器,我看不出这不会将每条记录都发送到同一个映射器:
public class HashPartitioner<K, V> extends Partitioner<K, V> {
public int getPartition(K key, V value, int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
}
由于 NullWritable 具有相同的 hashCode,似乎只有一个映射器会处理所有数据。似乎应该有一种方法可以让 hadoop 均匀地拆分所有记录,而不必想出自己的密钥。
编辑:澄清一下,我说的是标准 hadoop 格式的 k1: (k1, v1) -> map (k2, v2) -> combine -> (k2, v2) -> reduce -> (k3, v3) (输出)
【问题讨论】:
-
我想你想说的是 Reducer 而不是 Mapper。只有一个 Reducer 将为您提供数据。因为 Mappers 是根据数据块的数量来决定的。从业者在地图工作后进入画面。请澄清一下??
-
我说的是映射器(为清楚起见,编辑了帖子)。那么分区是否只发生在映射器和减速器之间?那么 InputFormat 是如何在 mapper 之间划分数据的呢?
标签: hadoop