添加更多节点会降低 spark 集群性能

spark cluster performance decreases by adding more nodes

我有一个 1B 记录的大数据集,并且想 运行 使用 Apache spark 进行分析,因为它提供了缩放功能,但我在这里看到了一个反模式。我添加到 spark 集群的节点越多,完成时间就越长。数据存储是 Cassandra,查询是 Zeppelin 的 运行。我尝试了很多不同的查询,但即使是 dataframe.count() 的简单查询也会这样。

这里是 zeppelin notebook,temp table 有 18M 记录

val df = sqlContext
  .read
  .format("org.apache.spark.sql.cassandra")
  .options(Map( "table" -> "temp", "keyspace" -> "mykeyspace"))
  .load().cache()
df.registerTempTable("table")

%sql 
SELECT first(devid),date,count(1) FROM table group by date,rtu order by date

当针对不同的编号进行测试时。这些是 spark worker 节点的结果

+-------------+---------------+
| Spark Nodes |      Time     |
+-------------+---------------+
| 1 node      | 17 min 59 sec |
| 2 nodes     | 12 min 51 sec |
| 3 nodes     | 15 min 49 sec |
| 4 nodes     | 22 min 58 sec |
+-------------+---------------+

增加数量。节点会降低性能。这不应该发生,因为它违背了使用 Spark 的目的。

如果您希望我 运行 关于设置的任何疑问或更多信息,请询问。 关于为什么会发生这种情况的任何线索都会非常有帮助,现在已经坚持了两天。谢谢你的时间。

版本

Zeppelin: 0.7.1, Spark: 2.1.0, Cassandra: 2.2.9, Connector: datastax:spark-cassandra-connector:2.0.1-s_2.11

Spark 集群规格

6 vCPUs, 32 GB memory = 1 node

Cassandra + Zeppelin 服务器规格

8 vCPUs, 52 GB memory

需要考虑的一件事是,在某个时刻,您可能会用请求压倒 Cassandra 集群。如果不扩展等式的 Cassandra 端,您可以很容易地看到减少 returns,因为 C* 最终花费太多时间拒绝请求。

这基本上就是人月谬误。仅仅因为您可以投入更多的工作人员解决问题并不一定意味着项目可以更快地完成。

单独对查询的不同部分进行基准测试对您非常有益。目前,当您设置时,整个数据集都在读取时缓存,如果您正在对单个请求进行基准测试,这会增加额外的速度。

您应该单独进行基准测试

  • 不缓存从C*读取(直接从C*算)
  • 缓存成本(缓存后计算)
  • 您 运行ning 的随机查询的成本(来自缓存 运行 查询)

然后您可以找出瓶颈所在并适当扩展。