合并器在映射器之后、缩减器之前运行,它将接收由给定节点上的映射器实例发出的所有数据作为输入。然后输出到减速器。
而且,如果一个化简函数既是可交换的又是结合的,那么它可以用作组合器。
我的问题是,在这种情况下,“交换和结合”这个短语是什么意思?
对于交换性,假设你的减速器可以用一个叫做f()的函数(数学术语)来表示。如果f(a,b) = f(b,a ),那么你的约简是可换的,例如:
对于结合性,该属性是 f(f(a, b), c) = f(a, f(b, c))。例如:
因此,在Map/Reduce的上下文中,您的减法器必须尊重这两个属性。例如,如果您的减法器只执行一个sum()或max(),它会尊重这两个属性,但像means()或中位数()这样的东西则不会,因此您不能将其用作组合器。
我个人认为合并器是迷你化简器,在html" target="_blank">map阶段之后在内存中运行,作为减少网络流量的优化,如果您以这种方式看到Map/Reduce,则交换性/关联性实际上是有意义的:
假设你有一个数字列表,1 2 3 4 5 6。
这里的关联意味着您可以将运算应用于任何子组,然后将其应用于这些子组的结果,并得到相同的答案:
(1) + (2 + 3) + (4 + 5 + 6)
==
(1 + 2) + (3 + 4) + (5) + (6)
==
...
将此处的括号视为组合器的执行。
交换意味着顺序不重要,因此:
1 + 2 + 3 + 4 + 5 + 6
==
2 + 4 + 6 + 1 + 2 + 3
==
...
例如,加法,适合这个属性,如前所述。“最大值”也适合上面的这个属性,因为最大值的最大值是最大值。max(a, b)==max(b, a)。
中位数是一个不起作用的例子:中位数不是真正的中位数。
不要忘记组合器的另一个重要属性:键/值的输入类型和键/值输出类型必须相同。例如,您不能接受字符串:int并返回字符串:float。
通常,化简器可能会输出某种字符串而不是数值,这可能会阻止您仅将化简器作为组合器插入。
我是hadoop新手。我正在尝试运行MapReduce(Java编程),其中键是多键(文本)。我应该使用哪种类型的数组来存储这些键,然后将它们作为参数传递给outputCollector?谢谢!!!
我是Hadoop的MapReduce的新手。我已经编写了一个map-reduce任务,我正在尝试在本地计算机上运行它。但这项工作在地图绘制完成后就悬而未决了。 下面是代码,我不明白我错过了什么。 我有一个自定义密钥类 使用自定义键的映射器和缩减器类如下。 我还在main中创建了一个作业和配置。不知道我错过了什么。我在本地环境下运行这一切。
我尝试将简单单词计数作为MapReduce作业运行。在本地运行时,一切工作都很好(所有工作都在Name节点上完成)。但是,当我尝试使用YARN在集群上运行它时(将=添加到mapred-site.conf),作业会挂起。 我在这里遇到了一个类似的问题:MapReduce作业陷入接受状态 作业输出: 会有什么问题? 编辑: 我在机器上尝试了这个配置(评论):NameNode(8GB RAM)+2x D
我试图运行WordCount示例的一个变体,这个变体是,映射器输出文本作为键和文本作为值,而还原器输出文本作为键和NullWritable作为值。 除了地图,减少签名,我把主要的方法是这样的:
我试图使用这里定义的基本字数。当IntSumReducer执行context.write时,是否可能将该context.write传递给第二个reducer或输出类,该reducer或输出类将IntSumReducer给出的最终列表减少/更改到单个最大频率? 我对Hadoop/MapReduce和Java中的jobs概念相当陌生,所以我不确定我需要如何修改默认的WordCount以使其符合要求。我
考虑一个MapReduce程序的WordCount问题。 让我们考虑一下映射器的输出如下:Hello 1 World 1 Hello 1 Hadoop 1 Hello 1Hadoop1 它去了分区器(我们将2指定为缩减器的no,)现在mapout在2个部分part1中获取分区: Hello 1 Hello 1 Hello 1 Hello 1 Part 2:世界1 Hadoop 1 Hadoop 1