impala同步hive数据

本文介绍了如何在Impala中使用invalidatemetadata和refresh命令同步Hive元数据,包括场景、命令用法和生产脚本示例。重点强调了两者在数据更新效率和资源消耗上的区别,以及何时选择刷新特定表或分区。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、impala同步hive的元数据的两种方式
1、invalidate metadata
对于通过Hive创建,删除或者修改表等操作,Impala无法自动感知到Hive元数据的变化,想让Impala识别到这个变化需要在impala shell中输入invalidate metadata,该语句会使得impala原元数据失效并且重新从元数据库同步元数据信息。可以对所有表执行,也可以指定某张表

invalidate metadata;    -- 废除所有表的元数据; 这种命令一般禁用
invalidate metadata [table];   -- 废除表table的元数据

2、refresh
对于通过hive加载,插入,改变的数据操作,或者通过hdfs对数据进行改变的操作,impala都无法自动识别数据的变化,可以使用REFRESH table_name,该语句可以让impala识别到数据的变化,可以对某张表更新元数据,也可以对某张表的某分区更新元数据。

refresh [table];                           -- 刷新表table的元数据
refresh [table] partition [partition];     -- 刷新表table的partition分区元数据

3、同步元数据生产脚本(适合表结构没变的)

#bin/sh
set -e
shopt -s expand_aliases  #这里是可以在shell里面用重命名
.~/.bash_profiles
typeset -u sub_part_flag #把变量转换成大写
# typeset的-l选项将一个变量的字符变成小写
# typeset的-u选项将一个变量的字符变成大写
table_name=$1
part_name=$2
sub_part_flag=$3
dw_hdfs_path="/user/hive/warehouse"
if ["x${sub_part_flag}!=xY"];then  
--如果参数3输入的是非Y的字符,那么代表没有二级分区的
	sync_cmd="use impala;refresh ${table_name} partition(${part_name})"
	echo "`date`:sync_cmd=${sync_cmd}"
	impala2 -e "${sync_cmd}"
	echo "date`:finish:${sync_cmd}"
else
	part_hdfs_path="${dw_hdfs_path}"/$({echo ${table_name}} | sed "s/\./\.db\//")/$(echo {part_name}| sed "s/ //g;s/'//g;s/\,/\//")
	for sub_part in $({hdfs dfs -ls ${part_hdfs_path} | grep ^d | awk -F"/" '{print $NF}'| awk -F"=" '{print $1"='\''"$2"'\''"}');do
	sync_cmd="use impala;refresh ${table_name} partition(${part_name},${sub_part})"
	echo "`date`:sync_cmd"
	impala2 -e "${sync_cmd}"
	echo "`date`:finnish:${sync_cmd}"
	done
	echo "$part_hdfs_path"
fi

4、总结

  • invalidate metadata 会加载相关表的所有元数据信息,这个操作对于有很多分区的大表成本非常高,refresh加载元数据更快,因为它只要加载新增的数据文件块的位置数据,如果数仓中发生了增删表或改变表结构的行为,如create table、drop table、alter table add column等,就使用invalidate metadata [table]语句。
  • 如果数仓中某表加入了新数据,或者有分区的改动,如load data、alter table add partition等,就使用refresh [table] (partition [partition])语句。
  • invalidate metadata比起refresh而言要重量级得多,并且它造成impalad之间查询不一致也会更严重。因此,也几乎禁止使用 不带表名的invalidate metadata语句。
  • 如果数仓中涉及到非常大批量的元数据更改,那么建议直接重启catalogd和statestored,这总比使用不带表名的invalidate metadata来得高效一些。
### HiveImpala元数据对比及其关系 #### 元数据存储位置 在Hive环境中,所有的表结构定义和其他辅助元数据都保存在一个称为Metastore的服务中。这个服务通常由MySQL或PostgreSQL这样的关系型数据库提供支持[^1]。 对于Impala而言,并不自带独立的元数据管理组件;相反,它依赖于Hive Metastore来获取关于表格的信息以及模式(schema),这意味着两者可以共享相同的元数据仓库,从而简化了跨工具的数据访问过程。 #### 数据更新机制 当通过Hive创建新表或将现有文件注册到某个特定目录下作为外部表时,这些操作会触发向Metastore写入相应的描述信息。而一旦完成上述任一动作之后,在同一集群内的Impala查询引擎便能够立即识别并利用该些资源执行读取请求,无需额外同步步骤即可保持一致的状态。 然而值得注意的是,尽管存在这种紧密耦合的关系,但在某些情况下仍需手动刷新缓存以确保最新变更被及时反映给Impala实例——例如修改分区属性或是增加新的分片路径等情形之下。 ```sql -- 刷新指定表的元数据以便让最新的更改生效 INVALIDATE METADATA my_table; ``` #### 性能考量 由于Impala设计之初就考虑到了低延迟需求场景的应用特点,因此其架构上更倾向于直接扫描原始格式化后的二进制编码形式而非经过序列化的中间件表示法来进行高效解析处理工作流中的每一项任务。相比之下,Hive则更多地依靠MapReduce作业框架完成类似功能实现,这使得前者能够在交互式分析方面展现出明显优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值