🔍 一、核心故障排查流程
1. 日志定位(關(guān)鍵。
# 查看History Server日志(默認(rèn)路徑) tail -100f /spark/logs/spark-<user>-org.apache.spark.deploy.history.HistoryServer-*.out
- 典型報錯:
java.lang.IllegalArgumentException: Log directory specified does not exist
java.io.FileNotFoundException: File does not exist
BindException: Address already in use
🛠 二、高頻問題及解決方案
問題1:日志目錄配置錯誤
- 現(xiàn)象:日志報錯路徑不存在或權(quán)限不足
- 解決:
# 檢查spark-defaults.conf配置spark.history.fs.logDirectory hdfs://namenode:9000/spark-events # HDFS路徑# 或本地路徑(需確保History Server可訪問)spark.history.fs.logDirectory file:/opt/spark-events# 驗證路徑權(quán)限(HDFS示例)hdfs dfs -ls /spark-eventshdfs dfs -chmod -R 1777 /spark-events # 開啟Sticky Bit防誤刪
問題2:端口沖突
- 現(xiàn)象:
java.net.BindException: Address already in use
- 解決:
# 檢測18080端口占用sudo netstat -tulnp | grep 18080# 方案1:終止占用進(jìn)程kill -9 <pid># 方案2:修改History Server端口(spark-defaults.conf)spark.history.ui.port 18888
問題3:內(nèi)存不足導(dǎo)致進(jìn)程崩潰
- 現(xiàn)象:日志中出現(xiàn)
OutOfMemoryError
后服務(wù)退出 - 解決:
# 調(diào)整JVM堆內(nèi)存(spark-env.sh)export SPARK_DAEMON_MEMORY=2g # 默認(rèn)1g不足時調(diào)整# 啟用GC日志分析export SPARK_HISTORY_OPTS="-XX:+UseG1GC -XX:+PrintGCDetails -Xloggc:/spark/logs/gc.log"
🌐 三、特殊環(huán)境問題
問題4:Kerberos認(rèn)證失敗
- 現(xiàn)象:
GSSException: No valid credentials provided
- 解決:
# 1. 檢查keytab有效期klist -kte /path/to/spark.keytab# 2. 配置krb5.conf路徑export SPARK_KRB5_CONF=/etc/krb5.conf# 3. 啟動時指定principal(spark-defaults.conf)spark.history.kerberos.principal spark/host@REALMspark.history.kerberos.keytab /path/to/spark.keytab
問題5:云存儲權(quán)限異常(S3/OSS)
- 現(xiàn)象:
AmazonS3Exception: Access Denied
- 解決:
# 配置IAM角色或Access Key(spark-defaults.conf)spark.hadoop.fs.s3a.access.key AKIAXXXspark.hadoop.fs.s3a.secret.key xxxx# 使用臨時憑證更安全spark.hadoop.fs.s3a.aws.credentials.provider org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider
📊 四、服務(wù)啟停與監(jiān)控
正確啟停姿勢
# 啟動(使用系統(tǒng)服務(wù)管理更可靠) sudo systemctl start spark-history-server # 手動啟動(調(diào)試用) /spark/sbin/start-history-server.sh
狀態(tài)驗證
# 檢查進(jìn)程 ps aux | grep HistoryServer # 測試端口連通性 curl -I http://localhost:18080 # 預(yù)期返回:HTTP/1.1 200 OK
⚙️ 五、生產(chǎn)環(huán)境最佳實踐
1. 配置模板(spark-defaults.conf)
# 基礎(chǔ)配置 spark.history.fs.logDirectory hdfs://cluster/spark-events spark.history.ui.port 18080 spark.history.retainedApplications 50 # 保留應(yīng)用數(shù) # 性能優(yōu)化 spark.history.fs.update.interval 10s # 日志刷新間隔 spark.history.store.maxDiskUsage 20g # 本地緩存上限
2. Systemd服務(wù)文件示例
# /etc/systemd/system/spark-history.service [Unit] Description=Spark History Server After=network.target [Service] User=spark Group=spark ExecStart=/opt/spark/sbin/start-history-server.sh Restart=always RestartSec=30s [Install] WantedBy=multi-user.target
🔧 六、深度調(diào)試技巧
- 啟動時打印完整配置:
/spark/sbin/start-history-server.sh --verbose
- 分析堆內(nèi)存快照:
jmap -dump:format=b,file=hist_server.hprof <pid>
- 網(wǎng)絡(luò)隔離測試:
# 在History Server主機(jī)執(zhí)行telnet namenode 9000 # 檢查HDFS連通性openssl s_client -connect s3.amazonaws.com:443 # 驗證云存儲
💡 經(jīng)驗提示:若使用HDFS存儲日志,務(wù)必開啟日志滾動壓縮避免小文件問題:
spark.eventLog.compress true spark.eventLog.rolling.enabled true
通過以上步驟可解決90%的啟動故障,保持配置一致性是穩(wěn)定運(yùn)行的核心!🚀