当前位置: 首页 > 知识库问答 >
问题:

同一文件中两个不同键的化简器输出值

卢承弼
2023-03-14

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

现在我面临的问题是,reducer将两个不同的键 - 值对放在同一个文件中,其余4个键值放在单个文件中。因此,简而言之,在化简器输出的6个文件中,我得到了4个具有单键值对的文件和1个具有两个键值对的文件以及1个没有任何内容的文件。

我尝试在Google和各种论坛上进行研究,我得出的唯一结论是我需要一个分区器来解决这个问题。我是新的hadoop,所以有人可以阐明这个问题并帮助我解决这个问题。

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

如果需要更多信息,请提前告诉我,谢谢。

共有2个答案

舒永嘉
2023-03-14

默认情况下,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;
  }

}

密钥哈希码()

这一行本身就有问题——两个这样的语句可能会返回相同的数字。因此,两个不同的键可能会指向同一个减速器。例如-

("go".hashCode() & Integer.MAX_VALUE) % 6

将返回您4,

("hello".hashCode() & Integer.MAX_VALUE) % 6

也会退还你4英镑。

所以,我在这里建议的是,如果你想确保你的6个键被6个不同的归约器处理,你需要创建你自己的划分器来得到你想要的。

如果您有任何困惑,并且您使用Job类指定了如下所示的自定义分区器,请查看创建自定义分区器的链接。

< code>job.setPartitioner(

希望这能有所帮助。

西门智
2023-03-14

对于6个减缩器,只有6个密钥并不是hadoop的最佳利用——虽然6个减减缩器中的每一个都使用单独的减缩器是很好的,但这并不能保证。

键不能在化简器之间拆分,因此,如果您拥有的键少于 6 个,则只有一部分化简器需要执行任何工作。您应该考虑重新考虑您的键分配(也许输入文件适合hadoop),并且可能使用一个系统,以便有足够的键在化简器之间均匀分布。

编辑:我相信您可能想要的是MultipleOutputFormat,它具有方法generateFileNameForKeyValue(key,value,name)允许您生成一个文件,以每个key写入,而不是每个Reducer

 类似资料:
  • 问题内容: 我有两个卡夫卡喷口,我要将其值发送到同一螺栓。 可能吗 ? 问题答案: 是的,有可能: 您也可以使用任何其他分组。 更新: 为了区分使用者螺栓中的元组(即topic_1或topic_2),有两种可能性: 1)您可以使用操作员ID(如@ user-4870385所建议): 2)您可以使用流名称(@zenbeni建议)。对于这种情况,两个喷口都需要声明命名流,而螺栓需要通过流名称连接到喷口

  • 我有一个png非压缩文件(600KBytes),我正试图保存为JPG,以减少android应用程序的大小。 null null 谢谢你。

  • 问题内容: 我可以跑: 而事实证明,并且有不同的MD5哈希值。的确,它们是不同的,这证实了这一点。 我还需要传递其他哪些标志,以便其输出随时间推移与相同输入保持一致? 问题答案: 相当于 文件不同的原因是因为将其输入文件名和修改时间放入了压缩文件中。当输入是管道时,它将使用空字符串作为文件名,并使用当前时间作为修改时间。 但是它也有一个选项,告诉它不要将名称和时间戳记放入文件中。因此,如果您显式编

  • 问题内容: 使用posix的read()write()linux调用,可以确保如果我以串行方式通过一个文件描述符进行写入并通过另一个文件描述符进行读取,以使两个动作彼此互斥…读取文件描述符将始终看到写入文件描述符最后写入的内容? 我相信是这种情况,但我想确定一下,手册页对此没有太大帮助 问题答案: 这取决于您在哪里获得了两个文件描述符。如果它们来自dup(2)调用,则它们共享文件的偏移量和状态,因

  • 我们的Java应用程序在Logback上使用SLF4J来记录错误消息。在我们的回复中。xml,我们为错误日志定义了一个appender,以及一个指定包层次结构顶层的记录器。 我们正在将记录数据的功能添加到不同的日志文件中。我创建了一个类来处理这个日志记录,我向logback.xml添加了一个新的appender和一个新的logger。新的logger指定了我创建的新类的完全限定包名称(以及addt

  • 我有相同的图像和相同大小的画布,但是输出是不同的。我想要同样的输出,该怎么做呢?