【问题标题】:limit the number of records produced by all reducers collectively限制所有reducer集体产生的记录数量
【发布时间】:2012-04-05 02:51:51
【问题描述】:

这是用例:

输入 url 由地图读取,然后在经过一些过滤后发出。然后分区器根据它们的主机名对它们进行分区。

运行 map-reduce 作业后,我对输出 url 有一个全局限制。我将它均匀地分布在所有减速器上。 IE。如果全局限制为 1000,reducer 数量为 5,那么每个 reducer 最多会发出 (1000/5 = 200) 个 url 作为输出

问题是,如果只有 2 个主机的 url(由于用户输入)并且这 2 个主机中的每一个都有 100000 个 url, 处理这些 url 的 2 个 reducer(相同的主机,相同的分区)将限制每个 200 个 url 输出。 由于分区和发出 0 条记录,Rest reducer 不会获取任何数据进行处理。

因此,即使我有 100000 个 url/主机和 1000 个全局限制,输出也只有 400 个 url(200 个 url/主机)。

【问题讨论】:

    标签: hadoop mapreduce nutch


    【解决方案1】:

    如果您不必按主机名进行分区,则可以通过随机分区器解决您的问题。

    如果您必须按主机名进行分区,我认为没有简单的答案。每个 reducer 都不知道有多少记录即将到来。每个 reducer 必须累积 100000 条记录,或者与它接收到的一样多。您需要覆盖减速器中的清理功能。 Reducers 需要在“清理”函数中相互交谈(也许通过计数器),并决定需要多少条记录,并且只在清理函数中写出记录。

    你怎么看?

    【讨论】:

    • 我必须按主机名进行分区,因为来自同一主机的 url 被组合在一起并简化了进一步的逻辑。清理功能是hadoop map-reduce流程的一部分还是您提出的机制?请详细说明。
    • 你可以在你的 reducer 类中覆盖这个函数。在您的 reduce 函数中,您应该只将记录存储在容器中,而不是将它们写出来。在清理功能中,您可以进行通信并决定当前减速器需要写出多少条记录。寻找清理功能 int eh 以下页面:hadoop.apache.org/common/docs/r0.20.2/api/org/apache/hadoop/…
    【解决方案2】:

    Hadoop 内置了对全局counters 的支持。您可以定义自己的计数器,并从您的映射器或减速器代码中递增/读取它们。

    【讨论】:

    • 谢谢。我将尝试使用计数器。我认为维护计数器(以共享变量的方式)会影响更大输入的性能,但到目前为止我没有任何选择。
    猜你喜欢
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 2019-01-01
    • 2020-01-11
    • 2020-12-18
    • 1970-01-01
    • 2016-04-18
    • 2013-02-04
    相关资源
    最近更新 更多