文章目录
- Spark 概述
- Spark 发展历史
- 使用现状
- 官网介绍
- 流行原因
- 组成模块
- Spark环境搭建-Local模式(本地模式)
- Spark环境搭建-Standalone(独立集群)
- Spark环境搭建-Standalone-HA(高可用)
- Spark环境搭建-Spark-On-Yarn
- 两种模式
Spark 概述
Spark 发展历史
- 2009年诞生
- 2014年成为Apache顶级项目
- 2016年发布2.0
- 2019年发布3.0
- 2020年9月份发布3.0.1
使用现状
官网介绍
流行原因
组成模块
Spark环境搭建-Local模式(本地模式)
准备工作
- JDK
- ScalaSDK只需要在Windows安装即可
- Spark安装包
原理
所谓的Local模式,就是不需要其他任何节点资源就可以在本地执行Saprk代码环境,一般用于教学,调试,演示等。
操作-开箱即用
-
上传解压安装包
tar -zxvf spark-3.0.3-bin-hadoop3.2.tgz -
创建软连接
ln -s /opt/software/spark/spark-3.0.3-bin-hadoop3.2.tgz /opt/software/spark/spark-3.0.3 -
查看安装目录
测试
- 启动Spark交互式窗口
/opt/software/spark/spark-3.0.3/bin/spark-shell
- 打开http:// node1:4040
- 准备文件
vi /opt/software/spark/spark-3.0.3/data/words.txt
hello scala
hello spark
- 执行WordCount
val textFile = sc.textFile("file:///opt/software/spark/spark-3.0.3/data/words.txt")
val counts = textFile.flatMap(_.split(" ")).map((_,1)).reduceByKey(_ + _)
counts.collect
Spark环境搭建-Standalone(独立集群)
原理
操作
- 集群规划
node1 :Master
node2 :worker/slave
node3 :worker/slave
- 配置slaves/workers
进入配置目录
cd /opt/software/spark/spark-3.0.3/conf
修改配置文件名称
mv slaves.template slaves
vi slaves
内容如下:
node2
node3
- 配置master
进入配置目录
cd /opt/software/spark/spark-3.0.3/conf
修改配置文件名称
mv spark-env.sh.template spark-env.sh
修改配置文件
vi spark-env.sh
增加如下内容:
## 设置JAVA安装目录
JAVA_HOME=/opt/software/java/jdk-11.0.2
## HADOOP软件配置文件目录,读取HDFS上文件和运行Spark在YARN集群时需要,先提前配上
HADOOP_CONF_DIR=/opt/software/hadoop/hadoop-3.2.2/etc/hadoop
YARN_CONF_DIR=/opt/software/hadoop/hadoop-3.2.2/etc/hadoop
## 指定spark老大Master的IP和提交任务的通信端口
#搭建高可用时,需要注释掉
SPARK_MASTER_HOST=node1
SPARK_MASTER_PORT=7077
SPARK_MASTER_WEBUI_PORT=8080
SPARK_WORKER_CORES=1
SPARK_WORKER_MEMORY=1g
- 分发
将配置好的将 Spark 安装包分发给集群中其它机器
xsync /opt/software/spark/spark-3.0.3/conf
测试
- 集群启动和停止
在主节点上启动spark集群
opt/software/spark/spark-3.0.3/sbin/start-all.sh
在主节点上停止spark集群
opt/software/spark/spark-3.0.3/sbin/stop-all.sh
在主节点上单独启动和停止Master:
start-master.sh
stop-master.sh
在从节点上单独启动和停止Worker(Worker指的是slaves配置文件中的主机名)
start-slaves.sh
stop-slaves.sh
- 查看进程
jpsall (自己定义的查看脚本命令)
- http://node1:8080
- 启动spark-shell
/opt/software/spark/spark-3.0.3/bin/spark-shell --master spark://node1:7077
- 提交WordCount任务
注意:上传文件到hdfs方便worker读取
上传文件到hdfs
hadoop fs -put /root/words.txt /wordcount/input/words.txt
目录如果不存在可以创建
hadoop fs -mkdir -p /wordcount/input
结束后可以删除测试文件夹
hadoop fs -rm -r /wordcount
val textFile = sc.textFile("hdfs://node1:8020/wordcount/input/words.txt")
val counts = textFile.flatMap(_.split(" ")).map((_,1)).reduceByKey(_ + _)
counts.collect
counts.saveAsTextFile("hdfs://node1:8020/wordcount/output")
-
查看结果
-
查看spark任务的web-ui界面
http://node1:4040/jobs/
总结:
spark: 4040 任务运行web-ui界面端口
spark: 8080 spark集群web-ui界面端口
spark: 7077 spark提交任务时的通信端口
hadoop: 50070集群web-ui界面端口
hadoop:8020/9000(老版本) 文件上传下载通信端口
- 停止集群
/opt/software/spark/spark-3.0.3/sbin/stop-all.sh
Spark环境搭建-Standalone-HA(高可用)
原理
操作
-
启动zk
-
修改配置
vi /opt/software/spark/spark-3.0.3/conf/spark-env.sh
注释
#SPARK_MASTER_HOST=node1
增加
SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=node1:2181,node2:2181,node3:2181 -Dspark.deploy.zookeeper.dir=/spark-ha"
- 分发配置
xsync /opt/software/spark/spark-3.0.3/conf
测试
-
启动zookeeper
myzookeeper.sh start -
node1上启动Spark集群执行
/opt/software/spark/spark-3.0.3/sbin/start-all.sh -
在node2上再单独只起个master:
/opt/software/spark/spark-3.0.3/sbin/start-master.sh -
查看WebUI
http://node1:8080/
http://node2:8080/
- 模拟node1宕机
jps
kill -9 进程id
- 再次查看web-ui
http://node1:8080/
http://node2:8080/
- 测试 wordCount
/opt/software/spark/spark-3.0.3/bin/spark-shell --master spark://node1:7077,node2:7077
运行:
val textFile = sc.textFile("hdfs://node1:8020/wordcount/input/words.txt")
val counts = textFile.flatMap(_.split(" ")).map((_,1)).reduceByKey(_ + _)
counts.collect
counts.saveAsTextFile("hdfs://node1:8020/wordcount/output_2")
Spark环境搭建-Spark-On-Yarn
原理
注意:
1.SparkOnYarn 的本质是把 Saprk 任务的class字节码文件打成 jar 包,上传到Yarn 集群的 JVM 中去执行
2.Spark集群的相关角色(JVM 进程)也会在在 Yarn 的 JVM 中运行
3.SparkOnYarn 需要:
- 修改一些配置,使之支持 SparkOnYarn
- Spark 程序打成的 jar 包 -- 可以先使用示例程序的jar包 spark-examples_2.12-3.0.3.jar 也可以使用后续我们自己开发的jar包
- Spark任务的提交工具: bin/spark-submit
- Spark本省依赖的 jars:在Spark安装目录的jars中有,提交任务的时候会被上传到Yarn/HDFS,或者提前手动上传上
4.SparkOnYarn 不需要Spark集群环境,只需要一个单机版Spark解压包即可(有实例jar,有spark-submit,有依赖的jars)
5.SparkOnYarn 根据Driver运行在哪里分为两种模式:client 模式和 cluster 模式
注意:
在实际开发中, 大数据任务都有统一的资源管理和任务调度工具来进行管理! —Yarn使用的最多!
因为它成熟稳定, 支持多种调度策略:FIFO/Capcity/Fair
可以使用Yarn调度管理MR/Hive/Spark/Flink
准备工作
- 关闭之前的Spark-Standalone集群
/opt/software/spark/spark-3.0.3/sbin/stop-all.sh
- 配置Yarn历史服务器并关闭资源检查
/opt/software/hadoop/hadoop-3.2.2/etc/hadoop/yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- 指定 MR 走 shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定 ResourceManager 的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node2</value>
</property>
<!-- 设置yarn集群的内存分配方案 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>20480</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>4</value>
</property>
<!-- 环境变量的继承 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://node1:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为 7 天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
</configuration>
注意:如果之前没有配置,现在配置了需要分发并重启yarn
- 配置Spark的历史服务器和Yarn的整合
修改spark-defaults.conf
进入配置目录
cd /opt/software/spark/spark-3.0.3/conf
修改配置文件名称
mv spark-defaults.conf.template spark-defaults.conf
vi spark-defaults.conf
添加内容:
spark.eventLog.enabled true
spark.eventLog.dir hdfs://node1:8020/sparklog
spark.yarn.historyServer.address=node1:18080
spark.history.ui.port=18080
修改spark-env.sh
修改配置文件
vi /opt/software/spark/spark-3.0.3/conf/spark-env.sh
增加如下内容:
## 配置spark历史日志存储地址
SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.fs.logDirectory=hdfs://node1:8020/sparklog -Dspark.history.fs.cleaner.enabled=true"
注意:
sparklog需要手动创建
hadoop fs -mkdir -p /sparklog
分发-可选
如果只在node1上提交spark任务到yarn,那么不需要分发
- 配置依赖的Spark 的jar包
在HDFS上创建存储spark相关jar包的目录
hadoop fs -mkdir -p /spark/jars/
上传$SPARK_HOME/jars所有jar包到HDFS
hadoop fs -put /opt/software/spark/spark-3.0.3/jars/* /spark/jars/
在node1上修改spark-defaults.conf
vim /opt/software/spark/spark-3.0.3/conf/spark-defaults.conf
添加内容
spark.yarn.jars hdfs://node1:8020/spark/jars/*
分发同步-可选
- 启动服务
启动启动HDFS、YARN、historyserver 可以参考文章Hadoop集群搭建
启动Spark HistoryServer服务,,在node1执行命令
/opt/software/spark/spark-3.0.3/sbin/start-history-server.sh
HistoryServer服务WEB UI页面:
http://node1:19888
Spark HistoryServer服务WEB UI页面:
http://node1:18080
两种模式
- client 模式(了解)
client 模式下:
spark的Driver驱动程序,运行在提交任务的客户端上,和集群的通信成本高
因为Driver在客户端,所以Driver中的程序执行结果可以在客户端控制台看到
- cluster 模式(开发使用)
cluster模式下:
spark的Driver驱动程序,运行在Yarn集群上,和集群的通信成本低
且Driver是交给Yarn管理的,如果失败会由Yarn进行重启
因为Driver运行在Yarn上,所以Driver中的程序结果输出在客户端控制台上看不见,在Yarn日志中可以看
操作
-
需要Yarn集群
-
历史服务器
-
提交任务的的客户端工具-spark-submit命令
-
待提交的spark任务/程序的字节码–可以使用示例程序
client 模式
SPARK_HOME=/opt/software/spark/spark-3.0.3
/opt/software/spark/spark-3.0.3/bin/spark-submit \
--master yarn \
--deploy-mode client \
--driver-memory 512m \
--driver-cores 1 \
--executor-memory 512m \
--num-executors 2 \
--executor-cores 1 \
--class org.apache.spark.examples.SparkPi \
${SPARK_HOME}/examples/jars/spark-examples_2.12-3.0.3.jar \
10
- 查看web界面
http://node1:8088/cluster
cluster 模式
SPARK_HOME=/opt/software/spark/spark-3.0.3
${SPARK_HOME}/bin/spark-submit \
--master yarn \
--deploy-mode cluster \
--driver-memory 512m \
--executor-memory 512m \
--num-executors 1 \
--class org.apache.spark.examples.SparkPi \
${SPARK_HOME}/examples/jars/spark-examples_2.12-3.0.3.jar \
10
查看web界面
http://node2:8088/cluster