2015-02-12 62 views
2

最大值查询:设计MapReduce工作找到低于给定的阈值

我试图设计一个查询,以查找网页的现场版本在给定的日期

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

对于每个webpage_id,作业必须输出的最新REVISION_ID给定日期在此之前发生的页面

目前的设计:在基准日期后

映射器将丢弃revision_timestamp任何记录,将输出所有其他记录。

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

减速器与组合器的作用相同,但是在组合器的输出上。

理念:

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

问:

有没有一种方法来创建和更新这些全局变量 - 我读到的ZooKeeper的特点之一是充当一个key-value存储,但我无法找到的代码示例如何初始化或访问地图任务中的ZooKeeper记录/变量?

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

回答

1

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

相关问题