文档首页> 云数据迁移 CDM> 常见问题> 故障处理类> Hudi目的端案例库> 执行Spark SQL写入Hudi失败怎么办?
更新时间:2023-06-21 GMT+08:00

执行Spark SQL写入Hudi失败怎么办?

报错:hoodie table path not found

原因分析

表在metastore中存在,但不是Huid表,或者表在metastore中存在,但是表目录不存在,根因是在表目录下没有.hoodie目录。可能删表的时候只删了文件而没有drop table。

解决方法

在DataArts Studio或者Hue或者spark-beeline上执行drop table将表从metastore中删除,然后作业配置 “不存在时创建”重跑作业。或者删除后自己执行建表语句重建一个Hudi表。

对于MOR表来说,删表需要把ro与rt表也同时删除。否则会出现schema残留的问题。

报错:写入记录中存在空值,写入失败

原因分析

设置为主键或者预聚合键的列有空值,写入hoodie会失败。

排查方法

查看作业配置,查看表属性中hoodie.datasource.write.recordkey.field、hoodie.datasource.write.precombine.field、hoodie.datasource.write.partitionpath.field配置的列在源端数据中是否存在空值。

解决方法

删除空值后重跑作业。

报错:killed by external signal

问题原因

可能数据倾斜导致executor使用内存超出限制,具体原因需要联系MRS定位。Yarn Application ID可以从日志中获取,日志搜索“Yarn Application Id”关键字,查询离报错信息最近的Yarn Application ID即可。

自主排查方式

  1. 登录yarn,根据applicationId查询到yarn任务,打开ApplicationManager。
  2. 打开stage->查看fail状态的task,通过日志或者界面显示,可以看到失败原因,通常会是以下报错:

transferring unroll memory to storage memory failed(RDD中缓存超过了executor的内存out of memory) 。

可以尝试的规避方法:

  • 在作业管理界面选择更多-失败重试,尝试重新执行Spark SQL。
  • 通过DataArts Studio执行Spark SQL,设置执行参数或者调整SQL。

    调整Spark切片大小:

    set spark.sql.files.maxPartitionBytes=xxM;默认值为128M,可适当调整为64M或者32M。

    如果数据切分不均匀,可以修改SQL配置DISTRIBUTE BY rand(),增加一个shuffle过程,打散数据(需要占用较多资源,资源不多时慎用)。

    insert into xx select * from xxx DISTRIBUTE BY rand();

  • 使用DataArts Studio API方式提交Spark SQL,调大executor内存。

报错:java.lang.IllegalArgumentException

根因分析

Hudi不支持并发写,会产生commit冲突。

解决方案

排查是否有其他连接在同时写hudi表,如果有,将连接停止,然后CDM作业失败重试。

Hudi目的端案例库 所有常见问题

more