Spark 的 Cassandra 数据聚合

Posted

技术标签:

【中文标题】Spark 的 Cassandra 数据聚合【英文标题】:Cassandra data aggregation by Spark 【发布时间】:2015-05-19 14:07:20 【问题描述】:

我想通过cassandra spark 连接器使用服务器端数据选择和过滤。事实上,我们有许多传感器每 1 秒发送一次值,我们对这些使用月、日、小时等的数据聚合感兴趣, 我提出了以下数据模型:

CREATE TABLE project1(      
      year int,
      month int,
      load_balancer int,
      day int,
      hour int,
      estimation_time timestamp,
      sensor_id int,
      value double, 
      ...
      PRIMARY KEY ((year, month, load_balancer), day, hour, estimation_time, sensor_id)

然后,我们有兴趣获取 2014 年 12 月 - 负载均衡器 IN (0,1,2,3) 的数据聚合。所以它们是4 个不同的分区

我们使用的是cassandra spark 连接器版本 1.1.1,并且我们使用按查询组合来获取按小时聚合的所有值。

所以对于 4,341,390 个元组的处理时间,spark 需要 11 分钟才能返回结果。 现在的问题是我们使用 5 个节点,但是 spark 只使用一个工作人员来执行任务。 您能否建议更新查询或数据模型以提高性能?

【问题讨论】:

你找到解决办法了吗? 当使用 sensor_id 作为分区键时,将使用所有节点(我们大约有 500 个传感器)。但是,在提议的模型中,我不知道为什么它们不是 4 个工作。可能是因为他们在同一个节点! 您是否确认您的数据仅存储在 1 个节点上? (这听起来很奇怪和不平衡)你也可以显示你的火花代码吗? @Zerd1984 如何检查数据是否在一个节点中?如果是跟踪 cassandra 查询,我认为它是分布式的。 Cassandra trace 。关于 Spark 代码,我正在使用这个code @Wassim 你可以使用“nodetool getendpoints keyspace table partitionkey”来查看你的分区存储在哪里 【参考方案1】:

Spark Cassandra 连接器有这个功能,它是SPARKC-25。您可以只创建一个带有值的任意 RDD,然后将其用作键源以从 Cassandra 表中获取数据。或者换句话说 - 将任意 RDD 加入 Cassandra RDD。在您的情况下,该任意 RDD 将包含 4 个具有不同负载均衡器值的元组。查看documentation 了解更多信息。 SCC 1.2 最近发布了,它可能与 Spark 1.1 兼容(不过它是为 Spark 1.2 设计的)。

【讨论】:

以上是关于Spark 的 Cassandra 数据聚合的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Cassandra 内部不支持聚合?

如何在spark中读写cassandra数据

在 Cassandra 中使用轻量级事务 (CAS) 时,我们如何避免丢失写入?

Spark-Cassandra 与 Spark-Elasticsearch

spark如何在cassandra表之间复制数据?

Spark 和 Cassandra:推荐的接口方式