云数据库 SelectDB 版支持联邦查询,能够快速集成数据湖、数据库、远端文件等外部数据源,为您提供简便而高效的数据分析体验。本文介绍SelectDB如何使用Catalog集成Hive数据源,对Hive数据源进行联邦分析。
前提条件
注意事项
支持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
源数据准备
登录目标源数据Hive。
创建数据库testdb。
CREATE database if NOT EXISTS test_db;
创建表Hive_t。
CREATE TABLE IF NOT EXISTS test_t ( id INT, name STRING, age INT );
插入数据。
-- 插入数据 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。
|
HA场景
参数 | 必选 | 说明 |
catalog_name | 是 | Catalog的名称。 |
type | 是 | Catalog类型。固定填写hms。 |
hive.metastore.uris | 是 | Hive MetaStore的URI。
|
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类,通常是 |
非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。
|
oss.endpoint | 是 | 访问OSS数据的 |
oss.access_key | 是 | 访问OSS数据的 |
oss.secret_key | 是 | 访问OSS数据的 |
示例
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。
切换目录至目标External Catalog。
SWITCH hive_catalog;
查看数据。
完成目标目录切换后,您可以像使用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 |