2013-10-17 207 views
2

由于rowkey是预先计算的,因此我想要/需要将rowkey传递到Reducer,并且该阶段的信息不再可用。 (该Reducer执行Put将自定义值传递给Reducer

首先我试着只使用内部类,

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有默认的构造函数中定义。但是,这种方法会导致以下异常(S):

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其中Reducerconfigure方法被覆盖,但它似乎不再可用。总之,我无法传递价值。

我在想(错)使用(?)配置,只需添加一个新的键 - 值对,这是否会工作,并且正确的方法?

有没有办法将任何自定义值传递给reducer?

我使用的版本是:HBase的:0.94.6.1,Hadoop的:1.0.4

回答

2

您的问题声明是有点不清楚,但我觉得这样的事情是你在找什么。

我目前用来传递信息给reducer的方法是在配置中传递它。

在作业设置

做到以下几点

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

这将有名称someName与价值someValue中配置创建一个标签。这之后可以在映射器/减速器通过执行以下操作来检索:

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

当前的代码将设置someVariable的值设定为“someValue中”,允许信息被传递给减速机。

要传递多个值,请使用setStrings()。我没有测试此功能还,但根据documentation是应该具备以下两个选项之一工作(该文件是有点不清楚,所以尽量都和使用作品为准):

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

检索使用:

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

希望这有助于

+0

谢谢,这工作。我将其视为“要走的路”,以便传递值 – divadpoc

+0

是的,这是将小配置值传递给映射器或缩减器的典型方法。如果您需要传递大量数据,则首选使用分布式缓存。 – David

0

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

很明显,有不适合的工作(例如任何类型的聚合),但减少阶段可以真的减慢工作。

+0

的目标是将信息传递给'Reducer'(我需要它来汇总数据)。但是感谢这些信息,如果我遇到不需要还原器的用例,我会记住它 – divadpoc

相关问题