硬件配置

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

存储系统

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

本地磁盘

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

内存

一般来说,Spark可以在每台机器上使用从 8 GiB 到数百吉字节 的内存良好运行。在所有情况下,我们建议仅分配最多75%的内存给Spark;将其余内存留给操作系统和缓冲区缓存。

你需要多少内存将取决于你的应用程序。要确定你的应用程序在某个数据集大小下使用了多少内存,可以将部分数据集加载到 Spark RDD 中,并使用 Spark 的监控 UI 的 Storage 选项卡 ( http:// :4040 ) 查看其在内存中的大小。请注意,内存使用情况受到存储级别和序列化格式的严重影响 – 请参阅 调优指南 以获取如何减少内存使用的建议。

最后,请注意,Java VM 并不总是能够很好地处理超过 200 GiB 的 RAM。如果您购买的机器拥有超过这个数量的 RAM,您可以在单个节点中启动多个执行器。在 Spark 的 独立模式 中,一个工作节点负责根据其可用的内存和核心数量启动多个执行器,每个执行器将在一个单独的 Java VM 中启动。

网络

根据我们的经验,当数据在内存中时,许多Spark应用程序是网络受限的。使用 10 Gigabit 或更高的网络是加快这些应用程序的最佳方式。这一点对于“分布式归约”应用程序尤其正确,例如分组、归约和SQL连接。在任何给定的应用程序中,您可以通过应用程序的监控UI查看Spark在网络上移动了多少数据( http:// :4040 )。

CPU 核心

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