我正在使用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。也许将其余的代码放在这里是有意义的吗?或者我的设置可能有问题?
答案 0 :(得分:0)
我最近在将超过8000万条记录保存到Cassandra时遇到了类似的问题。就我而言,我使用了Spark Java API。帮助解决我的问题的方法是,在将数据通过order-By()通过spark-cassandra-connector保存到Cassandra之前,对它进行了设置。尝试先对数据集进行排序,然后将()保存到Cassandra。