本文介绍Spark服务异常的排查方法和解决方案。

Spark服务日志

当出现Spark服务异常时,您可以查看Spark服务的日志。

  • 服务日志目录:
    • EMR-3.40.0之后版本、4.10.1之后版本、5.6.0之后版本:/var/log/emr/spark
    • EMR-3.40.0及之前版本、4.10.1及之前版本、5.6.0及之前版本:/mnt/disk1/log/spark
  • 日志文件:
    • Spark History Server:spark-history-server.logspark-spark-org.apache.spark.deploy.history.HistoryServer*.out
    • Spark Thrift Server:spark-thrift-server.logspark-spark-org.apache.spark.sql.hive.thriftserver.HiveThriftServer2*.out

Spark History Server

出现节点磁盘写满,检查后发现HDFS上的spark-history目录下有大量的数据

  • 在EMR控制台Spark服务配置页面的spark-defaults.conf页签,修改spark.history.fs.cleaner.enabled的参数值为true,然后重启History Server服务。
  • 您也可以手动清理HDFS服务/spark-history目录下最老的一部分作业数据。

History WebUI无法打开

  1. 在Spark History Server所在的节点上执行命令ps -elf |grep org.apache.spark.deploy.history.HistoryServer | grep -v "grep" ,确认Spark History Server进程否存在。
    Spark History Server进程存在时,记录获取到的进程PID。
  2. 在Spark History Server所在节点上执行at -gcutil [前一步获取到的进程PID] 1000 10,如果发现FGCT和GCT数字大并且在一直增长,您可以在EMR控制台增加Spark History Server内存来解决,即在Spark服务配置页面的spark-env.sh页签,修改spark_history_daemon_memory的参数值,然后重启History Server服务。

Spark Thrift Server

收到系统事件HealthCheck:Spark.ThriftServer:Failed

  1. 请先检查当前系统事件的详细内存,确认Message的内容是否有out=-bash: spark-beeline: command not found
    ThriftServer:Failed
    • 是:请忽略该异常,这是集群状态检查的异常。
    • 不是:请执行下一步。
  2. 执行以下命令,确认Spark Thrift Server是否还存在。
    ps -elf | grep org.apache.spark.sql.hive.thriftserver.HiveThriftServer2 | grep -v grep

    如果不存在,请保留日志重启服务并联系技术支持。

连接Thrift Server报异常Thrift saw a transport exception: Could not connect to emr-header-1:10001

  1. 在Spark Thrift Server日志上执行以下命令,确认Spark Thrift Server进程是否存在。
    ps -elf | grep org.apache.spark.sql.hive.thriftserver.HiveThriftServer2 | grep -v grep

    Spark Thrift Server进程存在时,请记录获取到的进程PID。

  2. 在Spark Thrift Server所在节点上执行命令jstat -gcutil [前一步获取到的进程PID] 1000 10,如果发现FGCT和GCT数字大并且在持续增长,则说明Spark Thrift Server内存不够了。您可以在EMR控制台增加Thrift Server内存来解决,即在Spark服务配置页面的spark-env.sh页签,修改spark_thrift_daemon_memory的参数值,并重启Thrift Server服务。根据实际的业务情况,您可能需要多次调试spark_thrift_daemon_memory的参数值,直至业务正常运行。
    您也可以尝试在Spark服务配置页面的 spark-thriftserver.conf页签,减少 spark.driver.maxResultSize的参数值,以减少单个SparkSQL的内存使用量,消除内存异常SQL对服务的影响。