0

MR ジョブの結果を複数の CQL3 列ファミリーに出力する必要があります。

私のレデューサーでは、MultipleOutputs を使用して CF を指定しますが、すべての結果は、ジョブの OutputCQL ステートメントで定義された 1 つの CF に書き込まれます。

ジョブ定義:

...
job.setOutputFormatClass(CqlOutputFormat.class);
ConfigHelper.setOutputKeyspace(job.getConfiguration(), "keyspace1");
MultipleOutputs.addNamedOutput(job, "CF1", CqlOutputFormat.class, Map.class, List.class);
MultipleOutputs.addNamedOutput(job, "CF2", CqlOutputFormat.class, Map.class, List.class);
CqlConfigHelper.setOutputCql(job.getConfiguration(), "UPDATE keyspace1.CF1 SET value = ? ");
...

Reducer クラスのセットアップ:

mos = new MultipleOutputs(context);

Reduce メソッド (疑似コード):

keys = new LinkedHashMap<>();
keys.put("key", ByteBufferUtil.bytes("rowKey"));
keys.put("name", ByteBufferUtil.bytes("columnName"));

List<ByteBuffer> variables = new ArrayList<>();
variables.add(ByteBufferUtil.bytes("columnValue"));

mos.write("CF2", keys, variables);

問題は、reducer が mos.write() で指定した CF を無視し、代わりに outputCQL を実行する必要があることです。したがって、上記の例では、すべてが CF1 に書き込まれます。

「UPDATE keyspace1.? SET value = ?」の行に沿って、準備済みステートメントを使用してCFをoutputCQLに挿入しようとしましたが、このようにCFにプレースホルダーを使用することは可能だとは思いません。

レデューサー クラス内で outputCQL を上書きする方法はありますか?

4

1 に答える 1

0

したがって、単純な答えは、mr ジョブの結果を複数の CF に出力できないということです。ただし、これを行う必要があるということは、Hadoop に欠けている機能ではなく、実際にはアプローチの欠陥を浮き彫りにします。

一連のレコードを処理して 2 つの異なる結果セットを 1 回のパスで生成しようとする代わりに、目的の結果セットに繰り返し到達することをお勧めします。基本的に、これは、望ましい結果が得られるまで、複数のジョブが前のジョブの結果を反復することを意味します。

于 2014-10-16T13:29:09.493 に答える