Spark2.x 集群搭建与参数详解

在前面的Spark 发展历程和基本概念中介绍了 Spark 的一些基本概念,熟悉了这些基本概念对于集群的搭建是很有必要的。我们可以了解到每个参数配置的作用是什么。这里将详细介绍 Spark 集群搭建以及 xml 参数配置。Spark 的集群搭建分为分布式与伪分布式,分布式主要是与 hadoop Yarn 集群配合使用,伪分布式主要是单独使用作为测试。

Spark 完全分布式搭建

由于 Hadoop 和 Spark 集群占用的内存较高,这种完全分布式集群的搭建对于跑应用来说太吃力,如果有服务器可以尝试,这里采用虚拟机方式实验,详情请看我的博客园:Hadoop2.8 与 spark2.1 集群搭建
这里是一个早前的实验,但是确实没有怎么使用,因为当时对参数没有做优化,也没有理解其中个参数的含义。所以跑应用很吃力,而且会非常卡。下面直接介绍其中的各个参数。

Spark 配置参数详解

上一步配置 Spark 集群的时候我们使用了三个节点:一个 Master ,两个 Worker,我们启动脚本的时候就会启动三个守护进程,分别名为 Master,worker,worker。
conf/slaves.xml配置: 在这里我们指定哪些机器作为 Worker 节点。伪分布式的话不要配置,因为 Master,worker 会在一个节点上启动。
conf/spark-env.sh配置:核心配置文件,配置的是 spark 应用的运行环境,详细配置了各个组件的细节。下面是他的一些参数:


参数 简介
SPARK_MASTER_IP 指定 master 进程所在的机器的 ip 地址
SPARK_MASTER_PORT 指定 master 监听的端口号(默认是 7077)
SPARK_MASTER_WEBUIPORT 指定 master web ui 的端口号(默认是 8080)
SPARK_LOCAL_DIRS 指 spark 的工作目录,包括了 shuffle map 输出文件,以及持久化到磁盘的 RDD 等
SPARK_WORKER_PORT worker 节点的端口号,默认是随机的
SPARK_WORKER_CORES worker 节点上,允许 spark 作业使用的最大 cpu 数量,默认是机器上所有的 cpu core
SPARK_WORKER_MEMORY worker 节点上,允许 spark 作业使用的最大内存量,格式为 1000m,2g 等,默认最小是 1g 内存
SPARK_WORKER_INSTANCES 当前机器上的 worker 进程数量,默认是 1,可以设置成多个,但是这时一定要设置 SPARK_WORKER_CORES,限制每个 worker 的 cpu 数量
SPARK_WORKER_DIR spark 作业的工作目录,包括了作业的日志等,默认是 spark_home/work
SPARK_DAEMON_MEMORY 分配给 master 和 worker 进程自己本身的内存,默认是 1g
SPARK_PUBLISC_DNS master 和 worker 的公共 dns 域名,默认是空

其中一些参数跟我们单独启动 master 和 worker 进程的命令行参数后面添加参数是一样的,如: sbin/start-master.sh --port 7078(或--memory 500m),类似这种方式,可以指定一样的配置属性。我们可以在 spark-evn.sh 中就去配置好这些参数,但是有时候需要根据情况临时需改配置,我们就可以使用这种在启动 Master/Worker 脚本时,添加参数的方式来进行配置。通常还是在脚本 spark-env.sh 中配置好,脚本命令行参数通常用于临时的情况。
v(•̀ ω •́) 也就是说,有些 master 和 worker 的配置,可以在 spark-env.sh 中部署时即配置,但是也可以在 start-slave.sh 脚本启动进程时命令行参数设置 但是命令行参数的优先级比较高,会覆盖掉spark-env.sh中的配置
参数 简介
SPARK_MASTER_OPTS 设置 master 的额外参数,使用 "-Dx=y" 设置各个参数

比如说 export SPARK_MASTER_OPTS="-Dspark.deploy.defaultCores=1"


参数 (x) 默认值 (y) 简介
spark.deploy.defaultCores 无限大 每个 spark 作业最多在 standalone 集群中使用多少个 cpu core,默认是无限大,有多少用多少
spark.deploy.retainedApplications 200 在 spark web ui 上最多显示多少个 application 的信息
spark.deploy.retainedDrivers 200 在 spark web ui 上最多显示多少个 driver 的信息
spark.deploy.spreadOut true 资源调度策略,spreadOut 会尽量将 application 的 executor 进程分布在更多 worker 上,适合基于 hdfs 文件计算的情况,提升数据本地化概率;非 spreadOut 会尽量将 executor 分配到一个 worker 上,适合计算密集型的作业
spark.deploy.timeout 60 单位秒,一个 worker 多少时间没有响应之后,master 认为 worker 挂掉了

参数 简介
SPARK_WORKEROPTS worker 的额外参数,使用 "-Dx=y" 设置各个参数

SPARK_WORKEROPTS 的一些参数配置(x,y)如下:


参数 (x) 默认值 (y) 简介
spark.worker.cleanup.enabled false 是否启动自动清理 worker 工作目录,默认是 false
spark.worker.cleanup.interval 1800 单位秒,自动清理的时间间隔,默认是 30 分钟
spark.worker.cleanup.appDataTtl 7 24 3600 默认将一个 spark 作业的文件在 worker 工作目录保留多少时间,默认是 7 天

参数 简介
SPARK_DAEMON_JAVAOPTS 设置 master 和 worker 自己的 jvm 参数,使用 "-Dx=y" 设置各个参数

这里一些内存相关的参数大家看过就明白了,为什么之前用分布式的集群,每个 worker 节点才 1 个 g 内存,根本是没有办法使用 standalone 模式和 yarn 模式运行作业的,仅仅是启动进程耗费的内存就已经非常严重了,其中一些内存分配不合理就会导致启动的时候资源分配失败. 如果还要在 Yarn 模式上运行的话,Hadoop 集群进程还会占用一部分内存。所以说 Spark 使用是非常消耗资源的。有时候资源也会成为性能的一个瓶颈。