5、Spark集群的安装
5.1、Spark版本的选择
三大主要版本:
Spark-0.X
Spark-1.X(主要 Spark-1.3 和 Spark-1.6)
Spark-2.X(最新 Spark-2.3)
官网首页:http://spark.apache.org/downloads.html
我们选择的版本:spark-2.3.0-bin-hadoop2.7.tgz
5.2、Spark编译
自己用利用搜索引擎解决哈,小老弟。解决问题的能力,职场中也至关重要!
官网:http://spark.apache.org/docs/latest/building-spark.html
5.3、Spark依赖环境
在官网文档中有一句话:
5.4、安装JDK
大哥,我请大神教你安装,点一下就学会如何安装JDK啦!:https://blog.csdn.net/u012934325/article/details/73441617/
5.5、安装 Scala
可以看我之前的文章哦,卧槽,看了就会系列的产品:https://blog.csdn.net/qq_42246689/article/details/85061436
5.6、安装Spark
5.6.1、Spark 分布式集群
Spark 也是一个主从架构的分布式计算引擎。 主节点是 Master,从节点是 Worker
所以集群规划:
Server | Master | Worker |
hadoop02 | √ | √ |
hadoop03 | √ | |
hadoop04 | √ | |
hadoop05 | √ |
详细安装步骤:
1、上传下载好的 Spark 到集群中的一个节点,
比如是 hadoop05 put c:/spark-2.3.0-bin-hadoop2.7.tgz
2、使用之前安装 hadoop 集群相同的 hadoop 用户安装 spark 集群,
现在规划安装目录 /home/hadoop/apps/,
解压缩进行安装: tar -zxvf spark-2.3.0-bin-hadoop2.7.tgz -apps /home/hadoop/apps/
3、修改配置文件 spark-env.sh 进入 SPARK_HOME 的 conf 目录中,进行如下更改:
cd /home/hadoop/apps/spark-2.3.0-bin-hadoop2.7/conf mv spark-env.sh.template spark-env.sh 然后修改 spark-env.sh:
export JAVA_HOME=/usr/local/java/jdk1.8.0_73 export SPARK_MASTER_HOST=hadoop02 export
SPARK_MASTER_PORT=7077
4、修改配置文件 slave 进入 SPARK_HOME 的 conf 目录中,进行如下更改: cd /home/hadoop/apps/spark-2.3.0-bin-
hadoop2.7/conf mv slaves.template slaves 在 slaves 的最后添加所有 worker 节点的主机名 hadoop02
hadoop03
hadoop04
hadoop05
5、将 spark 安装包 copy 到所有安装节点
scp -r spark-2.3.0-bin-hadoop2.7 hadoop02:/home/hadoop/apps/
scp -r spark-2.3.0-bin-hadoop2.7 hadoop03:/home/hadoop/apps/
scp -r spark-2.3.0-bin-hadoop2.7 hadoop04:/home/hadoop/apps/
6、配置环境变量
vim ~/.bashrc
export SPARK_HOME=/home/hadoop/apps/spark-2.3.0-bin-hadoop2.7
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
source ~/.bashrc
千万注意:HADOOP_HOME/sbin 和 SPARK_HOME/sbin 目录中都包含 start-all.sh 和
stopall.sh 脚本。所以会有冲突。所以在使用有冲突的命令等要千万注意。
如果区分不清楚,那么不推荐配置环境变量
7、启动 Spark 集群
[hadoop@hadoop02 ~]$ cd /home/hadoop/apps/spark-2.3.0-bin-hadoop2.7
[hadoop@hadoop02 spark-2.3.0-bin-hadoop2.7]$ sbin/start-all.sh
8、验证集群启动是否成功
8.1、验证每个节点上的对应进程是否都启动正常
8.2、验证 Spark Web UI
打开浏览器访问:http://hadoop02:8080/
hadoop02 就是 master 所在的服务器
8.3、测试能否运行一个 Spark 例子程序
提交一个 spark 程序:
[hadoop@hadoop03 ~]$ run-example
SparkPi 10 最后结果:
或者:
[hadoop@hadoop3 ~]$ ~/apps/spark-2.3.0-bin-hadoop2.7/bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://hadoop02:7077 \
--executor-memory 512m \
--total-executor-cores 1 \
~/apps/spark-2.3.0-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.3.0.jar \ 100
--master spark://hadoop02:7077 指定 Master 的地址
--executor-memory 512m 指定每个 worker 可用内存为 500m
--total-executor-cores 1 指定整个集群使用的 CPU 核数为 1 个
8.4、进入 Spark Shell 提交 wordcount 程序:
数据准备:
进入 Spark Shell: [hadoop@hadoop2 ~] spark-shell
执行程序:
sc.textFile("/home/hadoop/words.txt").flatMap(_.split(" ")) .map((_,1)).reduceByKey(_+_).foreach(println)
如果是 Spark-1.6.3,那么启动的 spark-shell 如下:
注意:
如果启动 Spark Shell 时没有指定 master 地址,但是也可以正常启动 Spark Shell 和执行 Spark Shell 中的程序,其实是启动了 Spark 的 local 模式,该模式仅在本机启动一个进程,没有与 集群建立联系。 Spark Shell 中已经默认将 SparkContext 类初始化为对象 sc。用户代码如果需要用到,则直接 应用 sc 即可。 Spark Shell 中已经默认将 Spark Session 类初始化为对象 spark。用户代码如果需要用到,则 直接应用 spark 即可。
注意 Spark2 和 Spark1 的区别
5.6.2、Spark 高可用集群
在上面的 4.6.1 中的安装的 Spark 集群是一个普通的分布式集群,存在 master 节点的单点故 障问题。Hadoop 在 2.X 版本开始,已经利用 ZooKeeper 解决了单点故障问题。同样的策略, Spark 也利用 ZooKeeper 解决 Spark 集群的单点故障问题
集群规划:
Server | Master | Worker |
hadoop02 | √ | √ |
hadoop03 | √ | |
hadoop04 | √ | √ |
hadoop05 | √ |
具体步骤:
1、停止 Spark 集群
[hadoop@hadoop02 ~]$ cd /home/hadoop/apps/spark-2.3.0-bin-hadoop2.7
[hadoop@hadoop02 ~]$ sbin/stop-all.sh
2、配置 ZooKeeper 集群,并且启动好 ZooKeeper 集群
3、修改 SPARK_HOME/conf 目录中的 spark-env.sh 配置文件:
删掉:
export SPARK_MASTER_HOST=hadoop02
增加一行:
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER - Dspark.deploy.zookeeper.url=hadoop02,hadoop03,hadoop04 -
Dspark.deploy.zookeeper.dir=/spark"
解释:
-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=hadoop2:hadoop03:hadoop04
#将所有配置了 zookeeper,并且在这台机器上有可能做 master(Active)的机器都配置进 来(我用了 3 台,就配置了 3 台)
-Dspark.deploy.zookeeper.dir=/spark
这里的 dir 和 zookeeper 配置文件 zoo.cfg 中的 dataDir 的区别??? -Dspark.deploy.zookeeper.dir 是保存 spark 的元数据,保存了 spark 的作业运行状态; zookeeper 会保存 spark 集群的所有的状态信息,包括所有的 Workers 信息,所有的 Applactions 信息,所有的 Driver 信息,如果集群
4、如果是高可用的 Hadoop 集群,一定要把 core-site.xml 和 hdfs-site.xml 放置在 $SPARK_HOME/conf 目录中。然后所有节点要同步
5、同步配置文件
[hadoop@hadoop02 conf]$ scp -r spark-env.sh hadoop03:$PWD
[hadoop@hadoop02 conf]$ scp -r spark-env.sh hadoop04:$PWD
[hadoop@hadoop02 conf]$ scp -r spark-env.sh hadoop05:$PWD
6、启动集群
在 hadoop02 上执行:
[hadoop@hadoop02 ~]$ cd /home/hadoop/apps/spark-2.3.0-bin-hadoop2.7
[hadoop@hadoop02 spark-2.3.0-bin-hadoop2.7]$ sbin/start-all.sh
此时,通过观察启动日志,或者检查 hadoop04 上是否包含有 master 进程等都可以得知 hadoop04 上的 master 并不会自动启动,所以需要手动启动 那么在 hadoop04 执行命令进行启动:
7、验证高可用
这是正常情况:
Hadoop02 是 spark 集群的 active master 节点
Hadoop04 是 spark 集群的 standby master 节点
通过杀掉 active master 观察是否 hadoop04 能启动切换为 active 状态。
结果:
5.6.3、配置 Spark HistoryServer
详细步骤:
第一步:
cd /home/hadoop/apps/spark-2.3.0-bin-hadoop2.7/conf
cp spark-defaults.conf.template spark-defaults.conf
在文件里面添加如下内容:
spark.eventLog.enabled true
spark.eventLog.dir hdfs://myha01/sparklog
第二步:
在 spark-evn.sh 的文件里面添加如下内容:
export SPARK_HISTORY_OPTS="Dspark.history.ui.port=18080
Dspark.history.retainedApplications=30
Dspark.history.fs.logDirectory=hdfs://myha01/sparklog"
第三步:
在启动 HistorServer 服务之前 hdfs://myha01/sparklog 目录要提前创建
hadoop fs -mkdir -p hdfs://myha01/sparklog
第四步:启动 Spark HistoryServer
[hadoop@hadoop02 ~] $SPARK_HOME/sbin/start-history-server.sh
第五步:访问 Spark History WebUI
http://hadoop02:18080/