Spark 2.2.0+Hadoop2.7历史服务器无法读取S3日志问题排查
针对你遇到的ClassNotFoundException: org.apache.hadoop.fs.s3a.S3AFileSystem错误,结合你的配置和环境,咱们来一步步排查修复:
1. 修正错误的spark.history.provider配置
你的spark-defaults.conf里把spark.history.provider设成了org.apache.hadoop.fs.s3a.S3AFileSystem,这是核心错误!这个参数指定的是Spark历史服务器的日志提供者实现类,正确值应该是基于文件系统的历史日志处理器:org.apache.spark.deploy.history.FsHistoryProvider——它会去你配置的spark.history.fs.logDirectory路径读取日志,而非直接使用S3的FileSystem类。
修正后的配置行应为:
spark.history.provider org.apache.spark.deploy.history.FsHistoryProvider
2. 补充缺失的依赖JAR包
你只添加了aws-java-sdk-1.7.4.jar和hadoop-aws-2.7.3.jar,但Hadoop的S3A客户端还需要几个关键依赖才能正常工作。Spark 2.2.0 + Hadoop 2.7环境下,必须补充以下JAR包到/usr/local/spark/jars/目录:
jackson-databind-2.6.7.jarjackson-core-2.6.7.jarjackson-annotations-2.6.7.jarjoda-time-2.9.9.jar
这些包负责JSON解析、日期处理等核心逻辑,缺失它们即使有核心的AWS依赖包,也会出现类找不到的问题。
3. 确认版本兼容性
你当前的版本匹配是没问题的:
- Hadoop 2.7.x对应的
hadoop-aws版本用2.7.3是正确的 - 对应的
aws-java-sdk版本1.7.4也和Hadoop 2.7.x兼容,无需调整
4. 添加AWS身份认证配置
Spark历史服务器需要权限访问S3存储,你需要在spark-defaults.conf里补充密钥配置(如果服务器未使用IAM角色):
spark.hadoop.fs.s3a.access.key 你的AWS Access Key ID spark.hadoop.fs.s3a.secret.key 你的AWS Secret Access Key
如果你的服务器是AWS EC2实例且绑定了具有S3访问权限的IAM角色,可以跳过这一步。
5. 重启历史服务器验证
先停止运行中的历史服务器:
cd /usr/local/spark/sbin sh stop-history-server.sh
再重新启动:
sh start-history-server.sh
启动后可以查看$SPARK_HOME/logs下的历史服务器日志,确认无类加载错误,同时访问默认Web UI地址http://<你的服务器IP>:18080,检查是否能加载S3中的事件日志。
也可以先用Spark Shell验证S3连接是否正常:
spark-shell
在Shell中执行:
sc.hadoopConfiguration.set("fs.s3a.access.key", "你的AWS Access Key") sc.hadoopConfiguration.set("fs.s3a.secret.key", "你的AWS Secret Key") val files = sc.textFile("s3a://xxxxxxxxxxxxx/*") files.count()
如果这个命令能成功执行,说明S3依赖和配置都没问题,再启动历史服务器即可正常工作。
内容的提问来源于stack exchange,提问作者Blue-Pixel

