Databricks中将Eventhub数据写入ADLS出现运行时错误,如何解决?
报错根因
该报错为Spark Structured Streaming File Sink的元数据损坏问题:你将流数据写入ADLS时,Spark会在输出路径下自动生成_spark_metadata目录维护写入批次的元数据,当前第709批次的压缩元数据文件709.compact丢失,导致任务无法继续执行。元数据丢失通常由手动删除元数据文件、ADLS存储临时读写故障、历史流任务异常中断导致元数据写入不完整引发。
解决方案
根据你是否能接受重新写入全量数据,可选择对应处理方案:
- 可接受重新写入全量数据(最快修复)
- 删除输出路径(即你
.start()方法传入的/mnt/container-name/folder-name路径)下的_spark_metadata文件夹 - 删除你配置的
checkpointLocation对应的检查点目录 - 重新启动流任务即可,任务会自动重建元数据与检查点,按你配置的Eventhub起始位点开始写入
- 删除输出路径(即你
- 不可接受重新写入,需保留已有历史数据
- 先检查
_spark_metadata目录下是否存在不带.compact后缀的709原始元数据文件:如果存在,直接将该文件重命名为709.compact,重启任务即可 - 如果连
709原始文件也不存在,找到最近的编号小于709的.compact文件(例如708.compact),将其复制一份并重命名为709.compact,再重启任务。该方案不会丢失已写入的历史数据,仅可能存在少量重复数据,后续可通过主键、写入时间等维度做去重处理即可。
- 先检查
预防建议
- 不要手动修改、删除输出路径下的
_spark_metadata目录,以及检查点目录下的任何文件 - 定期备份
_spark_metadata目录和检查点目录,避免存储故障导致元数据丢失 - 配置ADLS存储的冗余策略,降低文件意外丢失的概率
内容的提问来源于stack exchange,提问作者Sai Varun Kumar
相关产品推荐
相关产品推荐

