一、Standalone模式
Spark可以通过部署与Yarn的架构类似的框架来提供自己的集群模式,该集群模式的架构设计与HDFS和Yarn大相径庭,都是由一个主节点多个从节点组成,在Spark 的Standalone模式中,主,即为master;从,即为worker。
standalone运行模式:
在cluster中,两种角色被定义分别是master和worker;slaver worker可以有一个或者多个,可以和master在同一主机也可有自己的机器,当然了这些worker都处于active状态。
SDriver Application可以运行在Cluster之内,也可以在cluster之外运行,先从简单的讲起即Driver Application独立于Cluster。那么这样的整体框架如下图所示,由driver,master和多个slave worker来共同组成整个的运行环境。

- 集群规划
服务器 | IP地址 | 软件 | 服务 | 备注 |
---|---|---|---|---|
master | 192.168.247.131 | JDK、Scala、Spark | master | 主机 |
slave1 | 192.168.247.132 | JDK、Scala、Spark | worker | 从机 |
slave2 | 192.168.247.130 | JDK、Scala、Spark | worker | 从机 |
- 主机配置
192.168.247.131 master
192.168.247.132 slave1
192.168.247.130 slave2
- 配置免密
# 生成公私钥(所有主机)
root@master:~# cd .ssh
root@master:~/.ssh# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:hHzY7V1EXy+RiWPOkZhJ+BekfIZGpbNwQI8pyE8QJyQ root@master
The key's randomart image is:
+---[RSA 2048]----+
| E.=...ooo*o++o.|
| o * +.O++B.ooo|
| o * B.@+o+o o|
| o + =.*+. . |
| . S o.. |
| |
| |
| |
| |
+----[SHA256]-----+
root@master:~/.ssh#
# 复制公钥到slave1
root@master:~/.ssh# ssh-copy-id slave1
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@slave1's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'slave1'"
and check to make sure that only the key(s) you wanted were added.
# 复制公钥到slave2
root@master:~/.ssh# ssh-copy-id slave2
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@slave2's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'slave2'"
and check to make sure that only the key(s) you wanted were
# 免密测试
root@master:~/.ssh# ssh slave1
root@master:~/.ssh# ssh slave2
二、前置条件
1、Java8安装
下载地址:http://openjdk.java.net/
https://adoptopenjdk.net/releases.html

root@master:~# apt install openjdk-8-jdk -y
# 验证
root@master:~# java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-8u222-b10-1ubuntu1~18.04.1-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
# JDK路径
root@master:~# whereis java
java: /usr/bin/java /usr/share/java /usr/share/man/man1/java.1.gz
# 搜索java系统命令的位置
root@master:~# which java
/usr/bin/java
# 下载安装
root@master:~# wget https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u232-b09/OpenJDK8U-jdk_x64_linux_hotspot_8u232b09.tar.gz
2、Scala scala 2.12.10
1) 下载
下载地址:https://www.scala-lang.org/download/



# 下载
root@slave2:~# wget https://downloads.lightbend.com/scala/2.12.10/scala-2.12.10.tgz
# 解压
root@master:~# tar -zxvf scala-2.12.10.tgz -C /usr/local
2) 配置环境变量
root@master:~# vi /etc/profile
#末尾添加
# 环境变量
export SCALA_HOME=/usr/local/scala-2.12.10
export PATH=$PATH:$SCALA_HOME/bin
# 立即生效
root@master:~# source /etc/profile
# 验证
root@master:~# scala -version
Scala code runner version 2.12.10-- Copyright 2002-2019, LAMP/EPFL and Lightbend, Inc.
二、下载安装Spark
- 下载安装
下载地址:http://spark.apache.org/downloads.html
下载地址
# 下载
root@master:~# wget https://www-us.apache.org/dist/spark/spark-2.4.4/spark-2.4.4-bin-hadoop2.7.tgz
# 解压
root@master:~# tar -zxvf spark-2.4.4-bin-hadoop2.7.tgz -C /usr/local
- 配置环境变量
# 配置环境变量
export SCALA_HOME=/usr/local/scala-2.12.10
export SPARK_HOME=/usr/local/spark-2.4.4-bin-hadoop2.7
export PATH=$PATH:$SCALA_HOME/bin:$SPARK_HOME/bin:$SPARK_HOME/sbin
# 环境变量立即生效
root@master:~# source /etc/profile
三、配置spark-env.sh
- spark-env.sh配置
# 编辑配置
root@master:~# cp /usr/local/spark-2.4.4-bin-hadoop2.7/conf/spark-env.sh.template /usr/local/spark-2.4.4-bin-hadoop2.7/conf/spark-env.sh
root@master:~# vi /usr/local/spark-2.4.4-bin-hadoop2.7/conf/spark-env.sh
# 修改内容
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export SPARK_MASTER_IP=master
export SPARK_MASTER_PORT=7077
# 分发配置
root@master:~# scp /usr/local/spark-2.4.4-bin-hadoop2.7/conf/spark-env.sh root@slave1:/usr/local/spark-2.4.4-bin-hadoop2.7/conf
spark-env.sh 100% 4332 4.0MB/s 00:00
root@master:~# scp /usr/local/spark-2.4.4-bin-hadoop2.7/conf/spark-env.sh root@slave2:/usr/local/spark-2.4.4-bin-hadoop2.7/conf
spark-env.sh 100% 4332 5.0MB/s 00:00
- slaves配置
# 配置路径slaves
root@master:~# cp /usr/local/spark-2.4.4-bin-hadoop2.7/conf/slaves.template /usr/local/spark-2.4.4-bin-hadoop2.7/conf/slaves
# 编辑slaves
root@master:~# vi /usr/local/spark-2.4.4-bin-hadoop2.7/conf/slaves
# 内容
slave1
slave2
# 分发配置
root@master:~# scp /usr/local/spark-2.4.4-bin-hadoop2.7/conf/slaves root@slave1:/usr/local/spark-2.4.4-bin-hadoop2.7/conf
slaves 100% 870 1.0MB/s 00:00
root@master:~# scp /usr/local/spark-2.4.4-bin-hadoop2.7/conf/slaves root@slave2:/usr/local/spark-2.4.4-bin-hadoop2.7/conf
slaves 100% 870 298.2KB/s 00:00
四、启动spark集群
- 启动集群
一般来说,Standalone模式的Spark集群的启动有以下的几种方式:
1) master,slave一起启动:
root@master:~# cd /usr/local/spark-2.4.4-bin-hadoop2.7/
root@master:/usr/local/spark-2.4.4-bin-hadoop2.7# ./sbin/start-all.sh
starting org.apache.spark.deploy.master.Master, logging to /usr/local/spark-2.4.4-bin-hadoop2.7/logs/spark-root-org.apache.spark.deploy.master.Master-1-master.out
slave1: starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/spark-2.4.4-bin-hadoop2.7/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-slave1.out
slave2: starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/spark-2.4.4-bin-hadoop2.7/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-slave2.out
root@master:/usr/local/spark-2.4.4-bin-hadoop2.7# jps
45487 Master
45743 Jps
root@slave1:~# jps
61764 Jps
61256 Worker
root@slave2:~# jps
73333 Worker
73960 Jps
默认master日志路径
$SPARK_HOME/logs/--org.apache.spark.deploy.master.Master--.out
默认worker日志路径
$SPARK_HOME/logs/--org.apache.spark.deploy.master.Worker--.out
2)master,slave节点分开启动
首先在192.168.247.131上启动master
root@master:/usr/local/spark-2.4.4-bin-hadoop2.7# ./sbin/start-master.sh
starting org.apache.spark.deploy.master.Master, logging to /usr/local/spark-2.4.4-bin-hadoop2.7/logs/spark-root-org.apache.spark.deploy.master.Master-1-master.out
root@master:/usr/local/spark-2.4.4-bin-hadoop2.7# jps
56579 Master
56699 Jps
其次在192.168.247.132,192.168.247.130上启动slave:
root@slave1:/usr/local/spark-2.4.4-bin-hadoop2.7# ./sbin/start-slave.sh master:7077
starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/spark-2.4.4-bin-hadoop2.7/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-slave1.out
root@slave1:/usr/local/spark-2.4.4-bin-hadoop2.7# jps
77300 Jps
77224 Worker
root@slave2:/usr/local/spark-2.4.4-bin-hadoop2.7# ./sbin/start-slave.sh master:7077
starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/spark-2.4.4-bin-hadoop2.7/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-slave2.out
root@slave2:/usr/local/spark-2.4.4-bin-hadoop2.7# jps
89673 Worker
89772 Jps
- 停止spark集群
1)master,slave一起停止
root@master:/usr/local/spark-2.4.4-bin-hadoop2.7# ./sbin/stop-all.sh
slave1: stopping org.apache.spark.deploy.worker.Worker
slave2: stopping org.apache.spark.deploy.worker.Worker
stopping org.apache.spark.deploy.master.Master
2)master,slave节点分开停止
root@slave1:/usr/local/spark-2.4.4-bin-hadoop2.7# ./sbin/stop-slave.sh master:7077
stopping org.apache.spark.deploy.worker.Worker
root@slave1:/usr/local/spark-2.4.4-bin-hadoop2.7# jps
79915 Jps
root@slave2:/usr/local/spark-2.4.4-bin-hadoop2.7# ./sbin/stop-slave.sh master:7077
stopping org.apache.spark.deploy.worker.Worker
root@slave2:/usr/local/spark-2.4.4-bin-hadoop2.7# jps
92275 Jps
root@master:/usr/local/spark-2.4.4-bin-hadoop2.7# ./sbin/stop-master.sh
stopping org.apache.spark.deploy.master.Master
root@master:/usr/local/spark-2.4.4-bin-hadoop2.7# jps
66942 Jps
- Web测试查看
集群启动以后,我们在浏览器输入http://masterIP:8080/,masterIP需要使用实际的master的ip来进行替代。
Web测试查看
五、运行提交作业

- 官方求PI案例
root@master:/usr/local/spark-2.4.4-bin-hadoop2.7# ./bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://master:7077 --executor-memory 1G --total-executor-cores 2 ./examples/jars/spark-examples_2.11-2.4.4.jar 10
# 结果
Pi is roughly 3.142743142743143
参数:--master spark://master:7077指定要连接的集群的master

- 启动spark shell
# 添加文件内容
root@master:/usr/local/spark-2.4.4-bin-hadoop2.7# vi /wordcount
hello world
hive hadoop
hadoop world
are you ok
# local表示为本地文件。
root@master:/usr/local/spark-2.4.4-bin-hadoop2.7# ./bin/spark-shell --master local spark://master:7077 --executor-memory 1g --total-executor-cores 2
19/12/01 22:42:11 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Spark context Web UI available at http://master:4040
Spark context available as 'sc' (master = local, app id = local-1575211350306).
Spark session available as 'spark'.
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.4.4
/_/
Using Scala version 2.11.12 (OpenJDK 64-Bit Server VM, Java 1.8.0_222)
Type in expressions to have them evaluated.
Type :help for more information.
scala> sc.textFile("/wordcount").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
res0: Array[(String, Int)] = Array((are,1), (you,1), (hive,1), (hadoop,2), (hello,1), (ok,1), (world,2))
scala>
六、Spark提交作业参数
1.num-executors
参数说明:该参数用于设置Spark作业总共要用多少个Executor进程来执行。Driver在向YARN集群管理器申请资源时,YARN集群管理器会尽可能按照你的设置来在集群的各个工作节点上,启动相应数量的Executor进程。这个参数非常之重要,如果不设置的话,默认只会给你启动少量的Executor进程,此时你的Spark作业的运行速度是非常慢的。
参数调优建议:每个Spark作业的运行一般设置50~100个左右的Executor进程比较合适,设置太少或太多的Executor进程都不好。设置的太少,无法充分利用集群资源;设置的太多的话,大部分队列可能无法给予充分的资源。
2.executor-memory
参数说明:该参数用于设置每个Executor进程的内存。Executor内存的大小,很多时候直接决定了Spark作业的性能,而且跟常见的JVM OOM异常,也有直接的关联。
参数调优建议:每个Executor进程的内存设置4G8G较为合适。但是这只是一个参考值,具体的设置还是得根据不同部门的资源队列来定。可以看看自己团队的资源队列的最大内存限制是多少,num-executors乘以executor-memory,是不能超过队列的最大内存量的。此外,如果你是跟团队里其他人共享这个资源队列,那么申请的内存量最好不要超过资源队列最大总内存的1/31/2,避免你自己的Spark作业占用了队列所有的资源,导致别的作业无法运行。
3.executor-cores
参数说明:该参数用于设置每个Executor进程的CPU core数量。这个参数决定了每个Executor进程并行执行task线程的能力。因为每个CPU core同一时间只能执行一个task线程,因此每个Executor进程的CPU core数量越多,越能够快速地执行完分配给自己的所有task线程。
参数调优建议:Executor的CPU core数量设置为2~4个较为合适。同样得根据不同部门的资源队列来定,可以看看自己的资源队列的最大CPU core限制是多少,再依据设置的Executor数量,来决定每个Executor进程可以分配到几个CPU core。同样建议,如果是跟他人共享这个队列,那么num-executors * executor-cores不要超过队列总CPU core的1/3~1/2左右比较合适,也是避免影响其他的作业运行。
4.driver-memory
参数说明:该参数用于设置Driver进程的内存。
参数调优建议:Driver的内存通常来说不设置,或者设置1G左右应该就够了。唯一需要注意的一点是,如果需要使用collect算子将RDD的数据全部拉取到Driver上进行处理,那么必须确保Driver的内存足够大,否则会出现OOM内存溢出的问题。
5.spark.default.parallelism
参数说明:该参数用于设置每个stage的默认task数量。这个参数极为重要,如果不设置可能会直接影响你的Spark作业性能。
参数调优建议:Spark作业的默认task数量为500~1000个较为合适。很多同学常犯的一个错误就是不去设置这个参数,那么此时就会导致Spark自己根据底层HDFS的block数量来设置task的数量,默认是一个HDFS block对应一个task。通常来说,Spark默认设置的数量是偏少的(比如就几十个task),如果task数量偏少的话,就会导致你前面设置好的Executor的参数都前功尽弃。试想一下,无论你的Executor进程有多少个,内存和CPU有多大,但是task只有1个或者10个,那么90%的Executor进程可能根本就没有task执行,也就是白白浪费了资源!因此Spark官网建议的设置原则是,设置该参数为num-executors * executor-cores的2~3倍较为合适,比如Executor的总CPU core数量为300个,那么设置1000个task是可以的,此时可以充分地利用Spark集群的资源。
6.spark.storage.memoryFraction
参数说明:该参数用于设置RDD持久化数据在Executor内存中能占的比例,默认是0.6。也就是说,默认Executor 60%的内存,可以用来保存持久化的RDD数据。根据你选择的不同的持久化策略,如果内存不够时,可能数据就不会持久化,或者数据会写入磁盘。
参数调优建议:如果Spark作业中,有较多的RDD持久化操作,该参数的值可以适当提高一些,保证持久化的数据能够容纳在内存中。避免内存不够缓存所有的数据,导致数据只能写入磁盘中,降低了性能。但是如果Spark作业中的shuffle类操作比较多,而持久化操作比较少,那么这个参数的值适当降低一些比较合适。此外,如果发现作业由于频繁的gc导致运行缓慢(通过spark web ui可以观察到作业的gc耗时),意味着task执行用户代码的内存不够用,那么同样建议调低这个参数的值。
7.spark.shuffle.memoryFraction
参数说明:该参数用于设置shuffle过程中一个task拉取到上个stage的task的输出后,进行聚合操作时能够使用的Executor内存的比例,默认是0.2。也就是说,Executor默认只有20%的内存用来进行该操作。shuffle操作在进行聚合时,如果发现使用的内存超出了这个20%的限制,那么多余的数据就会溢写到磁盘文件中去,此时就会极大地降低性能。
参数调优建议:如果Spark作业中的RDD持久化操作较少,shuffle操作较多时,建议降低持久化操作的内存占比,提高shuffle操作的内存占比比例,避免shuffle过程中数据过多时内存不够用,必须溢写到磁盘上,降低了性能。此外,如果发现作业由于频繁的gc导致运行缓慢,意味着task执行用户代码的内存不够用,那么同样建议调低这个参数的值。
8.total-executor-cores
参数说明:所有执行者的核心总数.
七、Ubuntu设置镜像源:
1.备份原来的源
root@master:~# sudo cp /etc/apt/sources.list /etc/apt/sources_init.list
2.更换源
root@master:~# vi /etc/apt/sources.list
# 阿里源
deb http://mirrors.aliyun.com/ubuntu/ xenial main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe
# 清华源
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
3.更新
root@master:~# sudo apt-get update
# 复损坏的软件包,尝试卸载出错的包,重新安装正确版本的。
root@master:~# sudo apt-get -f install
# 更新软件
root@master:~# sudo apt-get upgrade -y
八、常见问题
-
无法访问Spark Web UI的解决办法
-
spark master web ui 端口8080被占用解决办法
spark master web ui 默认端口为8080,当系统有其它程序也在使用该接口时,启动master时也不会报错,spark自己会改用其它端口,自动端口号加1,但为了可以控制到指定的端口,我们可以自行设置,修改方法:
1、cd SPARK_HOME/sbin
2、vi start-master.sh
3、mster启动脚本中,该命令用来控制WEBUI的默认端口:
if [ "$SPARK_MASTER_WEBUI_PORT" = "" ]; then
SPARK_MASTER_WEBUI_PORT=8080
fi
4、修改上面的端口为其它可用端口就行
注:如果使用默认端口无法正常登陆WEB时,可查看mster的监听端口号来确定当前使用的端口
网友评论