我希望/需要将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)
我通过声明内部类静态(Runtimeexception: java.lang.NoSuchMethodException: tfidf$Reduce.<init>())来消除异常。但是我也必须使rowkey
静态,并且我并行运行多个作业。
我发现https://stackoverflow.com/a/6739905/1338732覆盖了configure
的{{1}}方法,但它似乎不再可用。无论如何,我无法传递价值。
我在想(错误)使用(?)配置,只需添加一个新的键值对,这是否正常,以及正确的方法?
有没有办法将任何自定义值传递给reducer?
我正在使用的版本是:hbase:Reducer
,hadoop:0.94.6.1
答案 0 :(得分:2)
您的问题陈述有点不清楚,但我认为这样的事情是您正在寻找的。
我目前用于将信息传递给reducer的方法是在配置中传递它。
在作业设置中执行以下操作
conf.set("someName","someValue");
这将在配置中创建一个名称为someName且值为someValue的标记。稍后可以通过执行以下操作在Mapper / Reducer中检索它:
Configuration conf = context.getConfiguration();
String someVariable = conf.get("someName");
当前代码将someVariable的值设置为“someValue”,允许将信息传递给reducer。
要传递多个值,请使用setStrings()。我还没有测试过这个函数,但根据documentation,应该使用以下两个选项之一(文档有点不清楚,所以尝试两个并使用哪个有效):
conf.setStrings("someName","value1,value2,value3");
conf.setStrings("someName","value1","value2","value3");
使用以下方式检索:
Configuration conf = context.getConfiguration();
String someVariable = conf.getStrings("someName");
希望这有帮助
答案 1 :(得分:0)
目标有点不清楚,但我发现对于涉及HBase的许多类型的作业,您不需要使用reducer将数据放入HBase。映射器读取一行,以某种方式修改它,然后将其写回。
显然,有些工作不合适(例如任何类型的聚合),但减少阶段确实会减慢工作。