Iceberg学习日记(1) 定位两个线上Iceberg查不到文件的问题
前言
Iceberg是我们去年年底(2020)开始调研,目前上线了130多张表。主要用于流量日志清洗,数据报表,推荐特征基础数据。至今为也算是积累了一些使用及定位问题经验。 这篇文章会介绍两个线上Iceberg表查不到数据/快照文件的问题,希望对大家有帮助。
一.Rewrite操作有可能会误删数据文件
现象:
如图: 线上一张Iceberg表的合并任务运行一段时间后开始报错找不到数据文件。
当时找到运维查看删文件的用户和机器,定位出来是合并文件程序所在的机器。最后在合并任务日志中发现了这个异常 如图 (当时忘记保存,相同异常的截图冒充的,所以没有图截方法栈)。在BaseRewriteDataFilesAction.java中发现了问题。
原因:
先解释下 CommitStateUnknownException: 在iceberg向hive Metastore提交报错时,Iceberg会重新去Hive Metastore查询一遍刚才有没有提交成功(有可能代理原因hive是提交成功的)。这时如果Iceberg尝试几次向hive查询查ceberg表都报错,这个时候因为没有办法确定提交的的状态是成功还是失败。就会抛 CommitStateUnknownException。
在Rewrite操作提交的异常处理时,因为没有考虑这种 "提交状态不明确的异常",直接将合并过的文件直接删除做"回滚"操作。但是在hive metastore中已经提交成功, 导致下次在查询时 因为新提交的快照引向被删除的元数据文件导致的。
解决办法:
如图,当抛 CommitStateUnknownException异常时不要删这些文件,如果这次提交是提交失败,这些文件会被RemoveOrphanFile操作删掉。
0.12.x之后,spark使用新版本的rewrite api这个问题已经解决了。如果使用iceberg 0.12以前版本的(spark/flink) rewrite action 或者0.12.x的flink rewrite action (目前使用旧的rewrite api)。出现数据文件丢失可以考虑下这种情况。
二.iceberg表快照过期时间过短导致一些查询时间长的查询语句
现象
业务方反映查询iceberg表报快照及manifest文件丢失问题。运维童鞋帮查询是是合并程序删除的(合并程序包含rewrite和expireSnapshot)
排查
发现这个快照的生成时间是上午8点多, 9点多这个快照便被合并程序过期。这个查询程序在开始查询的时候,这个快照是最新的快照。由于查询时间比较长,两个小时后这个查询程序的第n个阶段开始正式读这张表时候发现这个快照文件已经被删了
结论
这个问题的原因:这张表的快照过期时间设置得实在太短了。导致稍微耗时的查询就会出现这种问题。调长snapshot过期时间问题就解决了
最新文章
- 恢复 Windows 7 的“回到父目录”按钮
- VMware Ubuntu Kaldi
- codeforces 练习
- 升级Flash Builder 4.6中的Flash Player版本
- HDU 1109
- 20145305 《Java程序设计》实验一
- 一个sql很多个not like的简化语句
- Powerdesigner逆向工程从sql server数据库生成pdm
- java 语法 java没学好,休想学好安卓!
- 枚举类型互相转换(使用GetEnumName和TypeInfo两个函数)
- 【WC2013】糖果公园
- 排序算法之冒泡排序的思想以及Java实现
- CF1101G (Zero XOR Subset)-less
- git 认识
- lua -- 点击关闭窗口中的子界面
- BC32206 错误
- ASP.NET网站权限设计实现(二)——角色权限绑定
- spring_cxf_basic_sender
- linux cpio
- linux彻底删除nginx
热门文章
- 【LeetCode】393. UTF-8 Validation 解题报告(Python)
- 小白自制Linux开发板(第二季 V3s篇) 一. 换个核心再来一次
- [炼丹术]UNet图像分割模型相关总结
- IT6563|4LAN DP转HDMI 4K60HZ /2.0转换方案|CS5263替代IT6563
- <;数据结构>;hash进阶
- 为什么说DI解耦
- 探索 dotnet core 为何在 Windows7 系统需要补丁的原因
- x86-2-保护模式(protect mode)
- springCloudGateway-使用记录
- 接口调试没有登录态?用whistle帮你解决