【问题标题】:Hadoop Multiple Outputs with CQL3使用 CQL3 的 Hadoop 多输出
【发布时间】:2013-11-15 09:18:31
【问题描述】:

我需要将 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方法(伪代码):

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?

【问题讨论】:

    标签: hadoop mapreduce cassandra cql3


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-05
      • 2013-04-01
      • 1970-01-01
      相关资源
      最近更新 更多