title: Spark之yarn模式 #标题tags: spark #标签
categories: Hadoop # 分类
date: 2021-01-20

spark的独立部署模式(Standalone)模式由spark自身提供计算资源,无需其他框架提供资源。这种方式降低了和第三方资源框架的耦合性,独立性很强,但spark主要是一个计算框架,而不是资源调度框架,所以本身提供的资源调度并不是它的强项,所以还是通过yarn来提供资源调度比较靠谱一些。
这里部署的spark之yarn模式,也将依托于zookeeper实现spark的高可用,zookeeper的话,可以复用其他的zookeeper集群,这里就复用yarn高可用所需的zookeeper集群了。

环境准备

在开始下面的博文之前,需要先参考Hadoop HDFS之HA集群部署博文,将hdfs和yarn部署完成。

要注意的地方:

  • spark的Master和hdfs的NameNode、Yarn的ResourceManager最好在同一台机器;
  • spark的Worker和hdfs的DataNode、Yarn的NodeManager在同一台机器;

部署及配置spark

由于是基于其他博文进行配置的,所以主机名解析相关,请自行发挥,按照自己的实际情况去更改,需要注意的就是,你spark的master角色所在的主机名,必须所有节点可解析,注意,是你master主机的真实主机名,否则会造成集群无法启动。

我这里复用hdfs集群中的三个节点,主机名依次为:work01、work02、work03。这三个也是spark中的work节点,并且work01和work02也是master。

如下操作在work01进行配置即可。

  1. $ wget https://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-3.0.1/spark-3.0.1-bin-hadoop3.2.tgz
  2. $ tar zxf spark-3.0.1-bin-hadoop3.2.tgz -C /apps/usr/
  3. $ cd /apps/usr/spark-3.0.1-bin-hadoop3.2/conf/
  4. # spark.eventLog.dir是指定历史服务器在hdfs上的存储路径
  5. $ cat >> spark-defaults.conf << EOF
  6. spark.eventLog.enabled true
  7. spark.eventLog.dir hdfs://hadoop02:9000/history
  8. spark.yarn.historyServer.address=work03:18080
  9. spark.history.ui.port=18080
  10. EOF
  11. # 指定的hdfs路径需要提前存在
  12. $ hdfs dfs -mkdir /history
  13. # spark.deploy.zookeeper.url是指定zookeeper的IP或可解析的主机名
  14. $ cat >> spark-env.sh << EOF
  15. export JAVA_HOME=/apps/usr/jdk
  16. export SPARK_HISTORY_OPTS="
  17. -Dspark.history.ui.port=18080
  18. -Dspark.history.fs.logDirectory=hdfs://hadoop02:9000/history
  19. -Dspark.history.retainedApplications=30"
  20. SPARK_MASTER_WEBUI_PORT=8989
  21. export SPARK_DAEMON_JAVA_OPTS="
  22. -Dspark.deploy.recoveryMode=ZOOKEEPER
  23. -Dspark.deploy.zookeeper.url=work01,work02,work03
  24. -Dspark.deploy.zookeeper.dir=/spark"
  25. EOF
  26. # slaves文件中指定所有work节点名称
  27. $ cat > slaves << EOF
  28. work01
  29. work02
  30. work03
  31. EOF
  32. # 将修改好的配置文件分发到其他节点
  33. $ for i in work02 work03;do rsync -az /apps/usr/spark-3.0.1-bin-hadoop3.2 ${i}:/apps/usr/;done

启动spark集群

  1. # 在work01启动所有
  2. $ /apps/usr/spark-3.0.1-bin-hadoop3.2/sbin/start-all.sh
  3. # 从输出中可以看出来,只是本机启动了master,另一个master并没有启动
  4. starting org.apache.spark.deploy.master.Master, logging to /apps/usr/spark-3.0.1-bin-hadoop3.2/logs/spark-root-org.apache.spark.deploy.master.Master-1-master01.out
  5. work02: starting org.apache.spark.deploy.worker.Worker, logging to /apps/usr/spark-3.0.1-bin-hadoop3.2/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-master02.out
  6. work03: starting org.apache.spark.deploy.worker.Worker, logging to /apps/usr/spark-3.0.1-bin-hadoop3.2/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-lv.out
  7. work01: starting org.apache.spark.deploy.worker.Worker, logging to /apps/usr/spark-3.0.1-bin-hadoop3.2/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-master01.out
  8. # 到work02启动另一个master
  9. $ /apps/usr/spark-3.0.1-bin-hadoop3.2/sbin/start-master.sh

验证集群

  1. # 提交应用
  2. $ cd /apps/usr/spark-3.0.1-bin-hadoop3.2/
  3. bin/spark-submit \
  4. --class org.apache.spark.examples.SparkPi \
  5. --master yarn \
  6. --deploy-mode cluster \
  7. ./examples/jars/spark-examples_2.12-3.0.1.jar \
  8. 10

看到如下输出,则表明没有问题:

Spark之yarn模式 - 图1

可以根据输出信息的提示,访问下yarn的8088端口,查看作业记录,如下:

Spark之yarn模式 - 图2