前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hive 修复分区 MSCK REPAIR TABLE

Hive 修复分区 MSCK REPAIR TABLE

作者头像
solve
发布2019-11-10 16:01:08
6.6K0
发布2019-11-10 16:01:08
举报
文章被收录于专栏:大数据技术栈大数据技术栈

MSCK REPAIR TABLE 命令是做啥的

MSCK REPAIR TABLE命令主要是用来: 解决通过hdfs dfs -put或者hdfs api写入hive分区表的数据在hive中无法被查询到的问题。

我们知道hive有个服务叫metastore, 这个服务主要是存储一些元数据信息, 比如数据库名,表名或者表的分区等等信息。 如果不是通过hive的insert等插入语句, 很多分区信息在metastore中是没有的, 如果插入分区数据量很多的话, 你用 ALTER TABLE table_name ADD PARTITION 一个个分区添加十分麻烦。 这时候MSCK REPAIR TABLE就派上用场了。 只需要运行MSCK REPAIR TABLE命令, hive就会去检测这个表在hdfs上的文件, 把没有写入metastore的分区信息写入metastore。

例子

我们先创建一个分区表, 然后往其中的一个分区插入一条数据, 在查看分区信息

代码语言:javascript
复制
CREATE TABLE repair_test (col_a STRING) 
PARTITIONED BY (par STRING);
INSERT INTO TABLE repair_test 
PARTITION(par="partition_1")
VALUES ("test");
SHOW PARTITIONS repair_test;

查看分区信息的结果如下

代码语言:javascript
复制
+------------------+--+
|    partition     |
+------------------+--+
| par=partition_1  |
+------------------+--+
1 row selected (0.073 seconds)
0: jdbc:hive2://localhost:10000> 

然后我们通过hdfs的put命令手动创建一个数据

代码语言:javascript
复制
[ericsson@h3cnamenode1 pcc]$ echo "123123" > test.txt
[ericsson@h3cnamenode1 pcc]$ hdfs dfs -mkdir -p /user/hive/warehouse/test.db/repair_test/par=partition_2/
[ericsson@h3cnamenode1 pcc]$ hdfs dfs -put -f test.txt /user/hive/warehouse/test.db/repair_test/par=partition_2/
[ericsson@h3cnamenode1 pcc]$ hdfs dfs -ls -R /user/hive/warehouse/test.db/repair_test
drwxrwxrwt   - ericsson hive          0 2018-08-10 17:46 /user/hive/warehouse/test.db/repair_test/par=partition_1
drwxrwxrwt   - ericsson hive          0 2018-08-10 17:46 /user/hive/warehouse/test.db/repair_test/par=partition_1/.hive-staging_hive_2018-08-10_17-45-59_029_1594310228554990949-1
drwxrwxrwt   - ericsson hive          0 2018-08-10 17:46 /user/hive/warehouse/test.db/repair_test/par=partition_1/.hive-staging_hive_2018-08-10_17-45-59_029_1594310228554990949-1/-ext-10000
-rwxrwxrwt   3 ericsson hive          5 2018-08-10 17:46 /user/hive/warehouse/test.db/repair_test/par=partition_1/000000_0
drwxr-xr-x   - ericsson hive          0 2018-08-10 17:57 /user/hive/warehouse/test.db/repair_test/par=partition_2
-rw-r--r--   3 ericsson hive          7 2018-08-10 17:57 /user/hive/warehouse/test.db/repair_test/par=partition_2/test.txt
[ericsson@h3cnamenode1 pcc]$ 

这时候我们查询分区信息, 发现partition_2这个分区并没有加入到hive中

代码语言:javascript
复制
0: jdbc:hive2://localhost:10000> show partitions repair_test;
INFO  : OK
+------------------+--+
|    partition     |
+------------------+--+
| par=partition_1  |
+------------------+--+
1 row selected (0.079 seconds)
0: jdbc:hive2://localhost:10000>

运行MSCK REPAIR TABLE 命令后再查询分区信息,可以看到通过put命令放入的分区已经可以查询了

代码语言:javascript
复制
0: jdbc:hive2:> MSCK REPAIR TABLE repair_test;
0: jdbc:hive2:> show partitions repair_test;
+------------------+--+
|    partition     |
+------------------+--+
| par=partition_1  |
| par=partition_2  |
+------------------+--+
2 rows selected (0.088 seconds)
0: jdbc:hive2:> select * from repair_test;
+--------------------+------------------+--+
| repair_test.col_a  | repair_test.par  |
+--------------------+------------------+--+
| test               | partition_1      |
| 123123             | partition_2      |
+--------------------+------------------+--+
2 rows selected (0.121 seconds)
0: jdbc:hive2://localhost:10000>

后续

后面发生了更有意思的事情。 大致情况是很多人以为alter table drop partition只能删除一个分区的数据, 结果用hdfs dfs -rmr 删除hive分区表的hdfs文件。 这就导致了一个问题hdfs上的文件虽然删除了, 但是hive metastore中的原信息没有删除。 如果用show parttions table_name 这些分区信息还在, 需要把这些分区原信息清除。

后来我想看看MSCK REPAIR TABLE这个命令能否删除已经不存在hdfs上的表分区信息, 发现不行, 我去jira查了下,发现Fix Version/s: 3.0.0, 2.4.0, 3.1.0 这几个版本的hive才支持这个功能。 但由于我们的hive版本是1.1.0-cdh5.11.0, 这个方法无法使用。

附上官网的链接 Recover Partitions (MSCK REPAIR TABLE)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 例子
  • 后续
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档