硬件配置
一个常见的问题是Spark开发者如何配置硬件。虽然合适的硬件将取决于具体情况,我们提出以下建议。
存储系统
因为大多数 Spark 作业可能需要从外部存储系统(例如 Hadoop 文件系统或 HBase)读取输入数据,因此将其 尽可能靠近该系统 是很重要的。我们推荐以下做法:
-
如果可能的话,在与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 到数百吉字节 的内存良好运行。在所有情况下,我们建议仅分配最多75%的内存给Spark;将其余内存留给操作系统和缓冲区缓存。
你需要多少内存将取决于你的应用程序。要确定你的应用程序在某个数据集大小下使用了多少内存,可以将部分数据集加载到 Spark RDD 中,并使用 Spark 的监控 UI 的 Storage 选项卡 (
http://
) 查看其在内存中的大小。请注意,内存使用情况受到存储级别和序列化格式的严重影响 – 请参阅
调优指南
以获取如何减少内存使用的建议。
最后,请注意,Java VM 并不总是能够很好地处理超过 200 GiB 的 RAM。如果您购买的机器拥有超过这个数量的 RAM,您可以在单个节点中启动多个执行器。在 Spark 的 独立模式 中,一个工作节点负责根据其可用的内存和核心数量启动多个执行器,每个执行器将在一个单独的 Java VM 中启动。
网络
根据我们的经验,当数据在内存中时,许多Spark应用程序是网络受限的。使用
10 Gigabit
或更高的网络是加快这些应用程序的最佳方式。这一点对于“分布式归约”应用程序尤其正确,例如分组、归约和SQL连接。在任何给定的应用程序中,您可以通过应用程序的监控UI查看Spark在网络上移动了多少数据(
http://
)。
CPU 核心
Spark 在每台机器上可以很好地扩展到数十个 CPU 内核,因为它在线程之间执行最小的共享。您可能需要为每台机器配置至少 8-16 个核心 。根据您的工作负载的 CPU 成本,您可能还需要更多:一旦数据在内存中,大多数应用程序要么受制于 CPU,要么受制于网络。