Spark可调参数特别是执行程序 - 内存

时间:2016-06-16 14:40:56

标签: python hadoop apache-spark

time ../bin/spark-submit --master yarn --deploy-mode cluster --driver-memory 2g --executor-memory 3G --num-executors 100 /var/tmp/learning/Movie-Similarities-1m-hdfs.py 260

采取:6m5.293s

time ../bin/spark-submit --master yarn --deploy-mode cluster --driver-memory 2g --executor-memory 2G --num-executors 100 /var/tmp/learning/Movie-Similarities-1m-hdfs.py 260

采取:5m46.234s

time ../bin/spark-submit --master yarn --deploy-mode cluster --driver-memory 3g --executor-memory 4G --num-executors 100 /var/tmp/learning/Movie-Similarities-1m-hdfs.py 260​

采取:9m35.313s

我知道我(有意)在num-executors上超额认购,这只是为了充分利用群集。

对这些结果的任何观察?

1 个答案:

答案 0 :(得分:0)

  

对这些结果的任何观察?

与更少的执行程序(具有更多内存)相比,您的代码运行速度更快,执行程序更多(内存更少)。通常存在最佳平衡,这取决于工作流程和群集的硬件。真正找到这个最佳点的唯一方法是通过反复试验。

也就是说,我通常会发现更少的执行器具有更多的资源,通常表现更好。您未尝试控制的一件事是执行程序将使用的CPU核心数。为了启动执行程序,需要有足够的可用内存和足够的CPU内核。如果两个测试都受内存限制(例如,资源管理器在内核耗尽之前内存不足),则2G执行器测试将使用两倍于4G测试的CPU内核。如果两个测试都是CPU核心绑定,那么4G测试将使用2G测试的两倍内存。

长话短说,考虑每个执行者获得的核心数量是值得的。我创建了一个spreadsheet,可以帮助您管理这些权衡。