您现在的位置是:首页 >技术教程 >记一次Hive数据目录和export出来的数据大小差异很大的问题排查网站首页技术教程
记一次Hive数据目录和export出来的数据大小差异很大的问题排查
简介记一次Hive数据目录和export出来的数据大小差异很大的问题排查
背景
项目上有一套hive集群,需要从测试环境迁移到生产环境,由于HDP3默认启用了事务,所以不能采用distcp直接拷贝数据目录到新集群,而且两套环境网络也不互通。所以决定编写脚本将表数据都export到hdfs目录,下载到运维电脑本地之后,再到新集群上进行import。迁移时发现,源集群30多G的表目录,export出来之后只有几十M了,总让人怀疑有数据丢失。
排查步骤
- 查看对应表的HDFS目录,发现表中有从base_000001到base_0000689的多个base目录。
- 查询hive事务表相关资料得知,由于hdfs文件不可更改,hive事务表是通过base目录和delta目录实现的事务功能,minor compact是将多个delta目录合并成一个delta目录,major compact是将旧base目录和delta目录,合并成新的base目录。同时标记旧base目录为“过时的”,等待后台删除线程来删除。
- 分析得知目前多个base目录是不正常的
- 发现手动触发minor compact 或者major compact 均可以删除旧的base目录
alter table table_name compact ‘minor’;
alter table table_name compact ‘major’; - 继续查询相似安利,发现官方有提到这一bug:HIVE-22255
- 大概意思就是无论再minor或者major合并的时候,如果发现没有delta目录就会跳过后续的合并过程,而insert overwrite动作不会生产delta目录,所以就一直无法进行后续的删除清理动作
解决方案:
既然手动触发minor compact 或者major compact 均可以删除旧的base目录,那最后的解决方案就是
找到insert overwrite 有关的表,写定时任务每天手动触发一次合并即可清理旧base目录即可
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。