我正在为Spark 2.0.2运行一个简单的性能测试from here我在具有4核和16GB内存的笔记本电脑上使用Pi Estimation示例:
$ ./bin/spark-shell --master=local[1] --name=shell_1
scala> val NUM_SAMPLES=160000000
NUM_SAMPLES: Int = 160000000
然后我复制/粘贴Pi计算代码。
val count = sc.parallelize(1 to NUM_SAMPLES).map{i =>
val x = Math.random()
val y = Math.random()
if (x*x + y*y < 1) 1 else 0
}.reduce(_ + _)
println("Pi is roughly " + 4.0 * count / NUM_SAMPLES)
以下是我的结果:
$ ./bin/spark-shell --master=local[1] --name=shell_1
12 sec
$ ./bin/spark-shell --master=local[2] --name=shell_2
22 sec
$ ./bin/spark-shell --master=local[4] --name=shell_4
40 sec
$ ./bin/spark-shell --master=local[8] --name=shell_8
45 sec
我没有看到Spark如何根据内核数量进行扩展,显然随着执行器内核数量的增加,性能明显下降。我知道这可能不是一个有效的测试,因为配置不是真正的分布式,但我很想听听这种行为的解释。
答案 0 :(得分:2)
说明计划是什么样的?您是否尝试过分析?我怀疑您遇到了I / O瓶颈。 Spark喜欢将其改组到磁盘,并且没有针对本地模式的内存改组优化。这会伤害想要通过怪物硬件在单个节点上垂直扩展的用户。确保将随机排序分区配置为较小的数量。对于较小规模的数据,默认值为废话。如果您负担得起内存,请确保将本地/临时目录安装到基于SSD或RAM的卷上。