Cassandra Spark 写入缓慢

Posted

技术标签:

【中文标题】Cassandra Spark 写入缓慢【英文标题】:Cassandra Spark slow writes 【发布时间】:2017-08-22 03:16:56 【问题描述】:

我正在使用 Spark Cassandra 连接器和 python 中的数据帧制作一个小型 Spark 应用程序,但我的写入速度极低。当我查看应用程序日志时,它说:

17/03/28 20:04:05 INFO TableWriter: Wrote 315514 rows to movies.moviescores in 662.134 s.    

这大约是每秒 474 行。

我正在从 Cassandra 读取一些数据到一个表中,然后对它们进行一些操作(这也使集合变得更大)。然后我将结果写回 cassandra(大约 5000 万行):

result.write.format("org.apache.spark.sql.cassandra").mode('append').options(table="moviescores", keyspace="movies").save()

其中 result 是一个数据框。

如果重要的话,这里是我的键空间的创建:

CREATE KEYSPACE IF NOT EXISTS movies WITH REPLICATION =  \'class\' : \'NetworkTopologyStrategy\', \'datacenter1\' : 3 ;

还有我要写信给的表:

CREATE TABLE IF NOT EXISTS movieScores(movieId1 int, movieId2 int, score int, PRIMARY KEY((movieId1, movieId2)));

我的设置如下: 我有 5 个 Spark 工作人员在 Docker 容器中运行,每个工作人员在运行 CoreOS 的不同节点上运行,具有 2 GB 的 RAM 和在 Digitalocean 上运行的 2 个内核。 3 个 Cassandra 节点在 Docker 容器中运行,每个节点在不同的节点上运行 CoreOS,2 GB 内存和 2 个内核在 Digitalocean 上运行。

运行 Spark 的节点有 2 GB 的 RAM,但它们最多只能使用 1 GB,因为这是 Sparks 独立模式的默认设置:

(default: your machine's total RAM minus 1 GB)

不确定提出这个是否明智。

现在我读到我应该在我的 Digital Ocean 集群的每个节点上运行一个 Spark Worker 和一个 Cassandra 节点。但我不确定在只有 2 个内核的 2GB 机器上运行一个带有 Spark 的 Docker 容器和另一个带有 Cassandra 节点的容器是否是个好主意。

为什么写得这么慢?是否有我应该更改/设置以提高写入速度的参数/设置?也许我的设置全错了?我对 Spark 和 Cassandra 很陌生。

更新:我刚刚在没有 Spark 的情况下在同一张桌子上进行了测试,只使用了适用于 Python 的 Cassandra 连接器和我笔记本电脑上的一个小型 Python 程序。我使用批量插入 1000 行,我可以在 35 秒内插入 100 万行,这几乎是每秒 30000 行,速度更快。所以也许 Spark 是问题所在,而不是 Cassandra。将我的其余代码放在这里可能有意义吗?还是我的设置有问题?

【问题讨论】:

This 可能会对您有所帮助。虽然这是旧答案,但我会尝试使用最近遇到的一些其他提示来更新或编写新答案。 谢谢,但我只是在没有 Spark 的情况下在同一张桌子上进行了测试,只使用了用于 Python 的 Cassandra 连接器和笔记本电脑上的一个小型 Python 程序。我使用批量插入 1000 行,我可以在 35 秒内插入 100 万行,这几乎是每秒 30000 行,速度更快。所以问题可能是 Spark,而不是 Cassandra。 太棒了。要验证 spark 是瓶颈,请尝试测量 spark 吞吐量。 如果这是一个愚蠢的问题,我很抱歉,但是最好的方法是什么?我正在运行一个 Spark 独立集群。此外,如果我进入 Digitalocean 上的仪表板,我可以看到 spark 节点在每个节点上的 CPU 使用率约为 90%。不确定这是否可以。 我刚刚通过使用单个工作人员在本地运行 spark 集群进行了另一项测试,它同样慢,因此问题似乎不在云设置中。我怎么能以每秒 3 万条记录的速度直接写入 Cassandra,但是一旦我使用 Spark 和 Cassandra 连接器,它就会变得昏昏欲睡? 【参考方案1】:

我最近在将超过 8000 万条记录保存到 Cassandra 时遇到了类似的问题。就我而言,我使用了 Spark Java API。帮助解决我的问题的是我在通过 spark-cassandra-connector 将其保存到 Cassandra 之前在数据集上应用了 orderBy()。尝试先订购数据集,然后将 save() 保存到 Cassandra。

【讨论】:

以上是关于Cassandra Spark 写入缓慢的主要内容,如果未能解决你的问题,请参考以下文章

Spark-Cassandra 写入所需的时间比预期的要长

Spark Streaming:读取和写入状态信息到外部数据库,如 cassandra

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

如何在spark中读写cassandra数据

Meet Professor Cassandra Fraser

低cassandra写入/秒,6个节点集群中每秒1500-2000次写入