硬件配置

Spark 开发者经常收到的一个问题是如何配置硬件。虽然合适的硬件取决于具体情况,但我们提出以下建议。

存储系统

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

本地磁盘

虽然 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 时并不总是表现良好。 如果您购买的机器具有比这更多的 RAM,您可以在单个节点中启动多个执行器。 在 Spark 的独立模式中,worker 负责根据其可用内存和内核启动多个执行器,并且每个执行器将在单独的 Java VM 中启动。

网络

根据我们的经验,当数据在内存中时,许多 Spark 应用程序都受到网络限制。 使用 **10 Gigabit** 或更高的网络是使这些应用程序更快的最佳方法。 对于诸如 group-by、reduce-by 和 SQL joins 之类的“分布式 reduce”应用程序尤其如此。 在任何给定的应用程序中,您可以从应用程序的监控 UI (http://<driver-node>:4040) 中查看 Spark 在网络上混洗了多少数据。

CPU 核心

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