【发布时间】:2013-10-18 23:52:40
【问题描述】:
我想要/需要将 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,其中Reducer 的configure 方法被覆盖,但它似乎不再可用。无论如何,我无法传递值。
我正在考虑(错误)使用(?)配置,只需添加一个新的键值对,这是否可行,以及正确的方法?
有没有办法将任何自定义值传递给减速器?
我使用的版本是:hbase:0.94.6.1,hadoop:1.0.4
【问题讨论】:
标签: java hadoop mapreduce hbase