在Cloudera官方文档 Impala Metadata Management,找到了CDH平台中Impala自动同步Hive元数据的配置方法。
文档中提示这是CDH6.3/Impala3.3的一个预览特性,不是普遍有效的。
经过在CDH6.3.2集群中的实际测试,发现对于Hive的一般操作,Impala都可以有效自动同步。文档中提到对于Spark INSERT Hive的操作,Impala也可以自动同步,不过我没有对此进行测试验证。
这种机制称为 基于事件的自动元数据同步,是通过监控Hive元数据变动通知实现Impala周期性的自动同步,所以如果一个操作不会在HMS(Hive Metastore Server)中生成事件,那么这个操作就不会被同步到,例如Spark直接写数据到HDFS这种操作:
Seq((1, 2)).toDF("i", "j").write.save("/user/hive/warehouse/spark_etl.db/customers/date=01012019")
下面简要记录一下配置方法,详情请查看 Impala Metadata Management。
配置Hive
1、导航到 群集 > Hive > 配置 > 筛选器 > 范围 > Hive Metastore Server 。
2、选择 启用数据库中的存储通知 。
3、编辑 hive-site.xml 的 Hive Metastore Server 高级配置代码段(安全阀),添加如下配置:
名称 | 值 |
---|---|
hive.metastore.notifications.add.thrift.objects | true |
hive.metastore.alter.notifications.basic | false |
4、保存改变
5、如果你想要在Spark应用插入数据到已存在的表和分区时生成 INSERT 事件,则进行如下配置:
编辑 hive-site.xml 的 Hive 客户端高级配置代码段(安全阀),添加如下配置:
名称 | 值 |
---|---|
hive.metastore.dml.events | true |
编辑 hive-site.xml 的 Hive 服务高级配置代码段(安全阀),添加如下配置:
名称 | 值 |
---|---|
hive.metastore.dml.events | true |
6、保存改变,重启服务。
配置Impala
1、导航到 群集 > Impala > 配置 > 筛选器 > 范围 > Imapla Catalog Server 。
2、编辑 Catalog Server 命令行参数高级配置代码段(安全阀),添加配置:--hms_event_polling_interval_s=4
。
3、保存改变,重启服务。
--hms_event_polling_interval_s
是设置元数据同步频率的,默认为0,表示不同步。
关闭自动同步
当启用了基于事件的自动元数据同步后,默认对所有数据库和表有效。如果你希望控制同步的启用和关闭,可以使用impala.disableHmsSync
属性。
'impala.disableHmsSync'='true'
表示关闭。'impala.disableHmsSync'='false'
表示启用,这是默认配置。
关闭新数据库的自动同步
Impala不支持设置数据库属性,所以这个必须使用Hive操作。示例:
CREATE DATABASE <name> WITH DBPROPERTIES ('impala.disableHmsSync'='true');
启用或关闭表的自动同步
新建表,示例:
CREATE TABLE <name> ... TBLPROPERTIES ('impala.disableHmsSync'='true' | 'false');
更改表,示例:
ALTER TABLE <name> SET TBLPROPERTIES ('impala.disableHmsSync'='true' | 'false');