创建完表后希望恢复hdfs上的元数据可以使用
msck repair table tablename;
(tablename是你的表的名字)方法来进行修复元数据。 上面是一层分区的情况执行的。
下面还有多层分区情况执行的:
set hive.msck.path.validation=ignore;
msck repair table tablename;
来进行多层分区修复。
命令行进入hive,修复元数据
[root@cdp101 ~]# hive
WARNING: Use "yarn jar" to launch YARN applications.
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/jars/log4j-slf4j-impl-2.8.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/jars/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Logging initialized using configuration in jar:file:/opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/jars/hive-common-2.1.1-cdh6.3.2.jar!/hive-log4j2.properties Async: false
WARNING: Hive CLI is deprecated and migration to Beeline is recommended.
hive>
hive>
hive> msck repair table test.page_activity_qa;
OK
Partitions not in metastore: page_activity_qa:p_data_day=2022-04-18 page_activity_qa:p_data_day=2022-04-19 page_activity_qa:p_data_day=2022-04-20 page_activity_qa:p_data_day=2022-04-21
Repair: Added partition to metastore page_activity_qa:p_data_day=2022-04-21
Repair: Added partition to metastore page_activity_qa:p_data_day=2022-04-19
Repair: Added partition to metastore page_activity_qa:p_data_day=2022-04-18
Repair: Added partition to metastore page_activity_qa:p_data_day=2022-04-20
Time taken: 1.998 seconds, Fetched: 5 row(s)
hive>
修复完元数据,要刷新表
refresh test.page_activity_qa;
通常是通过alter table add partition
方式增加Hive的分区的,但有时候会通过HDFS put/cp
命令往表目录下拷贝分区目录,如果目录多,需要执行多条alter语句,非常麻烦。Hive提供了一个"Recover Partition"的功能。具体语法如:MSCK REPAIR TABLE table_name;
**Note:**分区的目录结构必遵循 /partition_name=partition_value/
结构,否则msck
无法自动添加分区,只能使用add partition
命令。
add partition命令使用:alter table student_ptn add partition(city="shenzhen");
测试:
beeline -u " jdbc:hive2://10.9.251.xx:10000 xx xx"
create database zxl_test;
use zxl_test;
create external table student_ptn(id int, name string, sex string, age int,department string) partitioned by (city string) row format delimited fields terminated by "," ;
show tables;
show partitions student_ptn;
MSCK REPAIR TABLE student_ptn;
Impala采用了比较奇葩的多个impalad同时提供服务的方式,并且它会由catalogd缓存全部元数据,再通过statestored完成每一次的元数据的更新到impalad节点上,Impala集群会缓存全部的元数据,这种缓存机制就导致通过其他手段更新元数据或者数据对于Impala是无感知的,例如通过hive建表,直接拷贝新的数据到HDFS上等,Impala提供了两种机制来实现元数据的更新,分别是INVALIDATE METADATA
和REFRESH
操作。
INVALIDATE METADATA
是用于刷新全库或者某个表的元数据,包括表的元数据和表内的文件数据,它会首先清楚表的缓存,然后从metastore中重新加载全部数据并缓存,该操作代价比较重,主要用于在hive中修改了表的元数据,需要同步到impalad,例如create table/drop table/alter table add columns
等。
INVALIDATE METADATA 语法:
INVALIDATE METADATA; //重新加载所有库中的所有表
INVALIDATE METADATA [table] //重新加载指定的某个表
REFRESH
是用于刷新某个表或者某个分区的数据信息,它会重用之前的表元数据,仅仅执行文件刷新操作,它能够检测到表中分区的增加和减少,主要用于表中元数据未修改,数据的修改,例如INSERT INTO、LOAD DATA、ALTER TABLE ADD PARTITION、LLTER TABLE DROP PARTITION
等,如果直接修改表的HDFS文件(增加、删除或者重命名)也需要指定REFRESH刷新数据信息。
REFRESH 语法:
REFRESH [table] //刷新某个表
REFRESH [table] PARTITION [partition] //刷新某个表的某个分区
对于INVALIDATE METADATA
操作,由客户端将查询提交到某个impalad节点上,执行如下的操作:
INVALIDATE METADATA操作带来的副作用是生成一个新的未完成的元数据对象,对于操作请求的impalad(称它为impalad-A),能够立马获取到该对象,对于其它的impalad需要通过statestored同步,因此执行完该操作,处理该操作的impalad对于该表的缓存是一个新的但是不完整的对象,其余的impalad保存的是旧的元数据。
对于后续的该表查询操作,分为如下四种情况:
从INVALIDATE METADATA的实现来看,该操作不仅仅会全量加载表的元数据和分区、文件元数据,还会影响后面关于该表的查询。
对于REFRESH操作,由客户端将查询提交到某个impalad节点上,执行如下的操作:
对于后续的查询,分为如下两种情况:
可以看出REFRESH操作较之于INVALIDATE METADATA是轻量级的操作,如果更改只涉及到一个分区设置可以只刷新一个分区的元数据,并且它是同步的,对于之后查询的影响较小。
如果在使用过程中涉及到了元数据或者数据的更新,则需要使用这两者中的一个操作完成,具体如何选择需要根据如下原则:
REFRESH和INVALIDATE METADATA对于impala而言是比较重要的两个操作,分别处理数据和元数据的修改,其中REFRESH操作是同步的,INVALIDATE METADATA是异步的
参考:https://blog.csdn.net/weixin_43825553/article/details/89330413 https://blog.csdn.net/Shyllin/article/details/90070255