Java 减速器输出同一文件中两个不同键的值

Java 减速器输出同一文件中两个不同键的值,java,hadoop,mapreduce,hadoop-partitioning,Java,Hadoop,Mapreduce,Hadoop Partitioning,您好,我已经编写了一个mapreduce作业,它通常解析XML文件。我能够解析XML文件并正确生成所有键值对。我有6个不同的键和相应的值。所以我并行运行6个不同的减速器 现在我面临的问题是reducer将两个不同的键值对放在同一个文件中,剩余的4个键值放在单个文件中。简言之,在reducer输出的6个文件中,我得到了4个带有单个键值对的文件,1个带有两个键值对的文件,1个文件没有任何内容 我试着在谷歌和各种论坛上做研究,唯一的结论是我需要一个分区器来解决这个问题。我是新的hadoop,所以有人可

您好,我已经编写了一个mapreduce作业,它通常解析XML文件。我能够解析XML文件并正确生成所有键值对。我有6个不同的键和相应的值。所以我并行运行6个不同的减速器

现在我面临的问题是reducer将两个不同的键值对放在同一个文件中,剩余的4个键值放在单个文件中。简言之,在reducer输出的6个文件中,我得到了4个带有单个键值对的文件,1个带有两个键值对的文件,1个文件没有任何内容

我试着在谷歌和各种论坛上做研究,唯一的结论是我需要一个分区器来解决这个问题。我是新的hadoop,所以有人可以帮我解决这个问题

我正在研究一个伪节点集群,并使用Java作为编程语言。我不能在这里分享代码,但仍然试图简单地描述这个问题


请提前告诉我需要更多信息,并表示感谢。

对于6个减速机,只有6个键并不是hadoop的最佳利用方式-虽然6个键中的每一个都可以使用单独的减速机,但这并不能保证

关键点不能在减速器之间分割,因此,如果您的关键点少于6个,那么只有减速器的一个子集有工作要做。你应该考虑重新思考你的密钥分配(也许输入文件对于Hadoop的适当性),或者使用一个系统,使得有足够的密钥在还原器中均匀分布。
编辑:我相信您可能想要的是,它有这样一种方法,允许您为每个键生成一个要写入的文件,而不是为每个
Reducer

生成一个文件。默认情况下,Hadoop使用一个默认值,类似于

public class HashPartitioner<K2, V2> implements Partitioner<K2, V2> {

  public void configure(JobConf job) {}

  /** Use {@link Object#hashCode()} to partition. */
  public int getPartition(K2 key, V2 value,
                          int numReduceTasks) {
    return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
  }

}
将返回您4和

("hello".hashCode() & Integer.MAX_VALUE) % 6
我也会还给你4

所以,我在这里的建议是,如果你想确保所有6个键都被6个不同的还原器处理,你需要创建你自己的分区器来得到你想要的

如果您有任何困惑,并且使用Job类指定了自定义分区器,请查看创建自定义分区器的步骤

job.setPartitioner()


希望这有帮助。

是的,请详细说明。我认为你们对这个问题的解释是错误的。我从mapper输出不同的唯一键,但我希望每个键及其对应的值都在一个单独的文件中。为此,我有n个减缩器。但问题是reducer输出两个不同的键,并且在一个文件中有相应的值。如果你能回答这个问题,那就太好了。嘿,我下面的回答对你有帮助吗?
("hello".hashCode() & Integer.MAX_VALUE) % 6