卡桑德拉火花慢写道

时间:2017-03-28 21:03:00

标签: python performance apache-spark cassandra spark-dataframe

我正在使用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。也许将其余的代码放在这里是有意义的吗?或者我的设置可能有问题?

1 个答案:

答案 0 :(得分:0)

我最近在将超过8000万条记录保存到Cassandra时遇到了类似的问题。就我而言,我使用了Spark Java API。帮助解决我的问题的方法是,在将数据通过order-By()通过spark-cassandra-connector保存到Cassandra之前,对它进行了设置。尝试先对数据集进行排序,然后将()保存到Cassandra。