Java 将自定义值传递给Reducer

Java 将自定义值传递给Reducer,java,hadoop,mapreduce,hbase,Java,Hadoop,Mapreduce,Hbase,我想/需要将行键传递给减速机,因为行键是预先计算的,并且在该阶段信息不再可用。(减速机执行Put) 首先,我尝试只使用内部类,例如 public class MRMine { private byte[] rowkey; public void start(Configuration c, Date d) { // calc rowkey based on date TableMapReduceUtil.initTableMapperJob(...); Table

我想/需要将行键传递给
减速机
,因为行键是预先计算的,并且在该阶段信息不再可用。(减速机
执行
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> {...}
}
我通过声明内部类static()来消除异常。但是我还必须使
行键
也是静态的,并且我并行运行多个作业

我发现
Reducer
configure
方法被覆盖,但它似乎不再可用。无论如何,我不能传递一个值

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

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


我正在使用的版本是: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”,允许将信息传递到减速器

要传递多个值,请使用setString()。我还没有测试过这个函数,但是根据is的说法,应该使用以下两个选项之一(文档有点不清楚,所以请尝试使用这两个选项中的任何一个):

检索使用:

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

希望这有帮助

目标有点不明确,但我发现对于涉及HBase的许多类型的工作,您不需要使用减速机将数据放入HBase。映射程序读取一行,以某种方式修改它,然后将其写回


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

谢谢,这是可行的。我将它作为传递值的“方法”,这是向映射器或还原器传递小配置值的典型方法。如果需要传递大量数据,最好使用分布式缓存。目标是将信息传递给
Reducer
(我在聚合数据时需要它)。但是感谢您提供的信息,如果我遇到一个不需要减速器的用例,我会记住它
conf.setStrings("someName","value1,value2,value3");
conf.setStrings("someName","value1","value2","value3");
Configuration conf = context.getConfiguration();
String someVariable = conf.getStrings("someName");