2

Reducer行キーは事前に計算され、その段階では情報が利用できないため、行キーを に渡したい/渡す必要があります。(Reducerは a を実行します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

あなたの問題文は少し不明確ですが、このようなものがあなたが探しているものだと思います.

レデューサーに情報を渡すために現在使用している方法は、構成で渡すことです。

ジョブのセットアップで次のことを行います

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

これにより、名前が someName で値が someValue のタグが構成に作成されます。これは、次の操作を行うことで、Mapper/Reducer で後で取得できます。

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

現在のコードは someVariable の値を「someValue」に設定し、情報をレデューサーに渡すことができます。

複数の値を渡すには、setStrings() を使用します。この関数はまだテストしていませんが、ドキュメントによると次の 2 つのオプションのいずれかで動作するはずです (ドキュメントは少し不明確なので、両方を試して、動作する方を使用してください)。

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 に答える