Spark版本:1.1.1
本文系从官方文档翻译而来,转载请尊重译者的工作,注明以下链接:
http://www.cnblogs.com/zhangningbo/p/4135912.html
Spark开发人员收到的最常见的问题就是如何为Spark做硬件配置。然而恰当的硬件配置取决于你的应用环境,所以我们推荐考虑如下几个要素。
因为大部分Spark作业很可能要从外部存储系统(如HDFS、HBase)读取数据,所以,把Spark平台尽可能地部署在靠近这类存储系统的地方是很重要的。我们推荐从以下几个方面考虑Spark的部署:
mapred.child.java.opts用于设置每个任务需要分配的内存量,
mapred.tasktracker.map.tasks.maximum和
mapred.tasktracker.reduce.tasks.maximum用于设置
任务总数
)。要不然,你还可以在通用集群管理器(比如Mesos或Hadoop YARN)上运行Hadoop和Spark。
当Spark在内存中执行大量的计算作业时,实际上它仍然会使用本地磁盘来存储那些不适合放入RAM中的数据,还有那些在各个stage之间保存的临时输出数据。我们推荐每个节点配备4-8个磁盘,且不要设置为RAID模式(仅仅是作为单独的装载点)。在Linux系统下,以noatime命令行选项装载磁盘可以减少不必要的读磁盘操作。在Spark中,把变量spark.local.dir配置为以逗号分隔的本地磁盘列表。如果你正在运行着HDFS,那么,最好和HDFS使用相同的磁盘。
通常,在内存容量为8GB到数百GB的主机上,Spark都能很好地运行。在任何情况下,我们都推荐最多只把物理主机上75%的内存分配给Spark;剩下的留给操作系统和缓存。
你需要多少内存取决于你的应用程序。要确定你的应用程序在某个数据集上执行时需要多少内存,可以在Spark RDD中加载一部分数据集,并借用Spark 监控UI(http://<driver-node>:4040
)上的存储表格(Storage tab)来查看其内存用量。要注意的是内存用量受存储级别和序列化格式的影响极大——解决方法详见Spark调优一文。
最后,请注意,配置了200GB以上内存的Java 虚拟机并不能总是正常工作。如果你购买的主机配备的内存超过了这个数值,那么可以在每个主机上启动多个worker JVM来解决这个问题。在Spark Standalone集群上,你可以使用配置文件conf/spark-env.sh中的变量SPARK_WORKER_INSTANCES
来设置每个节点上的worker数量,用变量SPARK_WORKER_CORES来设置每个worker上分配的CPU核数。
我们的经验表明,当数据加载到内存时,大多数Spark应用程序都将受制于网络。最好的办法就是使用10Gbps或更高带宽的网络来加快应用的执行速度。这个办法对于那些分布式reduce应用程序(如group-bys,reduce-bys,及SQL joins)特别有用。在任何一个应用程序中,你都可以从其监控UI(http://<driver-node>:4040
)上看到Spark通过网络传输了多少数据量。
Spark可以在每个主机上很好地缩放数十个CPU核,因为它在线程间极少共享信息。你很可能会在每台主机上最少配置8-16个CPU核。根据你的工作负载所需的CPU成本,你可能还需要更多的CPU核:因为一旦把数据都加载到内存,那么大多数应用程序的瓶颈要么在于CPU,要么在于网络。