【问题标题】:Design MapReduce job to find the maximum value below a given threshold设计 MapReduce 作业以找到低于给定阈值的最大值
【发布时间】:2015-02-12 01:28:27
【问题描述】:

查询:

我正在尝试设计一个查询来查找给定日期的网页实时版本。

日期作为运行时参数传递。映射器的输入是以下键 -> 值对:webpage_id -> revision_id revision_timestamp

对于每个 webpage_id,作业必须输出在给定日期

当前设计:

映射器将在阈值日期之后丢弃任何带有revision_timestamp 的记录,并输出所有其他记录。

然后,组合器将对给定网页的所有修订进行排序并仅输出最新的修订(这是通过使用内部数据结构并在组合器的清理阶段发出键值对来完成的)。

reducer 与组合器做同样的事情,但在组合器的输出上。

想法:

我想进一步优化工作。我认为使用映射器为给定网页处理的最新版本更新“全局”变量是个好主意。鉴于此,在映射器输出记录之前,它会检查修订版是否是该网页的“全球最新”修订版,如果不是,则不会发出。如果是,他将发出记录并更新全局变量。我认为这可以减少通过网络传输的记录数量并加快工作速度。您认为这个想法是否可行,是否有可能提升性能?

问题:

有没有办法创建和更新这样的全局变量 - 我读到 ZooKeeper 的功能之一是充当键值存储,但我找不到如何初始化或访问 @ 的代码示例987654323@ 地图任务中的记录/变量?

还有其他方法可以提高我的MapReduce 工作的性能吗?

【问题讨论】:

    标签: design-patterns hadoop mapreduce apache-zookeeper


    【解决方案1】:

    据我所知,在 map/reduce 作业之间共享可变全局状态没有官方方法。当然,使用 zookeeper 之类的东西是可能的,但它很可能会成为您流程的瓶颈。所以一般不推荐。 相反,您可以跟踪每个映射器的 pages_id -> max_date 哈希映射,并且仅在当前日期晚于当前跟踪的 max_date 时发出记录。当然,这假设这个映射应该适合内存。如果在您的用例中页面 id 的数量太大,您可能希望对输入进行预分区(按webpage_id),以便每个映射器仅接收有限的页面 id 子集,从而使最大日期跟踪图在记忆。然后你只需要配置足够数量的映射器。

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 2021-09-11
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      相关资源
      最近更新 更多