【问题标题】:Combiner without Reducer in HadoopHadoop中没有Reducer的组合器
【发布时间】:2014-03-04 13:50:52
【问题描述】:

我可以编写一个只有 Mappers 和 Combiners 的 Hadoop 代码(即没有 reducer 的 mini-reducer)吗?

job.setMapperClass(WordCountMapper.class);
job.setCombinerClass(WordCountReducer.class);

conf.setInt("mapred.reduce.tasks", 0);

我试图这样做,但我总是看到我在作业跟踪器链接上有一个减少任务

启动的 reduce 任务 = 1

如何在保留组合器的同时删除减速器?这可能吗?

【问题讨论】:

    标签: hadoop mapreduce


    【解决方案1】:

    在您描述的情况下,您应该使用 Reducers。用作键:Context.getInputSplit().getPath() + Context.getInputSplit().getStart() - 这个组合对于每个 Mapper 都是唯一的。

    【讨论】:

    • 哦,非常感谢,这绝对可以解决我的问题:)
    • 使用自定义分区程序(例如身份)并使用主机名作为键不是更好吗?这应该使洗牌变得微不足道,这比 @Evgeny 的巧妙技巧产生的完全洗牌更快
    • 是的,这也应该有效:)但是“完全随机播放”是什么意思?
    • 我试图回答每个 Mapper 的输出如何被另一个 Reducer 处理。但是,确实,作为算法,要求是有问题的:如果每个 Mapper 的输出都由另一个 Reducer 处理,那么为什么首先需要 Reducer?因此,可能根本不需要 shuffle、sort 和 reduce?
    • 抱歉回复晚了,我才看到你的回答。你是对的,就我而言,每个映射器都有其独立的任务,因此我想要一个迷你减速器,它将遍历映射器 X 生成的所有数据以启动。无论如何,我使用 in-mapper 组合器解决了这个问题:-) 在这种情况下,不会使用/使用随机播放 :-)
    【解决方案2】:

    你需要告诉你的工作你不关心减速器:JobConf.html#setNumReduceTasks(int)

    // new Hadoop API
    jobConf.setNumReduceTasks(0);
    
    // old Hadoop API
    job.setNumReduceTasks(0);
    

    您可以通过IdentityReducer 实现目标。

    不执行归约,将所有输入值直接写入输出。

    我不确定你是否可以保留组合器,但我将从前面的行开始。

    【讨论】:

    • 我试过这个选项(即 job.setNumReduceTasks(0); )这个选项将reduce任务的数量设置为零,但是在这种情况下我们不能有组合器!!!
    • @HadoopUser 然后使用reducer! :) 为什么你不想使用减速器?
    • 一开始我想让一个mapper X处理的所有map任务都由同一个reducer执行,问题是不知道选择什么作为key来保证那。所以,我说有一个组合器会让这个任务更容易,因为它不看关键.. 它只是考虑到 Mapper X 作为一个包执行的所有地图任务。
    猜你喜欢
    • 2015-07-15
    • 2013-04-28
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多