Spark集群硬件配置参考

来源:互联网 发布:linux启动stage 编辑:程序博客网 时间:2024/06/04 19:14

Spark集群硬件配置参考

标签(空格分隔): Spark


硬件配置

Spark开发人员面临的最常见一个问题就是集群的配置硬件。一般来说,合理的硬件配置取决于自身的实际情况,我们只能从以下几个方面提出建议。

存储系统

大部分的Spark作业会从外部存储系统(比如Hadoop文件系统或者Hbase)读取输入数据,因此将其与存储系统放得越近越好,我们给出如下建议:

如果可能的话,在与HDFS相同的节点上运行Spark。最简单的方法是在相同的节点上安装Spark standalone模式集群,并配置Spark和Hadoop的内存和CPU,以避免干扰 (对于Hadoop来说,相关的选项是:每个任务的内存配置是mapred.child.java.opts,任务数的配置是mapred.tasktracker.map.tasks.maximummapred.tasktracker.reduce.tasks.maximum)。你也可以在集群管理器上运行Hadoop和Spark,比如Mesos或Hadoop YARN。

如果这个没办法实现,那么Spark集群要与HDFS在同一局域网。

对于像HBase这样的低延迟数据存储,在不同的节点上运行计算作业可能比存储系统更容易,以避免干扰。

本地磁盘

虽然Spark很多计算都在内存中进行,但当数据在内存中装不下的时候,它仍然使用本地磁盘来存储数据,以及在不同阶段之间保留中间的输出也需要磁盘存储。我们建议每个节点有4-8个磁盘,不做RAID(就像单独的挂载点一样)。在Linux中,用noatime选项挂载磁盘,以减少不必要的写操作。在Spark中,将多个挂载的磁盘配置在spark.local.dir变量中,用逗号分隔。如果你正在运行HDFS,那么可以使用与HDFS相同的磁盘。

内存

一般来说,每台机器上8GB到几百GB的内存,Spark都可以运行的很好。如果考虑所有情况,我们建议在Spark中最多分配75%的内存,剩下的部分留给操作系统和缓冲区缓存。

需要多少内存取决于你的应用程序。想要确定你的应用程序在某个数据集下对内存的使用情况,将数据集的一部分加载到RDD中,并使用Spark的监视UI(http://<driver-node>:4040)的Storage选项卡来查看内存使用情况。需要注意一点,内存使用情况受存储等级和序列化格式的影响很大,请参阅有关如何减少它的提示的调优指南。

最后请注意,内存超过200GB时,Java虚拟机运行状况并不是总是那么良好。如果你购买的机器内存很大,超过了200G,那么可以在每个节点上运行多个Worker。在Spark的Standalone模式中,你可以使用conf/spark-env.sh中通过SPARK_WORKER_INSTANCES变量来配置每个节点的worker数量,用SPARK_WORKER_CORES配置每个worker的CPU核心数目。

网络

根据我们的经验,当数据在内存中时,很多Spark应用程序都是和网络紧密相关的。使用10千兆或更高的网络是使这些应用程序更快的最好的方法。这对于“分布式reduce”应用程序尤其适用,比如group-by操作、reduce-by操作和SQL join。在任何给定的应用程序中,您都可以看到从应用程序的监视UI(http://<driver-node>:4040)中看到网络中有多大量的shuffle数据。

CPU核心数目

Spark在每台机器上可以扩展到数十个CPU内核,因为它在线程之间最小共享。在每台机器上至少提供8-16个内核。根据工作负载的CPU消耗,可能还需要更多:一旦数据在内存中,大多数应用程序要么是CPU相关,要么是网络相关。

翻译原文地址:http://spark.apache.org/docs/1.6.3/hardware-provisioning.html

原创粉丝点击