使用CQL3的Hadoop多输出

时间:2013-11-04 17:08:06

标签: hadoop mapreduce cassandra cql3

我需要将MR作业的结果输出到多个CQL3列族。

在我的reducer中,我使用MultipleOutputs指定CF,但所有结果都写入作业的OutputCQL语句中定义的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方法(psudo代码):

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。

我尝试使用预准备语句将CF注入outputCQL,沿着“UPDATE keyspace1。?SET value =?”,但我不认为可以像这样使用CF的占位符。

有没有办法可以覆盖reducer类中的outputCQL?

1 个答案:

答案 0 :(得分:0)

所以简单的答案是你不能将mr作业的结果输出到多个CF.但是,有必要这样做实际上突出了方法中的一个缺陷,而不是Hadoop中缺少的功能。

不是处理一堆记录并尝试在一次传递中产生2个不同的结果集,而是更好的方法是迭代地得到所需的结果集。基本上,这意味着有多个工作迭代以前的工作结果,直到达到预期的结果。