【问题标题】:MapReduce filter before reduce减少之前的 MapReduce 过滤器
【发布时间】: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


【解决方案1】:

很遗憾,系统无法按您预期的方式运行。

我们无法更改 Mapper、Reducer 和 Combiner 功能。

Hadoop 允许用户指定在 map 输出上运行的组合器函数,组合器函数的输出形成 reduce 函数的输入。换句话说,调用组合函数零次、一次或多次应该从减速器产生相同的输出。

Combiner 无法合并来自多个地图的数据。让我们把工作交给 Reducer。

对于你的问题,

1) 使用 Customer Partitioner 并决定应该使用哪个 reducer 来处理特定的键 (CurrentDoc::Type)

2) Combiner 将在 Mapper

中合并数据

3) Mapper 将根据 Key Partition 重定向到特定的 Reducer(shuffle

4) Reducer 将结合从各个 Mapper 接收到的密钥数据

Working code of 分区器和合并器

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-25
    • 2021-07-05
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多