我有一个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阶段执行某些过滤。
感谢您的帮助!
答案 0 :(得分:2)
不幸的是,系统无法以您期望的方式运行。
我们无法更改Mapper,Reducer&组合器功能。
Hadoop允许用户指定要在地图输出上运行的组合器函数,组合器函数的输出形成reduce函数的输入。换句话说,调用组合器函数零,一次或多次应该从reducer中产生相同的输出。
Combiner无法组合来自多个地图的数据。让我们把工作留给Reducer。
对于你的问题,
1)使用客户分区程序并决定应使用哪个reducer处理特定密钥( CurrentDoc :: Type )
2) Combiner 会将数据与 Mapper
组合在一起3)Outfrom Mapper 将根据密钥分区重定向特定的Reducer( shuffling )
4) Reducer 将组合从各个Mappers收到的密钥的数据
Working code of 分区和&组合