我正在使用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()
其中结果是一个数据框。
以下是我的键空间的创建方式,如果有关系:
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工作节点在不同的节点上运行,每个节点都在Digitalocean上以CoreOS为基础运行,具有2GB的RAM和2个内核。它们都在Docker容器中运行。 3个Cassandra节点在不同的节点上运行,每个节点都在Digitalocean上以CoreOS为基础运行,具有2GB的RAM和2个内核。它们也都在Docker容器中运行。
运行Spark的节点拥有2GB的RAM,但是它们只能使用1GB,因为这是Standalone模式下Spark的默认设置。
(default: your machine's total RAM minus 1 GB)
我不确定提出这个问题是否明智。
现在我已经阅读到应该在我的 Digital Ocean 集群中的每个节点上运行一个 Spark Worker 和一个 Cassandra 节点。但是,我不确定在只有 2GB 内存和 2 个内核的机器上同时运行一个带有 Spark 的 Docker 容器和另一个带有 Cassandra 节点的容器是否是个好主意。
为什么写入速度很慢?是否有一些参数/设置需要更改/设置才能增加写入速度?也许我的设置都是错的?我对 Spark 和 Cassandra 都很陌生。
更新:我刚刚在同一张表上进行了一个测试,没有使用 Spark,只是在我的笔记本电脑上使用 Python 的 Cassandra 连接器和一小段 Python 程序。我使用了批量插入,每次插入 1000 行,我只用了 35 秒就可以插入 100 万行,这几乎是每秒 30000 行,速度非常快。所以也许问题不是出在 Cassandra 上而是出在 Spark 上。也许在这里放置我代码的其余部分会有意义?或者也许我的设置存在问题?