Java Hadoop - Reducer在使用Combiner类时多次接收相同键的不同值

时间:2013-10-25 12:12:03

标签: java hadoop key reduce

我在Hadoop Java API(1.0.3)中编写了Map Reduce作业。 这项工作包括汇总我数据中特定字段(X)的所有值,并创建其他字段的加权分布。

INPUT:

1 field1_1 field2_1 field3_1 ... fieldX_1
2 field1_2 field2_2 field3_2 ... fieldX_2
3 field1_3 field2_3 field3_3 ... fieldX_3

由于我的数据中的任何一行都会发出一对,并且我需要使用单个reducer来汇总所有值,我想将Reduce类设置为Combiner。

总计X总和:

MAP OUTPUT:

X fieldX_1
X fieldX_2 
X fieldX_3
X ... 

减少输出:

X fieldX_1+fieldX_2+fieldX_3+...

发生的奇怪事情是组合器/缩减器多次接收相同的密钥:

X [fieldX_1 fieldX_1 fieldX_1 ... fieldX_1]
X [fieldX_2 fieldX_2 fieldX_2 ...]
X [fieldX_3 fieldX_3 fieldX_3 ...]
X ...

我确信这是因为我正在登录stderr所有传递给reduce方法的dubugging调用。

我想添加一个更具体的例子:

数据:

1 field1_1 field2_1 field3_1 ... 10
2 field1_2 field2_2 field3_2 ... 20
3 field1_3 field2_3 field3_3 ... 30
4 field1_1 field2_1 field3_1 ... 10
5 field1_2 field2_2 field3_2 ... 40
6 field1_3 field2_3 field3_3 ... 20
...

地图输出:

X 10
X 20
X 30
X 10
X 40
X 20 

减少输入(使用组合器):

X [10 10 10 10]
X [20 20 20]
X [30 30 30 30 30 30 30]
X [40 40]

减少输出(使用组合器):

X 40
X 60
X 210
X 80

X是常量标签(字段名称)。 要注意,使用相同的键X和相同X值的集合来调用reducer,例如[10 10 10 ...]或[30 30 30 ...]。 每笔金额将单独输出。我的意思是算法工作正常,但在这个阶段需要一个额外的减少步骤来总结重复。

真实日志示例:

Nov 06, 2013 8:50:12 AM MYCLASS logInputError
WARNING: REDUCE-INPUT: X,[10.0]
Nov 06, 2013 8:50:12 AM MYCLASS logOutputError
WARNING: REDUCE-OUTPUT: X,10.0
Nov 06, 2013 8:50:12 AM MYCLASS logInputError
WARNING: REDUCE-INPUT: X,[25.865, 25.865]
Nov 06, 2013 8:50:12 AM MYCLAS logOutputError
WARNING: REDUCE-OUTPUT: X,51.73
Nov 06, 2013 8:50:12 AM MYCLASS logInputError
WARNING: REDUCE-INPUT: X,[1449271.4, 1449271.4, 1449271.4, 1449271.4, 1449271.4, 1449271.4, 1449271.4, 1449271.4, 1449271.4, 1449271.4, 1449271.4, 1449271.4, 1449271.4, 1449271.4]
Nov 06, 2013 8:50:12 AM MYCLASS logOutputError
WARNING: REDUCE-OUTPUT: X,2.0289798E7
Nov 06, 2013 8:50:12 AM MYCLASS logInputError
WARNING: REDUCE-INPUT: X,[514994.53, 514994.53, 514994.53, 514994.53, 514994.53, 514994.53, 514994.53, 514994.53, 514994.53, 514994.53, 514994.53, 514994.53, 514994.53]
Nov 06, 2013 8:50:12 AM MYCLASS logOutputError
WARNING: REDUCE-OUTPUT: X,6694929.0
Nov 06, 2013 8:50:12 AM MYCLASS logInputError
WARNING: REDUCE-INPUT: X,[1438665.5, 1438665.5, 1438665.5, 1438665.5, 1438665.5, 1438665.5, 1438665.5, 1438665.5, 1438665.5, 1438665.5, 1438665.5, 1438665.5, 1438665.5]
Nov 06, 2013 8:50:12 AM MYCLASS logOutputError
WARNING: REDUCE-OUTPUT: X,1.8702654E7

如果我删除了Combiner,一切正常。 我知道Combiner可以调用0,1或多次,但是Reducer呢?应该只调用一次,不是吗?

但更奇怪的是,我正在重复类似的字段分配程序,这只发生在X求和问题上......

加权字段分布

MAP OUTPUT(示例field1):

field1_1 X_1
field1_2 X_2
field1_3 X_3
... 

减少输出:

field1(class1) fieldX(class1)+fieldX(class1)+fieldX(class1)+...
field1(class2) fieldX(class2)+fieldX(class2)+fieldX(class2)+...
field1(class3) fieldX(class3)+fieldX(class3)+fieldX(class3)+...
...

基本上,对于field1的每个值,我总结了fieldX的所有相关值,并为几个字段(field1,field2,field3 ......)重复相同的过程。

对于那些发射的对,reducer接收单个键(field1(class1))和值数组([fieldX(class1)...]),这应该是正常行为。

结论

一个考虑因素是对于X求和问题,单个键(X)映射了许多值等于数据的大小(行数)。同时,对于字段加权分布,这些值分布在字段包含的几个类标签中。

这是我的代码中的错误还是我不考虑Hadoop的一些程序细节?

站在M / R范例中,Reducer类应该一次接收特定键的所有值,而不是分成更多分区。

希望收到良好的反馈。

1 个答案:

答案 0 :(得分:1)

  

发生的奇怪事情是组合器多次接收相同的密钥

这是可能的,因为MapReduce框架可能会多次调用组合器,请参阅JobConf#setCombinerClass()

  

框架可以在两者中调用组合器 0,1或多个次   mapper和reducer任务。通常,组合器称为   排序/合并结果写入磁盘。合并器必须:

     
      
  • 无副作用
  •   
  • 具有相同的输入和输出键类型以及相同的输入和输出值类型
  •