文档

Hive数据源

更新时间:
一键部署

本文介绍云数据库 SelectDB 版如何通过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'
);

具体的参数说明如下:

参数

是否必选

默认值

说明

type

Catalog类型,固定为hms。

hive.metastore.uris

Hive的metastore服务器URI。

hadoop.username

HDFS用户名。

dfs.nameservices

Name Service名称,与hdfs-site.xml保持一致。

dfs.ha.namenodes.[nameservice ID]

NameNode的ID列表,与hdfs-site.xml保持一致。

dfs.namenode.rpc-address.[nameservice ID].[name node ID]

NameNode的RPC地址,数量与NameNode数量相同,与hdfs-site.xml保持一致。

dfs.client.failover.proxy.provider.[nameservice ID]

HDFS客户端连接活跃NameNode的Java类,通常是org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider

重要

请确保连接的HDFS对云数据库 SelectDB 版开放传输数据所需要的端口,包括但不限于:

  • hive.metastore.uris中指定端口,默认为9083。

  • dfs.namenode.rpc-address中指定端口,默认为8020。

  • dfs.datanode.address中指定端口,默认为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"
);

参数说明如下:

参数

是否必选

默认值

说明

type

Catalog类型,固定为hms。

hive.metastore.uris

Hive的metastore服务器URI。

oss.endpoint

访问OSS数据的Endpoint,一般为bucket所在地域的内网Endpoint。如何获取,请参见访问域名和数据中心

oss.access_key

访问OSS数据的Accesskey ID

oss.secret_key

访问OSS数据的AccessKey Secret

重要
  • 通过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事件来感知Hive表元数据的变更情况,目前支持处理如下事件:

事件

事件行为和对应的动作

CREATE DATABASE

在对应数据目录下创建数据库。

DROP DATABASE

在对应数据目录下删除数据库。

ALTER DATABASE

此事件的影响主要有更改数据库的属性信息,注释及默认存储位置等,这些改变不影响云数据库 SelectDB 版对外部数据目录的查询操作,因此目前会忽略此事件。

CREATE TABLE

在对应数据库下创建表。

DROP TABLE

在对应数据库下删除表,并失效表的缓存。

ALTER TABLE

用于修改表结构或属性。

重要

如果要重命名,建议先删除旧名字的表,再用新名字创建表,否则会令该表的缓存失效。

ADD PARTITION

在对应表缓存的分区列表里添加分区。

DROP PARTITION

在对应表缓存的分区列表里删除分区,并失效该分区的缓存。

ALTER PARTITION

用于修改分区或者分区表的设置和属性。

重要

如果是重命名,先删除旧名字的分区,再用新名字创建分区,否则会令该分区的缓存失效。

重要

当导入数据导致文件变更时,分区表会执行ALTER PARTITION的事件逻辑,未分区表会执行ALTER TABLE的事件逻辑。如果绕过HMS直接操作文件系统的话,HMS不会生成对应事件,云数据库 SelectDB 版因此也无法感知。

该特性在fe.conf中由以下参数控制:

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

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

  3. hms_events_batch_size_per_rpc:每次读取事件的最大数量,默认值为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 版本地配置文件,如有需求,可通过工单方式联系支持。