5

Map / Reduce中に、Hadoopでカスタム構成オブジェクトを設定して(後で)取得する方法はありますか?

たとえば、大きなファイルを前処理し、ファイルに関連するいくつかの特性を動的に決定するアプリケーションを想定します。さらに、これらの特性がカスタムJavaオブジェクト(たとえば、Propertiesオブジェクトですが、一部は文字列ではない可能性があるため、排他的ではありません)に保存され、その後、各マップおよびreduceジョブに必要になると想定します。

アプリケーションがこの構成を「伝播」して、各マッパーおよびリデューサー関数が必要なときにアクセスできるようにするにはどうすればよいでしょうか。

1つのアプローチはset(String, String)、クラスのメソッドを使用しJobConf、たとえば、JSON2番目のパラメーターを介して文字列としてシリアル化された構成オブジェクトを渡すことですが、これはハックが多すぎる可能性があり、とにかく適切なJobConfインスタンスにアクセスする必要があります(たとえば、前の質問で提案されたようなアプローチに従う)。MapperReducer

4

1 に答える 1

9

何かが足りない場合を除いてProperties、M / Rジョブに必要なすべてのプロパティを含むオブジェクトがある場合は、オブジェクトのコンテンツをPropertiesHadoopConfigurationオブジェクトに書き込むだけです。たとえば、次のようなものです。

Configuration conf = new Configuration();
Properties params = getParameters(); // do whatever you need here to create your object
for (Entry<Object, Object> entry : params.entrySet()) {
    String propName = (String)entry.getKey();
    String propValue = (String)entry.getValue();
    conf.set(propName, propValue);
}

Context次に、M / Rジョブ内で、オブジェクトを使用して、次のようConfigurationにマッパー(map関数)またはレデューサー(関数)の両方に戻ることができますreduce

public void map(MD5Hash key, OverlapDataWritable value, Context context)
    Configuration conf = context.getConfiguration();
    String someProperty = conf.get("something");
    ....
}

オブジェクトを使用するときは、およびメソッドにConfigurationアクセスすることもできます。これは、必要に応じて初期化を行うのに役立ちます。Contextsetupcleanup

また、オブジェクトからaddResourceメソッドを直接呼び出して、プロパティをまたはファイルとして直接追加することもできますが、これは通常のHadoop XML構成のようなXML構成である必要があるため、やり過ぎかもしれません。ConfigurationInputStream

編集:文字列以外のオブジェクトの場合は、シリアル化を使用することをお勧めします:オブジェクトをシリアル化してから、文字列に変換できます(通常、異常な文字がある場合はどうなるかわからないため、たとえばBase64でエンコードします) )、次にマッパー/リデューサー側で、内部のプロパティから取得した文字列からオブジェクトを逆シリアル化しますConfiguration

別のアプローチは、同じシリアル化手法を実行することですが、代わりにHDFSに書き込み、これらのファイルをに追加しますDistributedCache。少しやり過ぎに聞こえますが、これはおそらくうまくいくでしょう。

于 2013-02-20T04:07:28.670 に答える