【问题标题】:Cassandra Spark Connector and filtering dataCassandra Spark 连接器和过滤数据
【发布时间】:2016-09-02 11:02:35
【问题描述】:

我使用的是 Spark 1.3.1,我写了一个小程序来过滤 cassandra 上的数据

val sc = new SparkContext(conf)
val rdd = sc.cassandraTable("foo", "bar")
val date = DateTime.now().minusHours(1)
val rdd2 = rdd.filter(r => r.getDate("date").after(date.toDate))
println(rdd2.count())
sc.stop()

这个程序运行了很长时间,打印类似

的消息
16/09/01 21:10:31 INFO Executor: Running task 46.0 in stage 0.0 (TID 46)
16/09/01 21:10:31 INFO TaskSetManager: Finished task 42.0 in stage 0.0 (TID 42) in 20790 ms on localhost (43/1350)

如果我终止程序并将代码更改为

val date = DateTime.now().minusHours(1)
val rdd2 = rdd.filter(r => r.getDate("date").after(date.toDate))

它仍然运行很长时间,并带有类似的消息

6/09/01 21:14:01 INFO Executor: Running task 8.0 in stage 0.0 (TID 8)
16/09/01 21:14:01 INFO TaskSetManager: Finished task 4.0 in stage 0.0 (TID 4) in 19395 ms on localhost (5/1350)

所以看起来程序总是会尝试将整个 cassandra 表加载到内存中(或尝试完全扫描它),然后才应用过滤器。这对我来说似乎效率极低。

如何以更好的方式编写此代码,以便 spark 不会尝试将整个 cassandra 表加载(或完全扫描)到 RDD 中,然后才应用过滤器?

【问题讨论】:

    标签: scala apache-spark cassandra


    【解决方案1】:

    你的第一段代码

    val rdd = sc.cassandraTable("foo", "bar")
    val date = DateTime.now().minusDays(30)
    rdd.filter(r => r.getDate("date").after(date.toDate)).count // Count Filtered RDD
    

    所以要小心。 RDD 是不可变的,因此当您应用过滤器时,您需要使用返回的 RDD,而不是您应用该函数的那个​​。


    val rdd = sc.cassandraTable("foo", "bar")
    val date = DateTime.now().minusDays(30)
    rdd.filter(r => r.getDate("date").after(date.toDate)) // Filters RDD
    println(rdd.cassandraCount()) // Ignores filtered rdd and counts everything
    

    为了提高阅读 Cassandra 的效率:

    如果您的日期列是集群键,您可以使用 .where 函数将谓词下推到 Cassandra。除此之外,您无能为力来修剪数据服务器端。

    https://github.com/datastax/spark-cassandra-connector/blob/master/doc/3_selection.md#filtering-rows---where

    【讨论】:

    • 如何检查日期列是否为集群键?有什么我可以发出的命令吗?
    • 我尝试了您的建议,但将过滤器的结果分配给 rdd2 然后对其进行计数。但它仍然在说Finished task 4.0 in stage 0.0 (TID 4) in 112031 ms on localhost (5/1350)
    • Clustering key 是一个在 Cassandra 中组织磁盘信息的概念。这是 Cassandra Schema 的核心方面。由于您没有发布代码,因此我无法回答为什么要花费任何时间。您应该看到它运行了许多任务。但是几乎没有情况会比没有下推的全表扫描慢。
    猜你喜欢
    • 2021-11-21
    • 2015-09-11
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 2016-06-23
    • 2020-12-14
    • 2017-12-12
    相关资源
    最近更新 更多