0

我需要将 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 = ? ");
...

减速器类设置:

mos = new MultipleOutputs(context);

减少方法(伪代码):

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);

问题是我的减速器忽略了我在 mos.write() 中指定的 CF,而必须只运行 outputCQL。所以在上面的例子中,所有内容都写入 CF1。

我尝试使用准备好的语句将 CF 注入到 outputCQL 中,按照“UPDATE keyspace1.?SET value = ?”的行,但我认为不可能像这样为 CF 使用占位符。

有什么办法可以覆盖减速器类中的 outputCQL 吗?

4

1 回答 1

0

因此,简单的答案是您不能将 mr 作业的结果输出到多个 CF。但是,需要这样做实际上突出了该方法中的一个缺陷,而不是 Hadoop 中缺少的功能。

与其处理一堆记录并尝试一次生成 2 个不同的结果集,更好的方法是迭代地获得所需的结果集。基本上,这意味着有多个作业迭代先前作业的结果,直到达到预期的结果。

于 2014-10-16T13:29:09.493 回答