使用Scala阅读Cassandra中的并行性

时间:2019-06-17 20:30:23

标签: scala apache-spark concurrency cassandra

我正在尝试使用spark从Cassandra表中调用并行读取。但是我无法调用并行性,因为在任何给定时间都只有一次读取。应该采用什么方法来达到相同的目的?

1 个答案:

答案 0 :(得分:3)

我建议您采用以下方法source Russell Spitzer's Blog

使用部分扫描联合来手动划分分区: 将任务推给最终用户也是一种可能(以及当前的解决方法。)大多数最终用户已经了解了为什么他们的分区很长,并且通常知道其列值所在的域。这使他们可以手动划分一个请求,以便它砍掉大分区。

例如,假设用户知道群集列c的范围是1到1000000。他们可以编写类似的代码

val minRange = 0
val maxRange = 1000000
val numSplits = 10
val subSize = (maxRange - minRange) / numSplits

sc.union(
  (minRange to maxRange by subSize)
    .map(start => 
      sc.cassandraTable("ks", "tab")
        .where("c > $start and c < ${start + subSize}"))
)

每个RDD将包含一组唯一的任务,这些任务仅绘制完整分区的一部分。联合操作将所有这些不同的任务合并到一个RDD中。任何单个Spark分区将从单个Cassandra分区中提取的最大行数将限制为maxRange / numSplits。这种方法虽然需要用户干预,但可以保留局部性,并且仍可以最小化磁盘扇区之间的跳转。

read-tuning-parameters

Read tuning parameters