Spark分布式集群搭建
Spark版本选择
三大主要版本:
Spark-0.X
Spark-1.X(主要Spark-1.3和Spark-1.6)
Spark-2.X(最新Spark-2.4.6)
本次选择的版本:
spark-2.4.5-bin-hadoop2.7.tgz
Spark依赖环境
Spark-2.3需要依赖:Java 8+ 和 Python 2.7+/3.4+ 和 Scala 2.12 和 R 3.1+
Spark分布式集群
Spark也是一个主从架构的分布式计算引擎。主节点是Master,从节点是Worker。所以集群规划:
Server | Master | Worker |
---|---|---|
bigdata02 | √ | √ |
bigdata03 | √ | |
bigdata04 | √ |
第一步:从官网下载对应版本的安装包
[bigdata@bigdata02 ~]$ wget
https://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-2.4.5/spark-2.4.5-binhadoop2.7.
tgz
第二步:上传安装包,然后解压缩安装到对应的目录
[bigdata@bigdata02 ~]$ tar -zxvf ~/soft/spark-2.4.5-bin-hadoop2.7.tgz -C /home/bigdata/apps/
第三步:修改配置文件spark-env.sh
[bigdata@bigdata02 ~]$ cd ~/apps/spark-2.4.5-bin-hadoop2.7/conf
[bigdata@bigdata02 ~]$ cp spark-env.sh.template spark-env.sh
[bigdata@bigdata02 ~]$ vi spark-env.sh
修改或添加如下内容:
export JAVA_HOME=/usr/local/java/jdk1.8.0_73
export SPARK_MASTER_HOST=bigdata02
export SPARK_MASTER_PORT=7077
第四步:修改配置文件slave
[bigdata@bigdata02 ~]$ cd ~/apps/spark-2.4.5-bin-hadoop2.7/conf
[bigdata@bigdata02 ~]$ cp slaves.template slaves
[bigdata@bigdata02 ~]$ vi slaves
添加如下内容:
bigdata02
bigdata03
bigdata04
第五步:分发安装到所有节点
[bigdata@bigdata02 ~]$ scp -r ~/apps/spark-2.4.5-bin-hadoop2.7/ bigdata03:~/apps/
[bigdata@bigdata02 ~]$ scp -r ~/apps/spark-2.4.5-bin-hadoop2.7/ bigdata04:~/apps/
第六步:配置环境变量
vi ~/.bashrc
export SPARK_HOME=/home/bigdata/apps/spark-2.4.5-bin-hadoop2.7
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
[bigdata@bigdata02 ~]$ scp -r ~/.bashrc bigdata03:~
[bigdata@bigdata02 ~]$ scp -r ~/.bashrc bigdata04:~
source ~/.bashrc
切记:所有节点都要配置。
第七步:启动spark集群
由于启动spark集群的命令是start-all.sh,而且刚好启动HDFS集群的命令也是start-all.sh,所以启动的时候注意区分。
$SPARK_HOME/sbin/start-all.sh
第八步:验证集群启动是否成功
通过守护进程检查:
jps
通过web界面检查:http://bigdata02:8080
第九步:运行测试例子程序
run-example SparkPi 10
最后结果是:
第十步:关闭spark集群
[bigdata@bigdata02 ~]$ $SPARK_HOME/sbin/stop-all.sh
Spark分布式高可用集群搭建
上面安装的普通分布式spark集群存在SPOF的问题,Hadoop在2.X版本开始,已经利用ZooKeeper解决了单点故障问题。同样的策略,Spark也利用ZooKeeper解决Spark集群的单点故障问题。
Server | Master | Worker |
---|---|---|
bigdata02 | √ | √ |
bigdata03 | √ | |
bigdata04 | √ | √ |
前提:由于spark集群的高可用依赖于zookeeper来实现,所以必须要准备一个可用的zookeeper集群!
我们可以安装一个全新的spark的高可用集群,但是也可以在原来的基础之上,安装高可用的集群!保证spark集群关机状态。
$SPARK_HOME/sbin/stop-all.sh
第一步:从官网下载对应版本的安装包
[bigdata@bigdata02 ~]$ wget https://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-2.4.5/spark-2.4.5-binhadoop2.7.tgz
第二步:上传安装包,然后解压缩安装到对应的目录
[bigdata@bigdata02 ~]$ tar -zxvf spark-2.4.5-bin-hadoop2.7.tgz -C /home/bigdata/apps/
第三步:修改配置文件spark-env.sh
[bigdata@bigdata02 ~]$ cd ~/apps/spark-2.4.5-bin-hadoop2.7/conf
[bigdata@bigdata02 conf]$ cp spark-env.sh.template spark-env.sh
[bigdata@bigdata02 conf]$ vi spark-env.sh
修改或添加如下内容:
export JAVA_HOME=/usr/local/java/jdk1.8.0_73
export SPARK_MASTER_PORT=7077
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=bigdata02,bigdata03,bigdata04 -Dspark.deploy.zookeeper.dir=/spark245"
参数解释:
-Dspark.deploy.recoveryMode=ZOOKEEPER
说明整个集群状态是通过zookeeper来维护的,整个集群状态的恢复也是通过zookeeper来维护的。就是说用zookeeper做了Spark的HA配置,Master(Active)挂掉的话,Master(standby)要想变成Master(Active)的话,Master(Standby)就要像zookeeper读取整个集群状态信息,然后进行恢复所有Worker和Driver的状态信息,和所有的Application状态信息
-Dspark.deploy.zookeeper.url=bigdata02,bigdata03,bigdata04
将所有配置了zookeeper,并且在这台机器上有可能做master(Active)的机器都配置进来(我用了3台,就配置了3台)
-Dspark.deploy.zookeeper.dir=/spark245
-Dspark.deploy.zookeeper.dir是保存spark的元数据,保存了spark的作业运行状态;
zookeeper会保存spark集群的所有的状态信息,包括所有的Workers信息,所有的Applactions信息,所有的Driver信息
第四步:修改配置文件slave
[bigdata@bigdata02 ~]$ cd ~/apps/spark-2.4.5-bin-hadoop2.7/conf
[bigdata@bigdata02 ~]$ mv slaves.template slaves
[bigdata@bigdata02 ~]$ vi slaves
添加如下内容:
bigdata02
bigdata03
bigdata04
第五步:把core-site.xml和hdfs-site.xml文件拷贝过来,放到$SPARK_HOME/conf目录下
[bigdata@bigdata02 ~]$ cd ~/apps/hadoop-2.7.7/etc/hadoop
[bigdata@bigdata02 hadoop]$ cp core-site.xml hdfs-site.xml ~/apps/spark-2.4.5-bin-hadoop2.7/conf
第六步:分发安装到所有节点
[bigdata@bigdata02 ~]$ scp -r ~/apps/spark-2.4.5-bin-hadoop2.7 bigdata03:~/apps/
[bigdata@bigdata02 ~]$ scp -r ~/apps/spark-2.4.5-bin-hadoop2.7 bigdata04:~/apps/
第七步:配置环境变量
vi ~/.bashrc
export SPARK_HOME=/home/bigdata/apps/spark-2.4.5-bin-hadoop2.7
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
source ~/.bashrc
切记:所有节点都要配置。
第八步:启动spark集群
由于spark高可用集群在安装过程中,并没有配置文件指定谁是master,所以其实在哪个节点执行
start-all.sh,当前节点就是其中之一的master
[bigdata@bigdata02 ~]$ $SPARK_HOME/sbin/start-all.sh
那么另外一个master节点,记住,可以通过命令去到对应的master节点,手动启动
[bigdata@bigdata04 ~]$ $SPARK_HOME/sbin/start-master.sh
第九步:验证集群启动是否成功
通过守护进程检查:
jps
通过web界面检查:http://bigdata02:8080 或者 http://bigdata04:8080
第十步:验证高可用
bigdata02 和 bigdata04 两个节点,正常情况下,必定有一个节点是 active 状态,一个是 standby 状态。
测试:kill 掉 active 的 master,看看 standby 的master 能否切换过来。如果可以,证明高可用生效。
配置Spark HistoryServer
第一步:编辑spark-defualts.conf
[bigdata@bigdata03 ~]$ cd /home/bigdata/apps/spark-2.4.5-bin-hadoop2.7/conf
[bigdata@bigdata03 ~]$ cp spark-defaults.conf.template spark-defaults.conf
添加如下内容:
spark.eventLog.enabled true
spark.eventLog.dir hdfs:///hadoop277ha/spark245_historylog
第二步:编辑spark-env.sh
[bigdata@bigdata03 ~]$ cd /home/bigdata/apps/spark-2.4.5-bin-hadoop2.7/conf
[bigdata@bigdata03 conf]$ vim spark-env.sh
追加下内容:
export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.retainedApplications=30 -Dspark.history.fs.logDirectory=hdfs:///hadoop277ha/spark245_historylog"
参数解释:
spark.eventLog.dir=hdfs:///hadoop277ha/sparklog
Application在运行过程中所有的信息均记录在该属性指定的路径下
spark.history.ui.port=18080
调整WEBUI访问的端口号为18080
spark.history.retainedApplications=30
指定保存Application历史记录的个数,如果超过这个值,旧的应用程序信息将被删除,这个是内存中的应用数,而不是页面上显示的应用数spark.history.fs.logDirectory=hdfs:///hadoop277ha/spark245_historylog"
配置了该属性后,在start-history-server.sh 时就无需再显式的指定路径,Spark History Server页面只展示该指定路径下的信息
第三步:在启动HistoryServer服务之前 hdfs:///hadoop277ha/sparklog 目录要提前创建
[bigdata@bigdata03 ~]$ hadoop fs -mkdir -p hdfs:///hadoop277ha/spark245_historylog
第四步:启动spark historyserver
[bigdata@bigdata03 ~]$ $SPARK_HOME/sbin/start-history-server.sh
第五:访问Spark History WebUI:http://bigdata03:18080/
第六步:执行一个任务程序
$SPARK_HOME/bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://bigdata02:7077,bigdata04:7077 \
--executor-memory 512m \
--total-executor-cores 2 \
$SPARK_HOME/examples/jars/spark-examples_2.11-2.4.5.jar \
100