硬件配置
Spark 开发人员经常会问到如何配置硬件。虽然合适的硬件取决于具体情况,但我们建议如下。
存储系统
由于大多数 Spark 作业可能需要从外部存储系统(例如 Hadoop 文件系统或 HBase)读取输入数据,因此将 Spark 尽可能靠近该系统非常重要。我们建议如下
-
如果可能,在与 HDFS 相同的节点上运行 Spark。最简单的方法是在相同的节点上设置 Spark 独立模式集群,并配置 Spark 和 Hadoop 的内存和 CPU 使用情况,以避免干扰(对于 Hadoop,相关的选项是
mapred.child.java.opts
用于每个任务的内存,以及mapreduce.tasktracker.map.tasks.maximum
和mapreduce.tasktracker.reduce.tasks.maximum
用于任务数量)。或者,您可以在像 Mesos 或 Hadoop YARN 这样的通用集群管理器上运行 Hadoop 和 Spark。 -
如果这不可行,请在与 HDFS 相同的局域网中的不同节点上运行 Spark。
-
对于像 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 时并不总是表现良好。如果您购买了内存超过此值的机器,您可以在单个节点中启动多个执行器。在 Spark 的 独立模式 中,一个工作器负责根据其可用内存和内核启动多个执行器,每个执行器将在单独的 Java VM 中启动。
网络
根据我们的经验,当数据在内存中时,许多 Spark 应用程序都是网络绑定的。使用 10 Gigabit 或更高的网络是使这些应用程序更快运行的最佳方法。对于“分布式归约”应用程序(例如分组、归约和 SQL 联接)尤其如此。在任何给定的应用程序中,您都可以从应用程序的监控 UI (http://<driver-node>:4040
) 中看到 Spark 在网络中传输了多少数据。
CPU 内核
Spark 可以很好地扩展到每台机器数十个 CPU 内核,因为它在线程之间执行最少的共享。您可能需要为每台机器配置至少 8-16 个内核。根据工作负载的 CPU 成本,您可能还需要更多:一旦数据在内存中,大多数应用程序要么是 CPU 绑定的,要么是网络绑定的。