将自定义值传递给化简器



我希望/需要将行键传递给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> {...}
}

并且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)

我通过声明内部类静态(运行时异常:java.lang.NoSuchMethodException:tfidf$Reduce.()))来摆脱异常。 但是我也必须使rowkey静态,并且我并行运行多个作业。

我发现了Reducerconfigure方法被覆盖 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。 映射器读取一行,以某种方式修改它,然后将其写回。

显然,有些作业是不合适的(例如任何类型的聚合),但归约阶段确实会减慢作业的速度。

相关内容

  • 没有找到相关文章

最新更新