【问题标题】:Hadoop send record to all reducersHadoop 向所有 reducer 发送记录
【发布时间】:2012-08-18 10:46:55
【问题描述】:

如何向我的所有 reducer 发送特定记录?

我知道 Partitioner 类及其作用,但我看不出有任何简单的方法可以确保将记录发送到所有 reducer。

基本上Partitioner有这个方法:

 int getPartition(K2 key,
             V2 value,
             int numPartitions)

我的第一个想法是让 Partitioner 和 Mapper 协作如下:Mapper 不断输出记录的次数等于 reduce 任务的数量,并且 Partitioner 返回所有 int(从 0 到 numPartitions-1) ,这样可以确保记录到达所有分区。

还有其他更聪明的方法来解决这个问题吗?例如,我为需要发送到所有分区的记录返回 -1,框架在看到返回的 -1 时为我执行此操作。

【问题讨论】:

    标签: hadoop mapreduce partitioning reduce partitioner


    【解决方案1】:

    分区器不是这样工作的。它的工作是查看键(通常)和值(很少)以确定该对应该发送到哪个减速器。这发生在 mapper 之后和 reducer 之前。

    相反,您(映射器)应该能够向上下文询问可以回答减速器(分区)总数的配置。然后,您的映射器可以输出一个复杂的键,其中包含您想要的实际键和分区号。您知道要写多少次,因为映射器可以找出减速器的数量(见上文)。分区器所要做的就是分解复合键值,提取目标 reducer 索引并返回该索引。

    顺便说一句,这意味着如果您使用这种技术发送计数(如果您正在排序)或其他元数据以供稍后在处理中使用,那么您的真实数据键必须遵循相同的复合格式.事实上,您可能必须在复合键中包含一个指示符来描述它的键/值对类型(例如 1=真实数据,0=处理元数据)。

    【讨论】:

    • 我还需要根据您需要的分组比较器更新此答案。
    • 我也是这么想的。我没有很清楚地描述它,我还考虑在 Partitioner 对象中设置一个计数器来跟踪它必须返回的下一个分区是什么。但是,我不确定这是一个解决方案,因为 Partitioner 对象可能是 GC-ed 并且计数器重置。关于分组比较器,我认为这取决于我没有描述的要求。如果需要我会回来的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    相关资源
    最近更新 更多