我尝试将spark应用程序的事件日志写入s3,以便稍后通过历史服务器使用,但我在日志中得到以下警告消息
警告S3 AB锁定输出流:应用程序针对写入/spark_logs/eventlog_v2_local-1671627766466/events_1_local-1671627766466的流调用了Syncable API。这是不受支持的
下面是我使用的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
- 相关罐:
- Apache的数据库。Hadoop:Hadoop-aws:3.3.0
- 亚马逊网站:aws-java-sdk捆绑包:1.11.901
只创建了appstatus_local-1671627766466.inprogress
文件,没有创建实际的日志文件。但是在我的本地文件系统中,它按预期工作。
1条答案
按热度按时间rnmwe5a21#
警告表示“应用程序针对写入/spark_logs/eventlog_v2_local-1671627766466/events_1_local-1671627766466的流调用了Syncable API。这是不受支持的”
应用程序代码使用sync()将数据保存到文件系统中,很明显,spark logging调用了这个函数,正如前面提到的,s3 a客户端说“不行”。
s3不是文件系统,它是对象存储器;对象是在单个原子操作中写入的。如果你看一下S3 ABlockOutputStream类 -它毕竟是所有开源的- 你可以看到它可以上传数据,但它只完成close()中的写入。
因此,在日志记录过程中它是不可见的。2这个警告是为了明确这正在发生。3一旦日志被关闭,它就会出现。
如果你愿意的话,你可以把
spark.hadoop.fs.s3a.downgrade.syncable.exceptions
设置为true,这样它就会引发一个异常,这样就可以让hbase这样的应用程序清楚地知道文件系统缺乏它所需要的语义。