硬件配置

Spark 开发人员经常会问到如何配置硬件。虽然合适的硬件取决于具体情况,但我们建议如下。

存储系统

由于大多数 Spark 作业可能需要从外部存储系统(例如 Hadoop 文件系统或 HBase)读取输入数据,因此将 Spark 尽可能靠近该系统非常重要。我们建议如下

本地磁盘

虽然 Spark 可以执行大部分计算在内存中,但它仍然使用本地磁盘来存储不适合 RAM 的数据,以及保存阶段之间的中间输出。我们建议每个节点有 4-8 个磁盘,配置为 不使用 RAID(只是作为单独的挂载点)。在 Linux 中,使用 noatime 选项挂载磁盘,以减少不必要的写入。在 Spark 中,配置 spark.local.dir 变量为本地磁盘的逗号分隔列表。如果您正在运行 HDFS,可以使用与 HDFS 相同的磁盘。

内存

一般来说,Spark 可以很好地运行,每台机器的内存从 8 GiB 到数百 GB 不等。在所有情况下,我们建议只为 Spark 分配最多 75% 的内存;将剩余的内存留给操作系统和缓冲区缓存。

您需要的内存量将取决于您的应用程序。要确定您的应用程序在特定数据集大小下使用多少内存,请在 Spark RDD 中加载数据集的一部分,并使用 Spark 监控 UI 的“存储”选项卡 (http://<driver-node>:4040) 查看其在内存中的大小。请注意,内存使用量受存储级别和序列化格式的影响很大 - 请参阅 调优指南,了解如何减少内存使用量的提示。

最后,请注意,Java VM 在使用超过 200 GiB 的 RAM 时并不总是表现良好。如果您购买了内存超过此值的机器,您可以在单个节点中启动多个执行器。在 Spark 的 独立模式 中,一个工作器负责根据其可用内存和内核启动多个执行器,每个执行器将在单独的 Java VM 中启动。

网络

根据我们的经验,当数据在内存中时,许多 Spark 应用程序都是网络绑定的。使用 10 Gigabit 或更高的网络是使这些应用程序更快运行的最佳方法。对于“分布式归约”应用程序(例如分组、归约和 SQL 联接)尤其如此。在任何给定的应用程序中,您都可以从应用程序的监控 UI (http://<driver-node>:4040) 中看到 Spark 在网络中传输了多少数据。

CPU 内核

Spark 可以很好地扩展到每台机器数十个 CPU 内核,因为它在线程之间执行最少的共享。您可能需要为每台机器配置至少 8-16 个内核。根据工作负载的 CPU 成本,您可能还需要更多:一旦数据在内存中,大多数应用程序要么是 CPU 绑定的,要么是网络绑定的。