2013-10-17 227 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

相關問題