设计 MapReduce 作业以找到低于给定阈值的最大值

Design MapReduce job to find the maximum value below a given threshold

查询:

我正在尝试设计一个查询以在给定的 日期.[=14= 查找网页的实时版本]

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

对于每个webpage_id,作业必须输出最新的 revision_id 在给定 日期.

之前发生的页面

当前设计:

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

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

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

想法:

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

问题:

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

还有其他方法可以提高 MapReduce 工作的绩效吗?

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