将自定义值传递给Reducer

时间:2013-10-17 08:13:02

标签: java hadoop mapreduce hbase

我希望/需要将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> {...}
}

并且MyMapperMyReducer都定义了默认构造函数。但是这种方法会导致以下异常:

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

2 个答案:

答案 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。映射器读取一行,以某种方式修改它,然后将其写回。

显然,有些工作不合适(例如任何类型的聚合),但减少阶段确实会减慢工作。