HUDI-update报错Null-value for required field:***

一、抛出问题

  • 环境:
aws EMR s3
hudi-0.10.1
spark-3.1.2
hive-3.1.2
hadoop-3.2.1
  • 错误日志
Caused by: org.apache.hudi.exception.HoodieUpsertException: Failed to merge old record into new file for key cat_id:201225781 from old file s3://...parquet to new file s3://...parquet with writerSchema {
  "type" : "record",
  "name" : "dim_catpath_hudi_test_ex_record",
  "namespace" : "hoodie.dim_catpath_hudi_test_ex",
  "fields" : [ {
    "name" : "_hoodie_commit_time",
    "type" : [ "null", "string" ],
    "doc" : "",
    "default" : null
  }, {
    "name" : "_hoodie_commit_seqno",
    "type" : [ "null", "string" ],
    "doc" : "",
    "default" : null
  }, {
    "name" : "_hoodie_record_key",
    "type" : [ "null", "string" ],
    "doc" : "",
    "default" : null
  }, {
    "name" : "_hoodie_partition_path",
    "type" : [ "null", "string" ],
    "doc" : "",
    "default" : null
  }, {
    "name" : "_hoodie_file_name",
    "type" : [ "null", "string" ],
    "doc" : "",
    "default" : null
  }, {
    "name" : "platform",
    "type" : [ "null", "string" ],
    "default" : null
  }, {
    "name" : "cat_id",
    "type" : [ "null", "int" ],
    "default" : null
  }, {
    "name" : "len",
    "type" : "int"
  }, {
    "name" : "map_to",
    "type" : "int"
  }, {
    "name" : "name_path",
    "type" : {
      "type" : "array",
      "items" : [ "string", "null" ]
    }
  }, {
    "name" : "id_path",
    "type" : {
      "type" : "array",
      "items" : [ "string", "null" ]
    }
  }, {
    "name" : "ts",
    "type" : [ "null", "long" ],
    "default" : null
  } ]
}
        at org.apache.hudi.io.HoodieMergeHandle.write(HoodieMergeHandle.java:356)
        at org.apache.hudi.table.action.commit.AbstractMergeHelper$UpdateHandler.consumeOneRecord(AbstractMergeHelper.java:122)
        at org.apache.hudi.table.action.commit.AbstractMergeHelper$UpdateHandler.consumeOneRecord(AbstractMergeHelper.java:112)
        at org.apache.hudi.common.util.queue.BoundedInMemoryQueueConsumer.consume(BoundedInMemoryQueueConsumer.java:37)
        at org.apache.hudi.common.util.queue.BoundedInMemoryExecutor.lambda$null$2(BoundedInMemoryExecutor.java:121)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        ... 3 more
Caused by: java.lang.RuntimeException: Null-value for required field: map_to
        at org.apache.parquet.avro.AvroWriteSupport.writeRecordFields(AvroWriteSupport.java:194)
        at org.apache.parquet.avro.AvroWriteSupport.write(AvroWriteSupport.java:165)
        at org.apache.parquet.hadoop.InternalParquetRecordWriter.write(InternalParquetRecordWriter.java:128)
        at org.apache.parquet.hadoop.ParquetWriter.write(ParquetWriter.java:299)
        at org.apache.hudi.io.storage.HoodieParquetWriter.writeAvro(HoodieParquetWriter.java:95)
        at org.apache.hudi.io.HoodieMergeHandle.write(HoodieMergeHandle.java:351)
        ... 8 more

 分析问题

  • HUDI表的创建方式是使用python/scala的"write...save(...)"的方式处理的
  • sql端的table是在spark-sql环境执行的"create table ... using hudi partitioned by (" +partitions +") options ( primaryKey = '"+ pk +"', type = 'cow', preCombineField = 'ts' ) location '...'"
  • 对于options的方面,我们尝试并组合过N种方案,无果。
  • 对于表类型方面,我们尝试了external表和managed表加载元数据,亦会有相同问题
  • 最后繁琐的问题排查过程就不一一赘述了,直接上目前的结论和解决方案

结论&对策

  • 结论

        在更新处理的时候,我们一贯使用update table set col = ? where 的方法。

        此时在where条件以外的数据,col若存在null就会报出以上的错误,除非我将所有为null的行都涵盖在更新范围内也就是where条件内。

  • 来个图说明一下上述结论

表中有且仅有两条map_to is null的数据,主键分别为127***,201***

若仅对一条进行更新,则会报错(第一次upd),若将所有的一起更新则可以正常执行(第二次upd),正常者即为将所有null的行都涵盖在where条件内的更新

  • 临时对策

直接对该列所有为null的值进行更新,更新后则不会存在null的值、亦不会报Null-value异常

update hudi.table_name set col = '' where col is null;

结尾语

该场景并不普遍存在,只在某特定环境下(引发问题的具体环境因素及原因还未找到,所以此问题并未根治,此处仅为临时解决方案,望抛砖引玉,有大神前来指点),比如我的大环境就是aws-EMR-s3。hudi包是我所在团队的优秀同事协力,基于aws环境进行调整后完成编译的hudi-0.10.1。

### Spark-TTS 安装报错解决方案 在安装 `spark-tts` 时遇到的错误可能由多种因素引起,以下是常见的几种原因及其对应的解决方案: #### 1. Java 版本不兼容 Java 的版本问题可能导致 Hadoop 集群或其他依赖组件无法正常运行。如果当前使用的 Java 版本过高(例如 Java 17),而某些工具或框架仅支持特定范围内的 Java 版本,则会引发异常行为[^1]。 - **解决方法**: 确认目标环境所需的最低和最高 Java 版本要求,并将其调整到合适的范围内。通常建议使用 JDK 8 或者 JDK 11 来满足大多数大数据生态系统的兼容需求。 #### 2. Hive 表缺失引起的错误 Hive 中的核心元数据表丢失也可能间接影响基于 Hive 的其他项目(如 Spark-TTS)。例如,“`hive.version`”这样的核心表一旦损坏或者被删除,在尝试访问 CLI 工具时会出现致命性的错误提示:“Table ‘hive.version’ doesn’t exist”[^2]。 - **解决方法**: 重新初始化 Hive 元数据库或将备份恢复至最新状态;另外也可以通过手动创建必要的基础结构来修复已知的问题表格定义文件。 #### 3. 并行度配置不当 对于复杂计算任务而言,默认的任务分区数目过少往往会造成资源争抢严重以及单个 Task 执行时间过长等问题。特别是在涉及大量数据处理与高耗能运算场景下尤为明显[^3]。 - **优化策略**: 增加 shuffle partitions 参数值以提高整体作业效率; ```scala // 设置全局默认并行度参数 spark.conf.set("spark.sql.shuffle.partitions", "500") ``` #### 4. Flink 和 HUDI 结合部署注意事项 虽然此部分并非直接针对 spark-tts 错误本身,但在现代实时流批一体架构设计里经常可以看到两者共同协作的身影。因此了解如何正确集成 flink-hudi bundle 库同样重要[^4]。 - **实践指南**: 确保所选用 hudi-flink-bundle jar 文件版本号同实际生产环境中正在运行的服务保持一致即可避免潜在冲突风险。 --- ### 总结 综上所述,当面对 spark-tts 安装过程中产生的各类异常状况时,可以从以下几个方面入手排查:检查 java runtime environment 是否适配、验证 hive metastore 健康程度、合理规划 sql query plan design pattern 及其关联属性设定最后再考虑外部插件间是否存在隐含矛盾之处等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值