我正在使用Spark中的Spark Cassandra连接器和数据帧制作一个小型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工作器在Docker容器中运行,每个工作在运行CoreOS的不同节点上,内存为2 GB,在Digitalocean上运行2个内核 . 3个在Docker Containers中运行的Cassandra节点,每个节点都在运行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节点 . 但是我不确定在2GB机器上只运行2个内核的情况下运行带有Spark的Docker容器和带有Cassandra节点的另一个Container是不是一个好主意 .

为什么写得那么慢?我是否应该更改/设置参数/设置以提高写入速度?也许我的设置都错了?我是Spark和Cassandra的新手 .

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