Hive数据源

云数据库 SelectDB 版支持联邦查询,能够快速集成数据湖、数据库、远端文件等外部数据源,为您提供简便而高效的数据分析体验。本文介绍SelectDB如何使用Catalog集成Hive数据源,对Hive数据源进行联邦分析。

前提条件

  • 已将Hive集群所有节点IP添加至SelectDB的白名单。具体操作,请参见设置白名单

  • 如果您的Hive是基于HDFS构建的,确保HDFS开放了以下端口,用于Hive与SelectDB之间的传输数据。

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

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

    • dfs.datanode.address中指定的端口,默认为9866。

  • 了解什么是Catalog,以及Catalog的基本操作。更多详情,请参见湖仓一体

注意事项

  • 支持Hive1、Hive2、Hive3版本。

  • 支持Managed Table、External Table以及部分Hive View。

  • 支持识别Hive Metastore中存储的Hive、Iceberg、Hudi元数据。

  • 目前,云数据库 SelectDB 版对External Catalog中的数据只支持读操作。

示例环境

本示例以Linux系统为例,在SelectDB中,使用联邦技术查询基于HDFS构建的Hive中test_db.test_t数据。在实际使用中,请根据您的系统和使用环境修改对应参数。示例环境如下:

  • 业务场景:非HA

  • 源数据Hive的构建类型:HDFS

  • 源数据库:test_db

  • 源数据表:test_t

源数据准备

  1. 登录目标源数据Hive。

  2. 创建数据库testdb。

    CREATE database if NOT EXISTS test_db;
  3. 创建表Hive_t。

    CREATE TABLE IF NOT EXISTS test_t (
        id INT,
        name STRING,
        age INT
    );
  4. 插入数据。

    -- 插入数据
    INSERT INTO TABLE test_t VALUES
    (1, 'Alice', 25),
    (2, 'Bob', 30),
    (3, 'Charlie', 35),
    (4, 'David', 40),
    (5, 'Eve', 45);

操作步骤

步骤一:连接实例

连接SelectDB实例。具体操作,请参见通过MySQL客户端连接云数据库SelectDB版实例

步骤二:集成Hive

SelectDB通过创建External Catalog集成外部数据源,不同的业务场景,Catalog的配置参数不同,根据您的业务场景,选择合适的语法以及参数配置。

创建Catalog后,云数据库 SelectDB 版会自动同步数据目录的数据库和表。针对不同的数据目录和数据表格式,云数据库 SelectDB 版会进行列与列之间的关系映射。如果您还不清楚Hive与SelectDB的列映射关系,请参见下述列类型映射章节。

Hive基于HDFS构建

语法
CREATE CATALOG <catalog_name> PROPERTIES (
    'type'='<type>',
    'hive.metastore.uris' = '<hive.metastore.uris>',
    'hadoop.username' = '<hadoop.username>',
    'dfs.nameservices'='<hadoop.username>',
    'dfs.ha.namenodes.your-nameservice'='<dfs.ha.namenodes.your-nameservice>',
    'dfs.namenode.rpc-address.your-nameservice.nn1'='<dfs.namenode.rpc-address.your-nameservice.nn1>',
    'dfs.namenode.rpc-address.your-nameservice.nn2'='<dfs.namenode.rpc-address.your-nameservice.nn2>',
    'dfs.client.failover.proxy.provider.your-nameservice'='<dfs.client.failover.proxy.provider.your-nameservice>'
);
参数说明

非HA场景

参数

必选

说明

catalog_name

Catalog的名称。

type

Catalog类型。固定填写hms。

hive.metastore.uris

Hive MetaStore的URI。

  • 格式为thrift://<Hive MetaStore的IP地址>:<端口号>

  • 端口号默认为9083。

  • 可通过SET hive.metastore.uris在Hive终端执行获取。

HA场景

参数

必选

说明

catalog_name

Catalog的名称。

type

Catalog类型。固定填写hms。

hive.metastore.uris

Hive MetaStore的URI。

  • 格式为thrift://<Hive MetaStore的IP地址>:<端口号>

  • 端口号默认为9083。

  • 可通过SET hive.metastore.uris在Hive终端执行获取。

hadoop.username

HDFS用户名。

dfs.nameservices

Name Service名称,与已有Hive环境依赖的hdfs-site.xml配置文件里dfs.nameservices的值保持一致。

dfs.ha.namenodes.[nameservice ID]

NameNode的ID列表,与已有Hive环境依赖的hdfs-site.xml配置文件里的相应配置项的值保持一致。

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

NameNode的RPC地址,数量与NameNode数量相同,与已有Hive环境依赖的hdfs-site.xml配置文件里的相应配置项的值保持一致。

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

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

非HA场景示例
CREATE CATALOG hive_catalog PROPERTIES (
    'type'='hms',
    'hive.metastore.uris' = 'thrift://master-1-1.c-7fa25a1a****.cn-hangzhou.emr.aliyuncs.com:9083'
);

Hive基于阿里云OSS构建

语法

此处语法同Hive基于HDFS构建一致,只是必选参数不同。

参数说明

参数

必选

说明

type

Catalog类型。固定填写hms。

hive.metastore.uris

Hive MetaStore的URI。

  • 格式为thrift://<Hive MetaStore的IP地址>:<端口号>

  • 端口号默认为9083。

  • 可通过SET hive.metastore.uris在Hive终端执行获取。

oss.endpoint

访问OSS数据的Endpoint。如何获取,请参见访问域名和数据中心

oss.access_key

访问OSS数据的Accesskey ID

oss.secret_key

访问OSS数据的AccessKey Secret

示例

CREATE CATALOG hive_catalog 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"
);

步骤三:查看Catalog

您可以通过以下语句,查看Catalog创建是否成功。

SHOW CATALOGS; --查看CATALOG是否创建成功
+--------------+--------------+----------+-----------+-------------------------+---------------------+------------------------+
| CatalogId    | CatalogName  | Type     | IsCurrent | CreateTime              | LastUpdateTime      | Comment                |
+--------------+--------------+----------+-----------+-------------------------+---------------------+------------------------+
| 436009309195 | hive_catalog | hms      |           | 2024-07-19 17:09:08.058 | 2024-07-19 18:04:37 |                        |
|            0 | internal     | internal | yes       | UNRECORDED              | NULL                | Doris internal catalog |
+--------------+--------------+----------+-----------+-------------------------+---------------------+------------------------+

步骤四:查看Hive库表数据

  • 在目标External Catalog目录下查看Hive库表数据。

    说明

    连接SelectDB实例后,默认操作目录为Internal Catalog。

    1. 切换目录至目标External Catalog。

      SWITCH hive_catalog;
    2. 查看数据。

      完成目标目录切换后,您可以像使用Internal Catalog一样,对External Catalog的数据进行查看和访问。例如以下操作:

      • 查看数据库列表:SHOW DATABASES;

      • 切换数据库:USE test_db;

      • 查看数据库表列表:SHOW TABLES;

      • 查看表数据:SELECT * FROM test_t;

  • 在Internal Catalog目录下查看Iceberg库表数据。

    --查看hive_catalog目录下,数据库test_db中表test_t的数据。
    SELECT * FROM hive_catalog.test_db.test_t;

更多操作:迁移数据

完成数据源集成后,如果你需要将Hive的历史数据迁移至SelectDB中,您可通过内联语法进行历史数据迁移,具体操作,请参见Insert Into

列类型映射

说明
  • 以下HMS Type适用于Hive、Iceberg和Hudi。

  • 以下部分复杂结构的HMS Type和SelectDB Type支持嵌套

    • array<type>:嵌套示例:array<map<string, int>>

    • map<KeyType, ValueType>:嵌套示例:map<string, array<int>>

    • struct<col1: Type1, col2: Type2, ...>:嵌套示例:struct<col1: array<int>, col2: map<int, date>>

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>

map<KeyType, ValueType>

map<KeyType, ValueType>

struct<col1: Type1, col2: Type2, ...>

struct<col1: Type1, col2: Type2, ...>

other

unsupported