对于Spark开发人员来说,一个比较普遍的问题就是如何合理的配置Spark的硬件?当然如何合理的对Spark集群进行硬件配置要视情况而定,在这里给出以下建议:

存储系统

在大数据领域,有一句"名言":移动数据不如移动计算。主要因为数据量是庞大的,如果将数据从一个节点移动到另外一个节点甚至从一个局域网移动到另外一个局域网,就必然会牵涉到大量的磁盘IO和网络IO,这是非常影响性能的。而这里的计算可以理解为封装了你的业务处理代码的jar包,这个是很轻量的,相对于移动数据可有效缓解IO带来的弊端。

因此,将Spark集群节点尽可能部署到靠近存储系统的节点是非常重要的,因为大多数据Spark jobs通常从外部存储系统,如Hadoop文件系统、HBase获取数据。

具体可参考以下建议:

1. 以HDFS作为存储系统为例,建议在与HDFS相同的节点上运行Spark。最简单的方式就是将Spark的standalone集群和Hadoop进群部署在相同节点,同时配置好Spark和Hadoop的内存、CPU使用以避免相互干扰。

在Hadoop中,一些参数(注意Hadoop新版本中下列参数可能有所变化,具体根据自己使用的版本查看Hadoop官网)每个task的内存配置参数:mapred.child.java.opts,如设置为-Xmx1024m

单个节点map task数目配置参数:mapreduce.tasktracker.map.tasks.maximum

单个节点reduce task数目配置参数:mapreduce.tasktracker.reduce.tasks.maximum

此外,你也可以将Spark和Hadoop运行在共同的集群资源管理器上,如Yarn和Meso。

2. 如果不能满足1中的条件,请将Spark和HDFS部署在同一局域网下的不同节点上。

3.对于低延迟数据存储如HBase,可能优先在与存储系统不同的节点上运行计算任务以避免干扰【计算引擎在处理任务时,比较消耗服务器资源,可能影响低延迟存储系统的即时响应】

本地磁盘

尽管Spark可以在内存中处理大量的计算,但它仍然需要使用本地磁盘来存储不适合RAM的数据、以及在stage之间即shuffle的中间结果。建议每个节点配备4-8块磁盘,并且这些磁盘是作为独立的磁盘挂在节点即可,不需要做磁盘阵列。

在Linux中,使用noatime选项安装磁盘,以减少不必要的写操作。在Spark中,通过参数spark.local.dir可以配置多个本地磁盘目录,多个目录之间以逗号分开。如果Spark任务运行在hdfs上,与hdfs保持一致就好。

使用noatime选项安装磁盘,要求当挂载文件系统时,可以指定标准Linux安装选项,这将停止该文件系统上的atime更新。

磁盘挂载命令:mount -t gfs BlockDevice MountPoint -o noatime(BlockDevice:指定GFS文件系统驻留的块设备;MountPoint:指定GFS文件系统应安装的目录)。

示例:mount -t gfs /dev/vg00/lvol00 /gfs_dir -o noatime

内存

通常情况下,每台机器的内存配置从8G到数百G,Spark都能良好的运行。但建议最多分配给Spark75%的内存,剩余的留给操作系统和buffer cache。

当然,具体需要多少内存取决于你的应用。要确定你的应用使用的特定数据集需要多大内存,请加载部分数据集到内存缓存起来,然后在Spark UI(http://<driver-node>:4040)的Storage界面去看它的内存占用量。

注意:内存使用多少受到存储级别和序列化格式的影响,可以参考http://spark.apache.org/docs/latest/tuning.html的建议。

最后,请注意,对于超过200GB的内存的RAM,JAVA VM运行状态并不一直表现良好。如果你的机器内存超过了200GB,那么可以在一个节点上运行多个worker。在Spark standalone模式下,可以在配置文件conf/spark-env.sh中设置SPARK_WORKER_INSTANCES的值来设置每个节点worker的数目,通过SPARK_WORKER_CORES参数来设置每个Worker的核数。

网络

根据以往的经验,如果数据是在内存中,那么Spark应用的瓶颈往往就在网络。用10 Gigabit或者更高的网络,是使Spark应用跑的更快的最佳方式。特别是针对"distributed reduce"操作,如group-bys,reduce-bys和SQL joins,就表现的更加明显。在任何给定的应用程序中,都可以通过Spark UI查看Spark shuffle过程中跨网络传输了多少数据。

CPU cores

因为Spark在线程之间执行最小的共享CPU,因此它可以很好的扩展到每台机器几十个CPU核。建议每台机器至少配置8-16个内核。当然,具体根据你任务的CPU负载,可能需要更多的CPU:一旦数据在内存中,大多数应用程序的瓶颈就在CPU和网络。

本文主要参译于官网,笔者在此基础上做了一些解释说明,利于大家理解。


关注微信公众号:大数据学习与分享,获取更对技术干货

对Spark硬件配置的建议的更多相关文章

  1. 【Spark】---- Spark 硬件配置

    存储系统 Spark任务需要从一些外部的存储系统加载数据(如:HDFS 或者 HBase),重要的是存储系统要接近Spark系统,我们有如下推荐:   (1)如果可能,运行Spark在相同的HDFS节 ...

  2. Spark硬件配置推荐

    1.存储系统 如果可以的话,把Spark的hadoop的节点安装在一起,最容易的方式是用standalone的模式安装,用mapred.child.java.opts设置每个任务的内存,用mapred ...

  3. 【Spark学习】Apache Spark集群硬件配置要求

    Spark版本:1.1.1 本文系从官方文档翻译而来,转载请尊重译者的工作,注明以下链接: http://www.cnblogs.com/zhangningbo/p/4135912.html 目录 存 ...

  4. 如何查看LINUX 硬件配置信息

    如何查看LINUX 硬件配置信息 在网上找了N久,发现了一篇不错的文档,转载一下: 1.查看机器所有硬件信息: dmidecode |more dmesg |more 这2个命令出来的信息都非常多,所 ...

  5. 为Hadoop集群选择合适的硬件配置

    随着Apache Hadoop的起步,云客户的增多面临的首要问题就是如何为他们新的的Hadoop集群选择合适的硬件. 尽管Hadoop被设计为运行在行业标准的硬件上,提出一个理想的集群配置不想提供硬件 ...

  6. MongoDB的容量规划及硬件配置

    mongo是基于内存的数据库,应尽量将工作集中的数据全部加载到内存中,即内存应大于工作集 本文译自Chad Tindel的英文博客: http://www.mongodb.com/blog/post/ ...

  7. Spark 属性配置

    1.Spark1.x 属性配置方式 Spark属性提供了大部分应用程序的控制项,并且可以单独为每个应用程序进行配置. 在Spark1.0.0提供了3种方式的属性配置: SparkConf方式 Spar ...

  8. 嵌入式Linux设备驱动程序:发现硬件配置

    嵌入式Linux设备驱动程序:发现硬件配置 Embedded Linux device drivers: Discovering the hardware configuration Interfac ...

  9. 人机大战之AlphaGo的硬件配置和算法研究

    AlphaGo的硬件配置 最近AlphaGo与李世石的比赛如火如荼,关于第四盘李世石神之一手不在我们的讨论范围之内.我们重点讨论下AlphaGo的硬件配置: AlphaGo有多个版本,其中最强的是分布 ...

随机推荐

  1. P3469 BLO-Blockade (缩点)

    又可以水紫题了,好开心 前置芝士 无向图割点,然后脑子... 不会的童鞋,出门右转,百度百科...QAQ 首先,对于这道题,我们要求的是,割去每个点及他所连的边后,无向图中,有多少有序点对(\(x\) ...

  2. 【题解】[JSOI2007]字符加密

    Link \(\text{Solution:}\) 后缀数组第一题祭-- 观察一下,这个是让求一个环形的原字符串的后缀,我们可以考虑一下断环为链. 对于\(aba\)我们扩展成\(abaaba,\)则 ...

  3. 简单区间dp

    题目链接 对于基本区间dp,设dp[l][r]是区间l到r的最大价值. 我们可以枚举区间的长度,在枚举左端点,判断即可. 当右端点大于n,就break. dp[l][r]=max(dp[l+1][r] ...

  4. Apache HttpClient 4.5 在Springboot中使用

    ConnectionRequestTimeout httpclient使用连接池来管理连接,这个时间就是从连接池获取连接的超时时间,可以想象下数据库连接池 ConnectTimeout 连接建立时间, ...

  5. 架构师根本不会被语言限制住,php照样可以用领域驱动设计DDD四层架构!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你在通往架构师的路上吗? 程序员这个行业就像是在不断的打怪升级,突破每一阶段的瓶颈期 ...

  6. css实现中间横线俩边文字效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. map的key排序

    java map的key排序吗 java为数据结构中的映射定义了一个接口java.util.Map,他实现了四个类,分别是:HashMap,HashTable,LinkedHashMapTreeMap ...

  8. 第一期chrome浏览器的小技巧------《提高搜索效率》

    !!! 这次的技巧是:利用chrome提供的设置 提高你的搜索效率 !!! 我们经常遇到问题,搜索的时候很不方便 比如你在百度上搜索一个东西的时候正好没有搜到,那么你想找到这个东西的话,很明显要到其他 ...

  9. linux(centos8):配置docker的cgroup driver为systemd

    一,为什么要修改docker的cgroup driver? 1,什么是cgroups? cgroups(Control Groups) 是 linux 内核提供的一种机制 它可以限制.记录任务组所使用 ...

  10. centos8平台redis5日志按天分割

    一,创建日志的备份目录 [root@yjweb crontab]# mkdir /data/logs/redislogsbackup 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https:// ...