减少

时间:2015-10-01 02:40:33

标签: hadoop dictionary mapreduce reduce

我有一个Hadoop MapReduce作业,可以分割不同类型的文档(地点,人物,组织,算法等等)。对于每个文档,我都有一个标记,用于标识文档的类型和指向其他文档的链接,但是在任务中到达链接页面之前,我不知道链接的文档是哪种。

在Map阶段,我确定了当前页面的链接和种类,然后Emmit将链接和当前文档的信息与其标记值相关联到单个reducer,Key NullWritable Value“CurrentDoc :: Type: :链接”

在reducer阶段,它使用值的“CurrentDoc :: Type”按类型对所有文档进行分组,然后仅发出属于某些类型的“Document :: Link”之间的关系。

但是我遇到了内存问题,因为所有最后一步只在一个reducer中执行。

这是一种方法,在映射过程之后和reduce任务之前执行分组任务,以使用其标记识别所有文档,然后将它们分发给不同的reducer。

我的意思是将所有文档/标记分组为ArrayWritable Text中的“CurrentDoc :: Type”。然后发出reducers作为关键字“CurrentDoc :: Link”元组,并作为值以ArrayWritable在并行方式中在reduce阶段执行某些过滤。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

不幸的是,系统无法以您期望的方式运行。

我们无法更改Mapper,Reducer&组合器功能。

  

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

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

对于你的问题,

1)使用客户分区程序并决定应使用哪个reducer处理特定密钥( CurrentDoc :: Type

2) Combiner 会将数据与 Mapper

组合在一起

3)Outfrom Mapper 将根据密钥分区重定向特定的Reducer( shuffling

4) Reducer 将组合从各个Mappers收到的密钥的数据

Combiner

Working code of 分区和&组合