查询:
我正在尝试设计一个查询以查找给定日期网页的实时版本。
date 作为运行时参数传递。映射器的输入是以下键 -> 值对:webpage_id -> revision_id 和 revision_timestamp。
对于每个 webpage_id,作业必须输出在给定日期。
当前设计:
映射器将在阈值日期之后丢弃任何带有 revision_timestamp
的记录,并输出所有其他记录。
然后,组合器会对给定网页的所有修订进行排序,并仅输出最新的(这是通过使用内部数据结构并在组合器的清理阶段发出键值对来完成的)。
reducer 会做与 combiner 相同的事情,但在 combiner 的输出上。
想法:
我想进一步优化作业。我认为用映射器为给定网页处理的最新修订更新“全局”变量是个好主意。鉴于此,在映射器输出记录之前,它会检查修订是否是该网页的“全局最新”修订,如果不是则不会发出。如果是,他将发出记录并更新全局变量。我认为这可以减少通过网络传输的记录量并加快工作速度。您认为这个想法是否可行,是否有可能提高性能?
问题:
有没有一种方法可以创建和更新这样的全局变量——我读到 ZooKeeper
的一个特性是充当键值存储,但我找不到代码示例来说明如何在 map task 中初始化或访问 ZooKeeper
记录/变量?
还有其他方法可以提高我的 MapReduce
作业的性能吗?
最佳答案
据我所知,在 map/reduce 作业之间共享可变全局状态没有正式的方法。当然可以使用像 zookeeper 这样的东西,但很可能它会成为你流程的瓶颈。所以一般不推荐。 相反,您可以跟踪每个映射器的 webpage_id -> max_date HashMap ,并且仅在当前日期晚于当前跟踪的 max_date 时才发出记录。当然,这是假设这个映射应该适合内存。如果您的用例中页面 ID 的数量太大,您可能需要对输入进行预分区(通过 webpage_id),这样每个映射器将只接收页面 ID 的有限子集,从而使最大日期跟踪 map 在内存。然后你只需要配置足够数量的映射器。
关于design-patterns - 设计 MapReduce 作业以找到低于给定阈值的最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28467755/