对于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. winfrom加载自定义控件、窗口pannel后闪烁问题

    我用一个panel当容器,里面有好多控件,加载的时候一直闪烁. 借鉴网友的思路: 窗口初始化界面加入代码 this.DoubleBuffered = true;//设置本窗体   SetStyle(C ...

  2. C# Dropdownlist设置选择项

    (1)   dropdowslist.selectedIndex=索引值(数字); (2) dropdownlist.Items.findbyvalue(你的值).selected=true   (3 ...

  3. 一个漂亮的JavaScript“警告”替代品

    下载 一个漂亮的JavaScript"警告"替代品 安装 $ npm安装-节省sweetalert 使用 从"sweetalert"进口swal; 横波测井(& ...

  4. 如何快速构建React组件库

    前言 俗话说:"麻雀虽小,五脏俱全",搭建一个组件库,知之非难,行之不易,涉及到的技术方方面面,犹如海面风平浪静,实则暗礁险滩,处处惊险- 目前团队内已经有较为成熟的 Vue 技术 ...

  5. day31 Pyhton 总结

    # 什么是封装?     # 广义上(大家认为的) :         # 把一类事务的相同的行为和属性归到一个类中 # class Dog: #     def bite(self):pass    ...

  6. spring boot: 从配置文件中读取数据的常用方法(spring boot 2.3.4)

    一,从配置文件中读取数据有哪些方法? 通常有3种用法: 1,直接使用value注解引用得到配置项的值 2,  封装到Component类中再调用 3,  用Environment类从代码中直接访问 生 ...

  7. centos8平台yum无法安装一些常用软件的解决,如:screen,iftop,nethogs

    一,例如:安装screen时报错: [root@localhost liuhongdi]# yum install screen 上次元数据过期检查:17:39:58 前,执行于 2020年03月18 ...

  8. jquery ui,拖拽,dragsort

    一.导入js.导入jquery.dragsort.js外还需要导入jQuery. 二.HTML部分 <!DOCTYPE html> <html> <head> &l ...

  9. 优化Mysql数据库的8个方法

    通过8个方法优化Mysql数据库:创建索引.复核索引.索引不会包含含有NULL值的列.使用短索引.排序的索引问题.like语句操作.不要在列上进行运算.不使用NOT  IN 和<>操作 1 ...

  10. JavaSE学习笔记02运算符、帮助文档生成与Scanner输入

    1. 运算符 1. 算术运算符:+,-,*,/,%,++,-- //二元运算符 int a = 10; int b = 20; int c = 25; int d = 25; System.out.p ...