本文介紹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.log和spark-spark-org.apache.spark.deploy.history.HistoryServer*.out
Spark Thrift Server:spark-thrift-server.log和spark-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無法打開
在Spark History Server所在的節點上執行命令
ps -ef | grep org.apache.spark.deploy.history.HistoryServer | grep -v grep
,確認Spark History Server進程否存在。Spark History Server進程存在時,記錄獲取到的進程PID。
在Spark History Server所在節點上執行
jstat -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
請先檢查當前系統事件的詳細內存,確認Message的內容是否有
out=-bash: spark-beeline: command not found
。是:請忽略該異常,這是集群狀態檢查的異常。
不是:請執行下一步。
執行以下命令,確認Spark Thrift Server是否還存在。
ps -ef | 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
在Spark Thrift Server日志上執行以下命令,確認Spark Thrift Server進程是否存在。
ps -ef | grep org.apache.spark.sql.hive.thriftserver.HiveThriftServer2 | grep -v grep
Spark Thrift Server進程存在時,請記錄獲取到的進程PID。
在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對服務的影響。