gpt4 book ai didi

hadoop - NullWritable 是映射器可接受的输入键吗?

转载 作者:可可西里 更新时间:2023-11-01 15:13:06 26 4
gpt4 key购买 nike

我正在编写一个自定义 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 均匀地分割所有记录,而不必想出你自己的 key 。

编辑:澄清一下,我说的是标准 hadoop 格式的 k1:(k1, v1) -> 映射 (k2, v2) -> 合并 -> (k2, v2) -> 归约 -> (k3, v3) (输出)

最佳答案

您作业的映射器数量将取决于您如何覆盖 FileInputFormat 抽象类(InputFormat 接口(interface))中的 getSplits 方法。 WholeFileInputFormat 只有一个映射器,因为它在 isSplitable 中返回 falseFileInputFormat 中的 getSplits 使用 isSplitable 方法检查输入是否可拆分,并创建分配给映射器的输入拆分。

您可以从 FileInputFormat 查看 getSplits 的实现了解更多详情。

没有Partitioner决定Mapper数量的作用。 Partitioner 的作用是将相同的散列键发送到同一个 Reducer。如果您从 Mapper 输出 NullWritable 作为键,那么所有键都将转到单个 Reducer。

更新:Mappers 的数量本质上不是文件的数量。 HDFS 将数据存储到 block 中。因此,如果 HDFS block 大小为 128MB,文件大小为 256MB,那么它可以有两个拆分,这两个拆分将传递给两个不同的映射器。这就是为什么无论特定文件是否可拆分,isSplitable 都会出现的原因。

希望对您有所帮助。

关于hadoop - NullWritable 是映射器可接受的输入键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31976738/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com