Hive ORC格式表间全量SELECT插入数据丢失,过滤插入正常问题排查
Hive全量插入ORC表数据丢失排查思路
1. 优先排查向量化执行兼容性问题
你当前开启的Hive向量化执行配置,结合ORC存储格式在部分Hive版本(尤其是Hive 2.x早期版本、部分AWS EMR自带的Hive定制版本)存在已知的批量读取bug,触发条件通常为全表扫描时的读取数据量达到向量化批量处理阈值,小数据量的条件过滤查询不会触发该bug:
- 临时关闭向量化执行验证,执行以下配置后重新运行全量插入任务,确认数据是否恢复正常:
set hive.vectorized.execution.enabled = false; set hive.vectorized.execution.reduce.enabled = false;
- 若关闭后数据正常,可查询你所用Hive版本的更新日志,确认是否存在ORC向量化读取的相关修复补丁。
2. 排查源表ORC文件的元数据一致性问题
全量扫描和条件过滤扫描的读取逻辑存在差异:条件过滤大概率只命中部分ORC文件,全量扫描会读取所有ORC文件的stripe元数据,若源表存在损坏的ORC文件、元数据与实际文件不匹配的情况,异常分片的数据会被静默跳过:
- 执行ORC文件健康检查:
hive --orcfiledump s3://源表对应存储路径/customer_id为1/2/3的分区文件路径,检查是否存在stripe损坏、数据类型不匹配问题 - 刷新源表元数据:依次执行
MSCK REPAIR TABLE abc.source;和ANALYZE TABLE abc.source COMPUTE STATISTICS;后重新尝试全量插入
3. 排查动态分区逻辑异常
你开启了动态分区配置,若源表为分区表,全量插入时的分区规则可能触发边界校验问题:
- 确认源表和目标表的分区字段定义完全一致,重点检查分区字段的大小写、数据类型是否匹配
- 临时关闭动态分区,指定静态分区插入测试,确认customer_id为1/2/3的记录是否能正常写入对应分区
4. 排查任务执行的静默异常
全量插入任务的数据量更大,可能触发YARN资源限流、Mapper/Reducer静默失败的情况,失败的Task对应分片数据会被跳过但任务最终仍返回成功状态:
- 查看全量插入任务的YARN日志,搜索
WARN/ERROR级别的日志,重点关注ORC读取、数据写入阶段的异常 - 对比全量任务和过滤条件任务的Task数量、分片大小,确认是否存在大分片对应的Task执行失败的情况
内容的提问来源于stack exchange,提问作者Khaja Nizamuddin
相关产品推荐
相关产品推荐

