【发布时间】:2015-12-28 23:28:29
【问题描述】:
我有一个 Hadoop MapReduce 作业,可以拆分不同类型的文档(地点、人员、组织、算法等......)。对于每个文档,我都有一个标识文档类型和指向其他文档的链接的标签,但是在任务中到达链接页面之前,我不知道链接的文档是哪种类型。
在Map阶段,我识别出当前页面的链接和种类,然后Emmit作为值,将链接和当前文档的信息及其标签传递给单个reducer,Key NullWritable Value "CurrentDoc::Type: :链接”。
在 reducer 阶段,它使用值的“CurrentDoc::Type”按类型对所有文档进行分组,然后发出仅属于某些类型的“Document::Link”之间的关系。
但是我有一个内存问题,因为所有最后一步都只在一个减速器中执行。
这是一种方法,在map过程之后和reduce任务之前执行分组任务,以识别所有带有标签的文档,然后将它们分发到不同的reducer。
我的意思是在 ArrayWritable Text 中将所有文档/标签分组为“CurrentDoc::Type”。然后将 "CurrentDoc::Link" 元组作为 key 和 ArrayWritable 作为值发送到 reducer,以并行方式在 reduce 阶段执行一些过滤。
感谢您的帮助!
【问题讨论】:
-
你使用组合器功能吗?看来这里很适合。
-
嗨@JackDaniel's,好吧,我读到了组合器,问题是组合器只处理一个映射器的数据,不能处理所有映射器的数据,这就是我需要的。感谢您的评论
-
只需尝试发送“CurrentDoc::Link”作为键和“CurrentDoc::Type”作为映射器本身的值。
标签: hadoop dictionary mapreduce reduce