Spark History Server

  • 参考链接: Spark History Server 配置使用

描述

  • spark本身提供一个可查看job执行过程的ui界面, 地址为: http://katsura:4040. 当然不同用户的地址显然是不一样的, 如果要查看自己的spark ui界面地址, 可以在命令行中输入spark-shell, spark在启动过程中会告诉你如何访问ui界面.
Snipaste_2019-04-25_22-49-49.png
  • 然而在实际过程中我们会发现, 这个UI界面只有当spark程序正在运行时才能访问, 程序运行结束后就会显示界面无法加载. 如果我们需要查看历史记录, 则要用到Spark History Server服务.

如何使用Spark History Server服务

1. 配置

  • 首先要打开记录历史的功能, 让spark每次运行Application结束后都将运行过程中产生的日志写入某日志文件. 文件的位置可以是本地文件系统也可以是hdfs文件系统, 这里我选择写入hdfs中.
hdfs dfs -mkdir /spark_history          # 在hdfs根目录创建一个日志文件夹
cd $SPARK_HOME
cp spark-defaults.conf.template spark-defaults.conf
echo "spark.eventLog.enabled true" >> spark-defaults.conf
echo "spark.eventLog.compress true" >> spark-defaults.conf
echo "spark.eventLog.dir hdfs://localhost/spark_history" >> spark-defaults.conf
  • 关于几个参数的解释:

    • spark.eventLog.enabled true表示开启日志记录功能. 开启后每次运行spark application, hdfs://localhost/spark_history 目录下都会多一条日志记录.
    • spark.eventLog.compress true表示对日志文件进行压缩处理.
    • spark.eventLog.dir 这个参数就是设置日志文件的存储位置.
  • 然后我们需要开启Spark History Server进程. 但是在开启之前, 我们还需要进行一些设置.

cd $SPARK_HOME
cp spark-env.sh.template spark-env.sh
echo 'export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=7777 -Dspark.history.retainedApplications=10 -Dspark.history.fs.logDirectory=hdfs://localhost/spark_history"' >> spark-env.sh
  • 关于参数:
    • spark.history.ui.port 访问history server的端口号, 这里修改为7777, 然后我们就可以通过访问http://localhost:7777来查看spark历史记录了.
    • spark.histotry.retainedAppliations 这个有点复杂, 请参考文首的参考链接.
    • spark.history.fs.logDirectory 这个就是我们之前设置的存储日志文件的文件夹. 启动history server服务后, 它会从该文件夹中抽取日志信息并显示出来.

2. 开启服务

cd $SPARK_HOME/sbin
./start-history-server.sh
  • 这时就可以跑几个spark样例程序, 然后访问http://localhost:7777来查看历史记录了.

遇到的问题

1. 权限问题

  • 描述: 用hdfs dfs -ls /spark_history发现目录下存在几条日志记录,http://localhost:7777能正常打开, 但是无法显示这几条历史记录.
  • 寻找原因: 查看history server 启动的日志(在启动history server 服务的时候提示信息会告诉你日志存在了哪个log文件, 如下图).


    log.png

打开log文件之后发现了这么一段

2019-04-25 21:23:27 INFO  FsHistoryProvider:54 - Parsing hdfs://localhost/spark_history/local-1556198541590.lz4.inprogress for listing data...
2019-04-25 21:23:27 WARN  FsHistoryProvider:87 - Unable to read log hdfs://localhost/spark_history/local-1556198541590.lz4.inprogress
org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=READ, inode="/spark_history/local-1556198541590.lz4.inprogress":katsura:supergroup:-rwxrwx---
    at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:399)
    at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:261)
    at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:193)
  • 问题分析: 可以看到这里显示的是user=root, 所以在读取hdfs内的日志文件时permission denied了. 这听起来或许有点奇怪, root用户怎么遇到权限问题呢? 我的理解是, 因为hdfs系统是独立于本地文件系统的, 所以本地超级用户的权限它是不认的; 而我是用katsura这个用户名创建的hdfs文件系统, 因此它只认可katsura这个用户名.
  • 进一步分析: 那现在问题就是, 为什么这里会显示user=root呢? 这是因为我之前用的是sudo start-history-server.sh这条命令来启动history-server, 因此我实际上是在用root这个账号来执行该命令; 那么为什么我要加一个sudo呢? 这是因为history server 这个服务启动的时候要对spark相关文件做一些修改, 比如写日志什么的, 然而我的spark文件夹与其下所有的子文件都属于wheel组的root用户(或许是因为我把spark安装到了/usr/local/下),所以只有root用户才有权限修改spark文件夹中的文件。这就是我为什么要在start-history-server.h这条命令之前加上sudo.
  • 问题解决: 找到了问题的根源, 就好解决了. 只要将spark文件夹与其下所有子文件夹的所有者修改为普通用户与普通用户组就行了.
chown -R katsura spark
chgrp -R staff spark

你可能感兴趣的:(Spark History Server)