文档

Hive数据源

更新时间:

通过连接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'
);

typehive.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可发现新的分区。

  1. REFRESH CATALOG:刷新指定Catalog,示例如下。

    REFRESH CATALOG ctl1 PROPERTIES("invalid_cache" = "true");

    该命令会刷新指定Catalog的库列表,表列名以及所有缓存信息等。

    invalid_cache表示是否要刷新缓存,默认为true。如果为false,则只会刷新Catalog的库、表列表,而不会刷新缓存信息。该参数适用于您只想同步新增删的库表信息时。

  2. REFRESH DATABASE:刷新指定Database,示例如下。

    REFRESH DATABASE [ctl.]db1 PROPERTIES("invalid_cache" = "true");

    该命令会刷新指定Database的表列名以及Database下的所有缓存信息等。invalid_cache表示是否要刷新缓存,默认为true。如果为false,则只会刷新Database的表列表,而不会刷新缓存信息。该参数适用于您只想同步新增删的表信息时。

  3. 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中由以下参数控制:

  1. enable_hms_events_incremental_sync:是否开启元数据自动增量同步功能,默认关闭。

  2. hms_events_polling_interval_ms:读取event的间隔时间,默认值为10000,单位毫秒。

  3. 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需要进行如下设置。

  1. 创建Catalog时,需增加配置:

"access_controller.properties.ranger.service.name" = "hive",
"access_controller.class" = "org.apache.doris.catalog.authorizer.RangerHiveAccessControllerFactory",
  1. 配置所有FE环境:

    1. 将HMS conf目录下的配置文件ranger-hive-audit.xmlranger-hive-security.xmlranger-policymgr-ssl.xml复制到FE的conf目录下。

    2. 修改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>
    3. 为获取到Ranger鉴权本身的日志,可在<selectdb_home>/conf目录下添加配置文件log4j.properties

    4. 重启FE。

  2. 说明

    此部分涉及修改SelectDB本地配置文件,如有需求,可通过工单方式联系支持。

  • 本页导读 (1)
文档反馈