使用cassandra火花连接器进行数据聚合时如何对RDD工作进行并列化?

时间:2016-01-12 06:52:11

标签: apache-spark cassandra spark-cassandra-connector

以下是样本senario,我们在cassandra中有实时数据记录,我们希望在不同的时间范围内聚合数据。我写的代码如下:

 val timeRanges = getTimeRanges(report)
 timeRanges.foreach { timeRange =>
          val (timestampStart, timestampEnd) = timeRange

          val query = _sc.get.cassandraTable(report.keyspace, utilities.Helper.makeStringValid(report.scope)).
            where(s"TIMESTAMP > ?", timestampStart).
            where(s"VALID_TIMESTAMP <= ?", timestampEnd)
        ......do the aggregation work....

代码的问题在于,对于每个时间范围,聚合工作都不是以并行方式运行的。我的问题是如何平衡聚合工作?既然RDD不能在另一个RDD或Future中运行?有没有办法平行工作,或者我们不能在这里使用火花连接器?

2 个答案:

答案 0 :(得分:1)

使用joinWithCassandraTable函数。这允许您使用来自一个RDD的数据来访问C *并拉取记录,就像在您的示例中一样。

https://github.com/datastax/spark-cassandra-connector/blob/master/doc/2_loading.md#performing-efficient-joins-with-cassandra-tables-since-12

  

{{1}}利用java驱动程序执行单个驱动程序   查询源RDD所需的每个分区,因此不需要   数据将被请求或序列化。这意味着任何之间的联接   可以在不执行完整表的情况下执行RDD和Cassandra表   扫描。当在两个共享的Cassandra表之间进行预测时   相同的分区键不需要在它们之间移动数据   机器。在所有情况下,此方法将使用源RDD   数据位置的分区和放置。

答案 1 :(得分:0)

最后,我们使用union来连接每个RDD并使它们并行化。