我试图将我的spark应用程序的事件日志写入s3以便稍后通过历史服务器消费,但我在日志
中得到以下警告消息WARN S3ABlockOutputStream:应用程序调用Syncable API对流写入/spark_logs/eventlog_v2_local-1671627766466/events_1_local-1671627766466。这是不支持的
下面是我使用的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
只创建appstatus_local-1671627766466.inprogress
文件,不创建实际日志文件。但是对于我的本地文件系统,它的工作与预期的一样。
该警告意味着"应用程序调用了Syncable API来阻止流写入/spark_logs/eventlog_v2_local-1671627766466/events_1_local-1671627766466"。不支持">
应用程序代码使用sync()来刷新和保存数据到文件系统。显然是火花记录在调用这个。如前所述,3a客户端说"no can do"。
s3不是文件系统。它是一个对象存储;对象是用单个原子操作编写的。如果您查看S3ABlockOutputStream类—它毕竟是完全开源的—您可以看到它可以上传数据,但它只在close()中完成写入。
因此,在日志记录过程中是不可见的。这个警告是为了表明这种情况正在发生。一旦日志关闭,它就会出现。
如果您愿意,您可以将spark.hadoop.fs.s3a.downgrade.syncable.exceptions
设置为true,而它将引发异常。对于hbase这样的应用程序来说,这个文件系统确实缺乏它所需要的语义。