文档首页/ 数据治理中心 DataArts Studio/ 常见问题/ 数据集成(CDM作业)/ Hive目的端的作业写入Hive ORC表时,单个字段String数据长度过大,导致写入阻塞或写入后Spark读取失败怎么解决?
更新时间:2026-08-31 GMT+08:00

Hive目的端的作业写入Hive ORC表时,单个字段String数据长度过大,导致写入阻塞或写入后Spark读取失败怎么解决?

问题描述

在将作业写入Hive ORC表时,若单个字段的String数据长度过大,可能导致写入阻塞或写入后Spark读取失败。

图1 Spark读取失败

原因分析

  • 场景一:

    当ORC源码采用字符串字典编码写入STRING数据时,字段编码会使用字节数组缓存数据。若一批数据(默认1000)的总字节大小超过2GB,字节数组缓存将溢出,触发OOM异常,进而导致ORC源码内部出现异常循环。

  • 场景二:

    当ORC源码采用字符串直接编码写入STRING数据时,字符串数据会直接写入文件。然而,当一批数据(默认1000)中同一字段的字节大小超过2GB时,数据将被写入同一个ORC的Stripe。在Spark读取过程中,用于承载读取数据的字节数组溢出,触发读取异常。

解决方案

在Hive连接的属性配置中添加参数:

  • hive.batch.size=10。

    配置ORC Writer写入数据的批大小。通过降低ORC写入批大小用于避免场景一的问题。

  • orc.rows.between.memory.checks=1。

    配置ORC在多少条数据后检查数据大小。在ORC每次触发批写入时,如果总的批行数大小超过这个值,会检查总的数据大小用于确定单单次写入的Stripe大小。如果超过Stripe大小(默认64MB),会生成新的Stripe。该配置用于避免场景二的问题。配置为1意味着每一批都会检查一次Stripe大小。