Spark 开发者都会遇到一个常见问题,那就是如何为 Spark 配置硬件。然而正确的硬件配置取决于使用的场景,我们提出以下建议。
因为大多数 Spark 作业都很可能必须从外部存储系统(例如 Hadoop 文件系统或者 HBase)读取输入的数据,所以部署 Spark 时尽可能靠近这些系统是很重要的。我们建议如下 :
一般来说,Spark 可以在每台机器 8GB 到数百 GB 内存的任何地方正常运行。在所有情况下,我们建议只为 Spark 分配最多75% 的内存;其余部分供操作系统和缓存区高速缓存存储器使用。
您需要多少内存取决于您的应用程序。如果您需要确定的应用程序中某个特定数据集占用内存的大小,您可以把这个数据集加载到一个 Spark RDD 中,然后在 Spark 监控 UI 页面(http://<driver-node>:4040)中的 Storage 选项卡下查看它在内存中的大小。需要注意的是,存储级别和序列化格式对内存使用量有很大的影响 - 如何减少内存使用量的建议,请参阅调优指南。
最后,需要注意的是 Java 虚拟机在超过 200GB 的 RAM 时表现得并不好。如果您购置的机器有比这更多的 RAM ,您可以在每个节点上运行多个 Worker 的 JVM 实例。在 Spark 的独立模式下,您可以通过 conf/spark-env.sh 中的 SPARK_WORKER_INSTANCES 和 SPARK_WORKER_CORES 两个参数来分别设置每个节点的 Worker 数量和每个 Worker 使用的 Core 数量。
根据我们的经验,当数据在内存中时,很多 Spark 应用程序跟网络有密切的关系。使用 10 千兆位以太网或者更快的网络是让这些应用程序变快的最佳方式。这对于 “distributed reduce” 类的应用程序来说尤其如此,例如 group-by 、reduce-by 和 SQL join。任何程序都可以在应用程序监控UI 页面(http://<driver-node>:4040)中查看 Spark 通过网络传输的数据量。
因为 Spark 实行线程之间的最小共享,所以 Spark 可以很好地在每台机器上扩展数十个 CPU Core。您应该为每台机器至少配置 8-16 个 Core。根据您工作负载的 CPU 成本,您可能还需要更多 : 当数据都在内存中时,大多数应用程序就只跟 CPU 或者网络有关了。