Spark事件日志无法写入S3:仅生成inprogress文件且报Syncable API警告
问题描述
将Spark应用的EventLog写入S3时,日志中出现如下警告:
WARN S3ABlockOutputStream: Application invoked the Syncable API against stream writing to /spark_logs/eventlog_v2_local-1671627766466/events_1_local-1671627766466. This is unsupported
仅生成appstatus_local-1671627766466.inprogress文件,无法创建实际日志文件,但本地文件系统下可正常工作。
使用的Spark配置:
config("spark.eventLog.enabled", "true")\ .config("spark.eventLog.dir", 's3a://change-data-capture-cdc-test/pontus_data_load/spark_logs')\ .config("spark.eventLog.rolling.enabled", "true")\ .config("spark.eventLog.rolling.maxFileSize", "10m")
环境信息:
- Spark版本:3.3.1
- 依赖JAR包:
- org.apache.hadoop:hadoop-aws:3.3.0
- com.amazonaws:aws-java-sdk-bundle:1.11.901
原因分析
该警告的核心原因是:Spark开启滚动EventLog后,会调用Syncable API确保日志内容写入存储,但S3A的输出流并不支持这个API。这种不兼容会导致日志文件无法完成滚动流程,一直处于.inprogress临时状态,无法生成最终日志文件。
解决方案
1. 调整Spark配置,避免触发Sync操作
添加以下配置项,禁用会触发Syncable API的操作:
.config("spark.hadoop.fs.s3a.sync.enabled", "false")\ // 关闭S3A客户端的sync操作 .config("spark.eventLog.syncInterval", "0")\ // 禁用Spark主动同步日志的定时任务 .config("spark.eventLog.rolling.useEventTimestamps", "true") // 基于事件时间滚动日志,减少不必要IO操作
完整配置示例:
config("spark.eventLog.enabled", "true")\ .config("spark.eventLog.dir", 's3a://change-data-capture-cdc-test/pontus_data_load/spark_logs')\ .config("spark.eventLog.rolling.enabled", "true")\ .config("spark.eventLog.rolling.maxFileSize", "10m")\ .config("spark.hadoop.fs.s3a.sync.enabled", "false")\ .config("spark.eventLog.syncInterval", "0")\ .config("spark.eventLog.rolling.useEventTimestamps", "true")
2. 优化依赖版本兼容性
Spark 3.3.1默认依赖Hadoop 3.3.2,当前使用的hadoop-aws:3.3.0版本略低,可能存在兼容性问题。建议将hadoop-aws版本升级到3.3.2或更高兼容版本,确保与Spark内置Hadoop组件版本匹配:
<!-- Maven依赖示例 --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-aws</artifactId> <version>3.3.2</version> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-bundle</artifactId> <version>1.11.901</version> </dependency>
3. 验证S3权限
确保运行Spark应用的身份(如EC2实例角色、IAM用户)拥有S3路径s3a://change-data-capture-cdc-test/pontus_data_load/spark_logs的写入、列出、删除权限,避免因权限不足导致文件无法完成状态转换。
内容的提问来源于stack exchange,提问作者sangeeth sasidharan

