1、在hadoop安装目录下找到yarn-site.xml配置文件,添加如下配置:
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
2、找到spark的安装目录,进入conf,将spark-env.sh.template复制一份,重命名为spark-env.sh,添加如下内容:
# YARN
SPARK_CONF_DIR=/apps/spark/conf
HADOOP_CONF_DIR=/apps/hadoop/etc/hadoop
YARN_CONF_DIR=/apps/hadoop/etc/hadoop
SPARK_EXECUTOR_CORES=2
SPARK_EXECUTOR_MEMORY=2G
SPARK_DRIVER_MEMORY=2G
# spark.history.ui.port 决定history-server绑定的端口
# spark.history.fs.logDirectory 决定去什么地方查找历史Application的日志
SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.retainedApplications=40 -Dspark.history.fs.logDirectory=hdfs://m.hadoop.com:9000/spark/event"
YARN_CONF_DIR是为了告诉Spark去哪读取yarn配置信息,与YARN的ResourceManager和NodeManager组件进行交互。
中间SPARK_XXXXX的是配置Driver和Executor的资源配置,我的虚拟机测试环境资源有限,大家可以根据集群配置和任务大小进行调整,这里是全局生效,每个Spark Application在提交至YARN的时候可以单独配置。
最后一个比较重要,Spark的history-server在启动的时候会通过它们决定绑定的端口和获取历史应用日志文件的位置,非常重要,不然无法查看历史上执行的Spark应用信息。
spark.history.fs.logDirectory需要在启动history-server前手动创建,不然启动会报错
3、找到spark的安装目录,进入conf,将spark-defaults.conf.template复制一份,重命名为spark-defaults.conf,添加如下内容:
# App提交至yarn后,告诉yarn当app运行完成后,查看history的网址,yarn模式下生效
spark.yarn.historyServer.address m.hadoop.com:18080
# spark.serializer org.apache.spark.serializer.KryoSerializer
# 记录App的event log,在App运行结束后可以用来恢复Web UI界面,便于发现历史App中存在的问题,
# history-server需要读取该目录日志,与env文件中的SPARK_HISTORY_OPTS目录保持一致
spark.eventLog.enabled true
spark.eventLog.compress true
spark.eventLog.dir hdfs://m.hadoop.com:9000/spark/event
# 用来加快spark app的启动速度,Container从hdfs读取jar包,不再每次从本地上传spark/jar目录下的所有jar包
spark.yarn.archive hdfs://m.hadoop.com:9000/spark/jars/spark2.4.3.zip
4、这时候,通过start-history-server.sh启动start-history-server,使用http协议访问18080端口即可看到history界面。
5、通过spark-shell --master yarn执行spark-shell,在yarn的Web界面上点击Job的ApplicationMaster链接,即可查看App运行Web界面。
6、停止Spark App后,也可以在yarnWeb页面的history链接访问spark的history,重构历史App的Web UI,分析App运行情况