【问题标题】:Pass custom value to Reducer将自定义值传递给 Reducer
【发布时间】:2013-10-18 23:52:40
【问题描述】:

我想要/需要将 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/1338732,其中Reducerconfigure 方法被覆盖,但它似乎不再可用。无论如何,我无法传递值。

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

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

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

【问题讨论】:

    标签: java hadoop mapreduce hbase


    【解决方案1】:

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

    我目前用来向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");
    

    希望对你有帮助

    【讨论】:

    • 谢谢,这行得通。我会把它作为传递价值观的“必经之路”
    • 是的,这是将小的配置值传递给映射器或缩减器的典型方式。如果需要传递大量数据,最好使用分布式缓存。
    【解决方案2】:

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

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

    【讨论】:

    • 目标是将信息传递给Reducer(我在汇总数据时需要它)。但是感谢您提供的信息,如果我遇到不需要减速器的用例,我会记住它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    相关资源
    最近更新 更多