通过连接Hive Metastore,云数据库 SelectDB 版可以自动获取Hive的库表信息,进行数据查询、分析。除了Hive外,例如Iceberg、Hudi等其他系统也会使用Hive Metastore存储元数据。通过Hive Catalog,能轻松集成Hive及使用Hive Metastore作为元数据存储的系统。
注意事项
支持Hive1、Hive2、Hive3版本。
支持Managed Table和External Table,支持部分Hive View。
支持识别Hive Metastore中存储的Hive、Iceberg、Hudi元数据。
创建Catalog
Hive On HDFS
CREATE CATALOG hive PROPERTIES (
'type'='hms',
'hive.metastore.uris' = 'thrift://172.0.0.1:9083'
);
type
与hive.metastore.uris
为必须参数,同时您还可以提供例如HDFS HA信息等更多参数来传递连接所需要的信息,示例如下。
CREATE CATALOG hive PROPERTIES (
'type'='hms',
'hive.metastore.uris' = 'thrift://172.0.0.1:9083',
'hadoop.username' = 'hive',
'dfs.nameservices'='your-nameservice',
'dfs.ha.namenodes.your-nameservice'='nn1,nn2',
'dfs.namenode.rpc-address.your-nameservice.nn1'='172.21.0.2:8020',
'dfs.namenode.rpc-address.your-nameservice.nn2'='172.21.0.3:8020',
'dfs.client.failover.proxy.provider.your-nameservice'='org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider'
);
请确保连接的HDFS对云数据库 SelectDB 版开放传输数据所需要的端口,包括但不限于:
hive.metastore.uris
中指定端口,默认为9083。dfs.namenode.rpc-address
中指定端口,默认为8020。SelectDB到DataNode的传输端口,默认为9866。
Hive On OSS
CREATE CATALOG hive PROPERTIES (
"type"="hms",
"hive.metastore.uris" = "thrift://172.0.0.1:9083",
"oss.endpoint" = "oss-cn-beijing.aliyuncs.com",
"oss.access_key" = "ak",
"oss.secret_key" = "sk"
);
其中,oss.endpoint
填写bucket所在地域的内网Endpoint。
通过Hive On OSS方式访问时,创建Hive Database或Table时指定的location必须为以下格式:
oss://bucket/path
,其中bucket为使用的桶,path为具体路径。使用的Endpoint必须为内网Endpoint,否则可能会导致查询超时。
元数据缓存与刷新
针对Hive Catalog,SelectDB会缓存4种元数据:
表结构:缓存表的列信息等。
分区值:缓存每个表所有分区的分区值信息。
分区信息:缓存每个分区的信息,如分区数据格式,分区存储位置、分区值等。
文件信息:缓存每个分区所对应的文件信息,如文件路径位置等。
以上缓存信息不会持久化到SelectDB中,当SelectDB进行主备切换、FE节点重启等操作时,都可能导致缓存失效。缓存失效后,SelectDB会直接访问Hive MetaStore获取信息,并重新填充缓存。
元数据缓存可以根据您的需要,进行自动、手动,或配置 TTL(Time-to-Live)的方式进行更新。
默认行为和TTL
默认情况下,元数据缓存会在首次被填充后的10分钟后失效。该时间由fe.conf
的配置参数external_cache_expire_time_minutes_after_access
决定,并会影响Catalog下的所有4种元数据的缓存。
例如,SelectDB在10:00第一次访问表A的元数据,则该元数据会被缓存,并且在10:10自动失效。如果SelectDB在10:11再次访问相同的元数据,则会直接从Hive MetaStore获取信息,并重新填充至缓存中。
针对Hive中常用的INSERT INTO OVERWRITE PARTITION
操作,也可以通过配置文件信息缓存的TTL,来及时进行刷新,示例如下。
CREATE CATALOG hive PROPERTIES (
'type'='hms',
'hive.metastore.uris' = 'thrift://172.0.0.1:9083',
'file.meta.cache.ttl-second' = '60'
);
或者在创建完Catalog后,修改Catalog属性中的TTL,示例如下。
ALTER CATALOG hive SET PROPERTIES ('file.meta.cache.ttl-second' = '60');
上面的例子中,file.meta.cache.ttl-second
被设置为60秒,则缓存会在60秒后失效。这个参数只影响文件信息缓存。当该配置的值设置为0,则禁用分区文件缓存,每次都会从Hive MetaStore直接获取文件信息。
手动刷新
云数据库 SelectDB 版可通过REFRESH命令手动刷新元数据。
如需手动REFRESH以发现新的数据库对象,请REFRESH该对象的父层级,REFRESH会自动递归刷新子层级。例如:REFRESH DATABASE可发现新的TABLE,REFRESH TABLE可发现新的分区。
REFRESH CATALOG:刷新指定Catalog,示例如下。
REFRESH CATALOG ctl1 PROPERTIES("invalid_cache" = "true");
该命令会刷新指定Catalog的库列表,表列名以及所有缓存信息等。
invalid_cache
表示是否要刷新缓存,默认为true。如果为false,则只会刷新Catalog的库、表列表,而不会刷新缓存信息。该参数适用于您只想同步新增删的库表信息时。REFRESH DATABASE:刷新指定Database,示例如下。
REFRESH DATABASE [ctl.]db1 PROPERTIES("invalid_cache" = "true");
该命令会刷新指定Database的表列名以及Database下的所有缓存信息等。
invalid_cache
表示是否要刷新缓存,默认为true。如果为false,则只会刷新Database的表列表,而不会刷新缓存信息。该参数适用于您只想同步新增删的表信息时。REFRESH TABLE:刷新指定Table,示例如下。
REFRESH TABLE [ctl.][db.]tbl1;
该命令会刷新指定Table下的所有缓存信息等。
定时刷新
在创建Catalog时,设置Catalog的定时刷新。
CREATE CATALOG hive PROPERTIES ( 'type'='hms', 'hive.metastore.uris' = 'thrift://172.0.0.1:9083', 'metadata_refresh_interval_sec' = '600' );
创建完Catalog后,修改Catalog属性添加定时刷新能力。
ALTER CATALOG hive SET PROPERTIES ('metadata_refresh_interval_sec' = '600');
'metadata_refresh_interval_sec' = '600'
表示每600秒刷新一次Catalog。相当于每隔600秒,自动执行一次REFRESH CATALOG ctl1 PROPERTIES("invalid_cache" = "true");
操作。定时刷新间隔不得小于5秒。
自动刷新
自动刷新目前仅支持Hive Metastore元数据服务。通过让FE节点定时读取HMS的notification event来感知Hive表元数据的变更情况,目前支持处理如下event:
事件 | 事件行为和对应的动作 |
CREATE DATABASE | 在对应数据目录下创建数据库。 |
DROP DATABASE | 在对应数据目录下删除数据库。 |
ALTER DATABASE | 此事件的影响主要有更改数据库的属性信息,注释及默认存储位置等,这些改变不影响SelectDB对外部数据目录的查询操作,因此目前会忽略此event。 |
CREATE TABLE | 在对应数据库下创建表。 |
DROP TABLE | 在对应数据库下删除表,并失效表的缓存。 |
ALTER TABLE | 如果是重命名,先删除旧名字的表,再用新名字创建表,否则令该表的缓存失效。 |
ADD PARTITION | 在对应表缓存的分区列表里添加分区。 |
DROP PARTITION | 在对应表缓存的分区列表里删除分区,并失效该分区的缓存。 |
ALTER PARTITION | 如果是重命名,先删除旧名字的分区,再用新名字创建分区,否则令该分区的缓存失效。 |
当导入数据导致文件变更时,分区表会执行ALTER PARTITION的event逻辑,未分区表会执行ALTER TABL的event逻辑。如果绕过HMS直接操作文件系统的话,HMS不会生成对应事件,SelectDB因此也无法感知。
该特性在fe.conf
中由以下参数控制:
enable_hms_events_incremental_sync
:是否开启元数据自动增量同步功能,默认关闭。hms_events_polling_interval_ms
:读取event的间隔时间,默认值为10000,单位毫秒。hms_events_batch_size_per_rpc
:每次读取event的最大数量,默认值为500。
如果想使用该特性(除华为MRS),需要更改HMS的hive-site.xml
并重启HMS和HiveServer2:
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>
<property>
<name>hive.metastore.dml.events</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.transactional.event.listeners</name>
<value>org.apache.hive.hcatalog.listener.DbNotificationListener</value>
</property>
华为MRS需要更改hivemetastore-site.xml
并重启HMS和HiveServer2:
<property>
<name>metastore.transactional.event.listeners</name>
<value>org.apache.hive.hcatalog.listener.DbNotificationListener</value>
</property>
SelectDB可以正确访问不同Hive版本中的Hive Metastore。在默认情况下,SelectDB会以Hive 2.3版本的兼容接口访问Hive Metastore。您也可以在创建Catalog时指定Hive的版本。如访问Hive 1.1.0版本:
CREATE CATALOG hive PROPERTIES (
'type'='hms',
'hive.metastore.uris' = 'thrift://172.0.0.1:9083',
'hive.version' = '1.1.0'
);
列类型映射
适用于Hive/Iceberg/Hudi:
HMS Type | SelectDB Type | 备注 |
boolean | boolean | 无 |
tinyint | tinyint | 无 |
smallint | smallint | 无 |
int | int | 无 |
bigint | bigint | 无 |
date | date | 无 |
timestamp | datetime | 无 |
float | float | 无 |
double | double | 无 |
char | char | 无 |
varchar | varchar | 无 |
decimal | decimal | 无 |
array<type> | array<type> | 支持嵌套,如array<map<string, int>> |
map<KeyType, ValueType> | map<KeyType, ValueType> | 支持嵌套,如map<string, array<int>> |
struct<col1: Type1, col2: Type2, ...> | struct<col1: Type1, col2: Type2, ...> | 支持嵌套,如struct<col1: array<int>, col2: map<int, date>> |
other | unsupported | 无 |
使用Ranger进行权限校验
Apache Ranger是一个在Hadoop平台上提供监控、服务控制、全方位数据安全访问管理的安全框架。
云数据库 SelectDB 版目前支持Ranger的库、表、列权限,不支持加密、行权限等。
环境配置
连接开启Ranger权限校验的Hive Metastore需要进行如下设置。
创建Catalog时,需增加配置:
"access_controller.properties.ranger.service.name" = "hive",
"access_controller.class" = "org.apache.doris.catalog.authorizer.RangerHiveAccessControllerFactory",
配置所有FE环境:
将HMS conf目录下的配置文件
ranger-hive-audit.xml
、ranger-hive-security.xml
、ranger-policymgr-ssl.xml
复制到FE的conf目录下。修改
ranger-hive-security.xml
的属性,参考配置如下:<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> # The directory for caching permission data, needs to be writable <property> <name>ranger.plugin.hive.policy.cache.dir</name> <value>/mnt/datadisk0/zhangdong/rangerdata</value> </property> #The time interval for periodically pulling permission data <property> <name>ranger.plugin.hive.policy.pollIntervalMs</name> <value>30000</value> </property> <property> <name>ranger.plugin.hive.policy.rest.client.connection.timeoutMs</name> <value>60000</value> </property> <property> <name>ranger.plugin.hive.policy.rest.client.read.timeoutMs</name> <value>60000</value> </property> <property> <name>ranger.plugin.hive.policy.rest.ssl.config.file</name> <value></value> </property> <property> <name>ranger.plugin.hive.policy.rest.url</name> <value>http://172.21.0.32:6080</value> </property> <property> <name>ranger.plugin.hive.policy.source.impl</name> <value>org.apache.ranger.admin.client.RangerAdminRESTClient</value> </property> <property> <name>ranger.plugin.hive.service.name</name> <value>hive</value> </property> <property> <name>xasecure.hive.update.xapolicies.on.grant.revoke</name> <value>true</value> </property> </configuration>
为获取到Ranger鉴权本身的日志,可在
<selectdb_home>/conf
目录下添加配置文件log4j.properties
。重启FE。
此部分涉及修改SelectDB本地配置文件,如有需求,可通过工单方式联系支持。
- 本页导读 (1)