我希望/需要将行键传递给Reducer
,因为行键是预先计算的,并且该阶段的信息不再可用。(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)
我通过声明内部类静态(运行时异常:java.lang.NoSuchMethodException:tfidf$Reduce.rowkey
静态,并且我并行运行多个作业。
我发现了Reducer
的configure
方法被覆盖 https://stackoverflow.com/a/6739905/1338732,但它似乎不再可用。无论如何,我无法传递值。
我在考虑(错误)使用(?)配置,只需添加新的键值对,这是否有效,正确的方法?
有没有办法将任何自定义值传递给化简器?
我使用的版本是:HBase:0.94.6.1
,Hadoop:1.0.4
您的问题陈述有点不清楚,但是我认为您正在寻找这样的东西。
我目前用于将信息传递给化简器的方式是在配置中传递它。
在作业设置中执行以下操作
conf.set("someName","someValue");
这将在配置中创建一个标记,该标记的名称为 someName,值为 someValue。稍后可以通过执行以下操作在映射器/化简器中检索到:
Configuration conf = context.getConfiguration();
String someVariable = conf.get("someName");
当前代码会将 someVariable 的值设置为 "someValue",允许将信息传递给化简器。
要传递多个值,请使用 setStrings()。我还没有测试过这个功能,但根据文档应该使用以下两个选项之一(文档有点不清楚,所以尝试两者并使用任何有效的选项):
conf.setStrings("someName","value1,value2,value3");
conf.setStrings("someName","value1","value2","value3");
检索使用:
Configuration conf = context.getConfiguration();
String someVariable = conf.getStrings("someName");
希望这有帮助
不清楚,但我发现对于涉及HBase的许多类型的作业,你不需要化简器将数据放入HBase。 映射器读取一行,以某种方式修改它,然后将其写回。
显然,有些作业是不合适的(例如任何类型的聚合),但归约阶段确实会减慢作业的速度。