我想要/需要将 rowkey 传递给Reducer
,因为 rowkey 是预先计算的,并且在那个阶段信息不再可用。(Reducer
执行一个Put
)
首先,我尝试只使用内部类,例如
public class MRMine {
private byte[] rowkey;
public void start(Configuration c, Date d) {
// calc rowkey based on date
TableMapReduceUtil.initTableMapperJob(...);
TableMapReduceUtil.initTableReducerJob(...);
}
public class MyMapper extends TableMapper<Text, IntWritable> {...}
public class MyReducer extends TableReducer<Text, IntWritable, ImmutableBytesWritable> {...}
}
并且两者MyMapper
都MyReducer
定义了默认构造函数。但是这种方法会导致以下异常:
java.lang.RuntimeException: java.lang.NoSuchMethodException: com.mycompany.MRMine$MyMapper.<init>()
at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:115)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:719)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:212)
Caused by: java.lang.NoSuchMethodException: com.company.MRMine$MyMapper.<init>()
at java.lang.Class.getConstructor0(Class.java:2730)
at java.lang.Class.getDeclaredConstructor(Class.java:2004)
at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:109)
我通过声明内部类 static ( Runtimeexception: java.lang.NoSuchMethodException: tfidf$Reduce.<init>() )摆脱了异常。但是我也必须制作rowkey
静态的,并且我正在并行运行多个作业。
我发现https://stackoverflow.com/a/6739905/1338732的configure
方法Reducer
被覆盖,但它似乎不再可用。无论如何,我将无法传递一个值。
我正在考虑(错误)使用(?)配置,只需添加一个新的键值对,这是否可行,以及正确的方法?
有没有办法将任何自定义值传递给减速器?
我正在使用的版本是:hbase: 0.94.6.1
, hadoop:1.0.4