2

我想要/需要将 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)

我通过声明内部类 static ( Runtimeexception: java.lang.NoSuchMethodException: tfidf$Reduce.<init>() )摆脱了异常。但是我也必须制作rowkey静态的,并且我正在并行运行多个作业。

我发现https://stackoverflow.com/a/6739905/1338732configure方法Reducer被覆盖,但它似乎不再可用。无论如何,我将无法传递一个值。

我正在考虑(错误)使用(?)配置,只需添加一个新的键值对,这是否可行,以及正确的方法?

有没有办法将任何自定义值传递给减速器?

我正在使用的版本是:hbase: 0.94.6.1, hadoop:1.0.4

4

2 回答 2

2

您的问题陈述有点不清楚,但是我认为您正在寻找这样的东西。

我目前用来向reducer传递信息的方式是在配置中传递。

在作业设置中执行以下操作

conf.set("someName","someValue");

这将在配置中创建一个名称为 someName 且值为 someValue 的标签。稍后可以通过执行以下操作在 Mapper/Reducer 中检索它:

Configuration conf = context.getConfiguration();
String someVariable = conf.get("someName");

当前代码会将 someVariable 的值设置为“someValue”,从而允许将信息传递给 reducer。

要传递多个值,请使用 setStrings()。我还没有测试过这个功能,但是根据文档应该可以使用以下两个选项之一(文档有点不清楚,所以尝试两者并使用哪个有效):

conf.setStrings("someName","value1,value2,value3");
conf.setStrings("someName","value1","value2","value3");

检索使用:

Configuration conf = context.getConfiguration();
String someVariable = conf.getStrings("someName");

希望这可以帮助

于 2013-10-17T14:04:12.433 回答
0

目标有点不清楚,但我发现对于涉及 HBase 的许多类型的作业,您不需要减速器来将数据放入 HBase。映射器读取一行,以某种方式对其进行修改,然后将其写回。

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

于 2013-10-18T15:52:40.773 回答