准备工作
原理
所谓的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
查看安装目录
测试
/opt/software/spark/spark-3.0.3/bin/spark-shell
hello scala
hello spark
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
原理
操作
node1 :Master
node2 :worker/slave
node3 :worker/slave
进入配置目录
cd /opt/software/spark/spark-3.0.3/conf
修改配置文件名称
mv slaves.template slaves
vi slaves
内容如下:
node2
node3
进入配置目录
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 (自己定义的查看脚本命令)
/opt/software/spark/spark-3.0.3/bin/spark-shell --master spark://node1:7077
注意:上传文件到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")
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
原理
操作
启动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
jps
kill -9 进程id
/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")
原理
注意:
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
准备工作
/opt/software/spark/spark-3.0.3/sbin/stop-all.sh
/opt/software/hadoop/hadoop-3.2.2/etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
<property>
<name>yarn.resourcemanager.hostnamename>
<value>node2value>
property>
<property>
<name>yarn.nodemanager.resource.memory-mbname>
<value>20480value>
property>
<property>
<name>yarn.scheduler.minimum-allocation-mbname>
<value>2048value>
property>
<property>
<name>yarn.nodemanager.vmem-pmem-rationame>
<value>4value>
property>
<property>
<name>yarn.nodemanager.env-whitelistname>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOMEvalue>
property>
<property>
<name>yarn.log-aggregation-enablename>
<value>truevalue>
property>
<property>
<name>yarn.log.server.urlname>
<value>http://node1:19888/jobhistory/logsvalue>
property>
<property>
<name>yarn.log-aggregation.retain-secondsname>
<value>604800value>
property>
<property>
<name>yarn.nodemanager.pmem-check-enabledname>
<value>falsevalue>
property>
<property>
<name>yarn.nodemanager.vmem-check-enabledname>
<value>falsevalue>
property>
configuration>
注意:如果之前没有配置,现在配置了需要分发并重启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,那么不需要分发
在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页面:
Spark HistoryServer服务WEB UI页面:
client 模式下:
spark的Driver驱动程序,运行在提交任务的客户端上,和集群的通信成本高
因为Driver在客户端,所以Driver中的程序执行结果可以在客户端控制台看到
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
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