您的位置:首页 > 其它

Spark集群硬件配置

2017-05-02 13:34 316 查看
本文翻译自Spark官方网站,原文链接:http://spark.apache.org/docs/latest/hardware-provisioning.html

部分内容采用意译的方式翻译,如有疏漏错误之处,欢迎批评指正。

Spark集群硬件配置

Spark开发人员经常遇到的一个问题是如何为Spark集群配置硬件。 虽然正确的硬件配置将取决于具体情况,但我们给出以下几点建议。

存储系统

因为大多数Spark作业可能需要从外部存储系统(例如Hadoop文件系统或HBase)读取输入数据,所以要让Spark计算引擎尽可能靠近数据持久层。我们建议如下:

1、 如果可能,直接在HDFS相同的节点上运行Spark。最简单的方法是在相同的集群上以standalone模式部署Spark集群,并配置Spark和Hadoop的内存和CPU使用率以避免干扰(对于Hadoop,用mapred.child.java.opts配置每个任务的可用内存,用mapred.tasktracker.map.tasks.maximum和mapred.tasktracker.reduce.tasks.maximum限制任务的个数)。 或者,您可以在Mesos或Hadoop YARN这样的常见集群管理器上运行Hadoop和Spark。

2、 如果无法做到第一点,请尽量使运行Spark的节点与HDFS处于相同的局域网中。

3、 对于具有低延迟特性的持久层(如HBase),优先在与存储系统不同的节点上运行计算任务以避免干扰。

本地磁盘

虽然Spark可以在内存中执行大量的计算,但它仍然可能会使用本地磁盘来存储不适用于RAM的数据(译者注:有关数据持久化级别的叙述详见“编程指南”),以及在stage之间保留中间输出。我们建议每个节点配置4-8个磁盘,不需要配置RAID(磁盘阵列)(即每个磁盘单独的挂载即可)。在Linux中,使用noatime选项挂载磁盘,以减少不必要的写入操作。
在Spark中,可以将spark.local.dir变量配置为多个本地磁盘的地址,多个地址之间以逗号分隔。如果您正在运行HDFS,最好使用与HDFS存储数据相同的磁盘。

内存

一般来说,Spark可以在每台机器配置8 GB到数百GB内存的集群上良好运行。我们强烈建议为Spark分配的内存容量不大于机器总内存容量的75%;确保为操作系统和缓冲区留下足够的内存。

最终需要多少内存将取决于您的应用程序。要确定应用程序在处理特定数据集时所需的内存容量,请在Spark RDD中加载部分数据集,并使用Spark的UI(http:// <driver-node>:4040)的“Storage”选项卡查看其占用的内存大小。请注意,内存使用受到存储级别和序列化格式的极大影响 - 有关如何减少内存使用的技巧,请参阅“优化指南”。

最后,请注意,当内存容量超过200GB时Java 虚拟机的性能表现会不稳定。如果您购买的RAM大于200G,则可以为每个节点运行多个worker JVM。在Spark的standalone模式下,您可以通过conf / spark-env.sh中的SPARK_WORKER_INSTANCES变量设置每个节点运行的worker进程数,以及通过SPARK_WORKER_CORES变量设置每个worker可用的cpu核心数。

网络

根据我们的经验,当数据已经存储在内存中时,很多Spark应用程序的性能瓶颈在于网络的传输速率。使用带宽大于10G的网络是使这些应用程序运行更快速的最佳方式。对于涉及“分布式聚合(distributedreduce)”的操作,如group-bys,,reduce-bys, and SQL join等操作尤其如此。 在应用程序运行的过程中,您可以从应用程序的监视UI(http:// <driver-node>:4040)中查看Spark应用在网络上传输了多少数据量。

CPU核心

Spark在每台机器配置几十个CPU内核的集群上也能够有很好的表现,因为Spark极少跨越线程进行数据处理。您应该为每台机器至少配置8-16个内核。根据您的Spark作业的CPU负载情况,您可能还需要更高的配置:一旦数据已经在内存中,大多数应用程序的性能瓶颈在于CPU或网络带宽。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spark 硬件 配置