Sil*_*ear 5 python performance cassandra apache-spark apache-spark-sql
我正在使用 Spark Cassandra 连接器和 python 中的数据帧制作一个小型 Spark 应用程序,但写入速度极低。当我查看应用程序日志时,它显示:
17/03/28 20:04:05 INFO TableWriter: Wrote 315514 rows to movies.moviescores in 662.134 s.
Run Code Online (Sandbox Code Playgroud)
大约每秒 474 行。
我正在将 Cassandra 中的一些数据读入表中,然后对它们进行一些操作(这也使集合变得更大)。然后我将结果写回 cassandra(大约 5000 万行):
result.write.format("org.apache.spark.sql.cassandra").mode('append').options(table="moviescores", keyspace="movies").save()
Run Code Online (Sandbox Code Playgroud)
其中结果是数据框。
如果重要的话,这是我的密钥空间的创建:
CREATE KEYSPACE IF NOT EXISTS movies WITH REPLICATION = { \'class\' : \'NetworkTopologyStrategy\', \'datacenter1\' : 3 };
Run Code Online (Sandbox Code Playgroud)
我正在写的表:
CREATE TABLE IF NOT EXISTS movieScores(movieId1 int, movieId2 int, score int, PRIMARY KEY((movieId1, movieId2)));
Run Code Online (Sandbox Code Playgroud)
我的设置如下:我有 5 个 Spark 工作线程在 Docker 容器中运行,每个容器都在运行 CoreOS 的不同节点上,具有 2 GB RAM 和在 Digitalocean 上运行的 2 个内核。在 Docker 容器中运行的 3 个 Cassandra 节点,每个节点都在运行 CoreOS 的不同节点上,具有 2 GB 内存和在 Digitalocean 上运行的 2 个内核。
运行 Spark 的节点有 2 GB RAM,但它们最多只能使用 1 GB,因为这是 Sparks 独立模式的默认设置:
(default: your machine's total RAM minus 1 GB)
Run Code Online (Sandbox Code Playgroud)
不确定提出这个是否明智。
现在我了解到我应该在 Digital Ocean 集群中的每个节点上运行 Spark Worker 和 Cassandra 节点。但我不确定在只有 2 个核心的 2GB 机器上运行一个带有 Spark 的 Docker 容器和另一个带有 Cassandra 节点的容器是否是一个好主意。
为什么写的这么慢?为了提高写入速度,我是否应该更改/设置某些参数/设置?也许我的设置全错了?我对 Spark 和 Cassandra 还很陌生。
更新:我刚刚在没有 Spark 的同一张表上进行了测试,仅使用 Python 的 Cassandra 连接器和笔记本电脑上的一个小型 Python 程序。我使用批量插入 1000 行,只需 35 秒即可插入 100 万行,几乎每秒 30000 行,速度更快。因此,问题可能是 Spark,而不是 Cassandra。也许将我的其余代码放在这里是有意义的?或者我的设置可能有问题?
小智 0
我最近在向 Cassandra 保存超过 8000 万条记录时遇到了类似的问题。就我而言,我使用 Spark Java API。帮助解决我的问题的是,我在数据集上应用了 orderBy(),然后通过 Spark-cassandra-connector 将其保存到 Cassandra。尝试先订购数据集,然后 save() 到 Cassandra。