Iceberg數(shù)據(jù)源
本文介紹云數(shù)據(jù)庫(kù) SelectDB 版如何通過(guò)Catalog集成Iceberg數(shù)據(jù)源,對(duì)Iceberg數(shù)據(jù)源進(jìn)行聯(lián)邦分析。
前提條件
已將Iceberg集群所有節(jié)點(diǎn)IP添加至SelectDB的白名單。具體操作,請(qǐng)參見(jiàn)設(shè)置白名單。
了解什么是Catalog,以及Catalog的基本操作。具體信息,請(qǐng)參見(jiàn)湖倉(cāng)一體。
注意事項(xiàng)
支持Iceberg V1、V2表格式。
說(shuō)明V2表格式僅支持
Position Delete
方式,不支持Equality Delete
。目前,云數(shù)據(jù)庫(kù) SelectDB 版對(duì)External Catalog中的數(shù)據(jù)只支持讀操作。
操作步驟
本示例中,iceberg_catalog為目標(biāo)External Catalog,根據(jù)您的實(shí)際情況,替換成自己的參數(shù)。
步驟一:連接實(shí)例
連接SelectDB實(shí)例。具體操作,請(qǐng)參見(jiàn)通過(guò)MySQL客戶端連接云數(shù)據(jù)庫(kù)SelectDB版實(shí)例。
步驟二:集成Iceberg
SelectDB通過(guò)創(chuàng)建External Catalog集成外部數(shù)據(jù)源,不同的Catalog類型,其訪問(wèn)Iceberg元數(shù)據(jù)的API不同,根據(jù)您的具體需求,選擇合適的Catalog類型。
基于Hive API訪問(wèn)
如果您的Iceberg構(gòu)建在Hive之上,并期望SelectDB調(diào)用Hive的API獲取Iceberg元數(shù)據(jù),您可以創(chuàng)建hms類型的Catalog進(jìn)行集成Iceberg。具體操作與SelectDB集成Hive相同,此處僅提供簡(jiǎn)單示例,更多詳情,請(qǐng)參見(jiàn)Hive數(shù)據(jù)源。
CREATE CATALOG iceberg_catalog PROPERTIES (
'type'='hms',
'hive.metastore.uris' = 'thrift://172.21.0.1:7004',
'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:4007',
'dfs.namenode.rpc-address.your-nameservice.nn2'='172.21.0.3:4007',
'dfs.client.failover.proxy.provider.your-nameservice'='org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider'
);
基于Iceberg API訪問(wèn)
如果您期望SelectDB調(diào)用Iceberg的API獲取Iceberg元數(shù)據(jù),您可以根據(jù)Iceberg的服務(wù)類型,選擇合適的Catalog類型。
支持調(diào)用Iceberg的API獲取Iceberg元數(shù)據(jù)的服務(wù)有Hadoop File System
、Hive、REST、DLF等。
創(chuàng)建Iceberg Catalog中dfs相關(guān)的參數(shù)與Iceberg配置文件hdfs-site.xml中的參數(shù)是一一映射關(guān)系,參數(shù)和參數(shù)含義都相同。所以此處dfs相關(guān)參數(shù)值均需與配置文件hdfs-site.xml中的值保持一致。
Hadoop Catalog
-- 非HA集群
CREATE CATALOG iceberg_hadoop PROPERTIES (
'type'='iceberg',
'iceberg.catalog.type' = 'hadoop',
'warehouse' = 'hdfs://your-host:8020/dir/key'
);
-- HA集群
CREATE CATALOG iceberg_hadoop_ha PROPERTIES (
'type'='iceberg',
'iceberg.catalog.type' = 'hadoop',
'warehouse' = 'hdfs://your-nameservice/dir/key',
'dfs.nameservices'='your-nameservice',
'dfs.ha.namenodes.your-nameservice'='nn1,nn2',
'dfs.namenode.rpc-address.your-nameservice.nn1'='172.21.0.2:4007',
'dfs.namenode.rpc-address.your-nameservice.nn2'='172.21.0.3:4007',
'dfs.client.failover.proxy.provider.your-nameservice'='org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider'
);
如果您的數(shù)據(jù)存放在對(duì)象存儲(chǔ)(OSS)中,需要在PROPERTIES中配置以下參數(shù)。
"oss.access_key" = "ak"
"oss.secret_key" = "sk"
"oss.endpoint" = "oss-cn-beijing-internal.aliyuncs.com"
"oss.region" = "oss-cn-beijing"
參數(shù)說(shuō)明
如果您的數(shù)據(jù)存放在對(duì)象存儲(chǔ)(OSS)中,OSS相關(guān)參數(shù)為必選參數(shù)。
參數(shù) | 是否必選 | 說(shuō)明 |
type | 是 | Catalog類型,固定為iceberg。 |
warehouse | 是 | 倉(cāng)庫(kù)的HDFS路徑。 |
iceberg.catalog.type | 是 | Iceberg的catalog類型。固定為hadoop。 |
dfs.nameservices | 否 | 命名服務(wù)的名稱。 |
dfs.ha.namenodes.[nameservice ID] | 否 | NameNode的ID列表。 |
dfs.namenode.rpc-address.[nameservice ID].[name node ID] | 否 | NameNode的RPC地址,數(shù)量與NameNode數(shù)量相同。 |
dfs.client.failover.proxy.provider.[nameservice ID] | 否 | HDFS客戶端連接活躍NameNode的Java類,通常是 |
oss.region | 否 | 訪問(wèn)OSS數(shù)據(jù)的地域。 |
oss.endpoint | 否 | 訪問(wèn)OSS數(shù)據(jù)的 |
oss.access_key | 否 | 訪問(wèn)OSS數(shù)據(jù)的 |
oss.secret_key | 否 | 訪問(wèn)OSS數(shù)據(jù)的 |
Hive Metastore
CREATE CATALOG iceberg_catalog PROPERTIES (
'type'='iceberg',
'iceberg.catalog.type'='hms',
'hive.metastore.uris' = 'thrift://172.21.0.1:7004',
'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:4007',
'dfs.namenode.rpc-address.your-nameservice.nn2'='172.21.0.3:4007',
'dfs.client.failover.proxy.provider.your-nameservice'='org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider'
);
如果您的數(shù)據(jù)存放在對(duì)象存儲(chǔ)(OSS)中,需要在PROPERTIES中配置以下參數(shù)。
"oss.access_key" = "ak"
"oss.secret_key" = "sk"
"oss.endpoint" = "oss-cn-beijing-internal.aliyuncs.com"
"oss.region" = "oss-cn-beijing"
參數(shù)說(shuō)明
如果您的數(shù)據(jù)存放在對(duì)象存儲(chǔ)(OSS)中,OSS相關(guān)參數(shù)為必選參數(shù)。
參數(shù) | 是否必選 | 說(shuō)明 |
type | 是 | Catalog類型,固定為iceberg。 |
iceberg.catalog.type | 是 | Iceberg的Catalog類型。固定為hms。 |
hive.metastore.uris | 是 | Hive的metastore服務(wù)器URI。 |
hadoop.username | 否 | HDFS用戶名。 |
dfs.nameservices | 否 | Name Service名稱。 |
dfs.ha.namenodes.[nameservice ID] | 否 | NameNode的ID列表。 |
dfs.namenode.rpc-address.[nameservice ID].[name node ID] | 否 | NameNode的RPC地址,數(shù)量與NameNode數(shù)量相同。 |
dfs.client.failover.proxy.provider.[nameservice ID] | 否 | HDFS客戶端連接活躍NameNode的Java類,通常是 |
oss.region | 否 | 訪問(wèn)OSS數(shù)據(jù)的地域。 |
oss.endpoint | 否 | 訪問(wèn)OSS數(shù)據(jù)的 |
oss.access_key | 否 | 訪問(wèn)OSS數(shù)據(jù)的 |
oss.secret_key | 否 | 訪問(wèn)OSS數(shù)據(jù)的 |
REST Catalog
該方式需要預(yù)先提供REST服務(wù),您需實(shí)現(xiàn)獲取Iceberg元數(shù)據(jù)的REST接口。
CREATE CATALOG iceberg PROPERTIES (
'type'='iceberg',
'iceberg.catalog.type'='rest',
'uri' = 'http://172.21.0.1:8181'
);
如果您使用HDFS存儲(chǔ)數(shù)據(jù),并開(kāi)啟了高可用模式,還需在Catalog中增加HDFS高可用配置。
CREATE CATALOG iceberg PROPERTIES (
'type'='iceberg',
'iceberg.catalog.type'='rest',
'uri' = 'http://172.21.0.1:8181',
'dfs.nameservices'='your-nameservice',
'dfs.ha.namenodes.your-nameservice'='nn1,nn2',
'dfs.namenode.rpc-address.your-nameservice.nn1'='172.21.0.1:8020',
'dfs.namenode.rpc-address.your-nameservice.nn2'='172.21.0.2:8020',
'dfs.client.failover.proxy.provider.your-nameservice'='org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider'
);
參數(shù)說(shuō)明
參數(shù) | 是否必選 | 說(shuō)明 |
type | 是 | Catalog類型,固定為iceberg。 |
uri | 是 | REST服務(wù)的URI。 |
iceberg.catalog.type | 是 | Iceberg的catalog類型。固定為rest。 |
dfs.nameservices | 否 | Name Service名稱。 |
dfs.ha.namenodes.[nameservice ID] | 否 | NameNode的ID列表。 |
dfs.namenode.rpc-address.[nameservice ID].[name node ID] | 否 | NameNode的RPC地址,數(shù)量與NameNode數(shù)量相同,與hdfs-site.xml保持一致。 |
dfs.client.failover.proxy.provider.[nameservice ID] | 否 | HDFS客戶端連接活躍NameNode的Java類,通常是 |
步驟三:查看Catalog
您可以通過(guò)以下語(yǔ)句,查看Catalog創(chuàng)建是否成功。
SHOW CATALOGS; --查看CATALOG是否創(chuàng)建成功
+--------------+--------------+----------+-----------+-------------------------+---------------------+------------------------+
| CatalogId | CatalogName | Type | IsCurrent | CreateTime | LastUpdateTime | Comment |
+--------------+--------------+----------+-----------+-------------------------+---------------------+------------------------+
| 436009309195 | iceberg_catalog | jdbc | | 2024-08-06 17:09:08.058 | 2024-07-19 18:04:37 | |
| 0 | internal | internal | yes | UNRECORDED | NULL | Doris internal catalog |
+--------------+--------------+----------+-----------+-------------------------+---------------------+------------------------+
步驟四:查看Iceberg庫(kù)表數(shù)據(jù)
在目標(biāo)External Catalog目錄下查看Iceberg庫(kù)表數(shù)據(jù)。
說(shuō)明連接SelectDB實(shí)例后,默認(rèn)操作目錄為Internal Catalog。
切換目錄至目標(biāo)目錄External Catalog。
SWITCH iceberg_catalog;
查看數(shù)據(jù)。
完成目標(biāo)目錄切換后,您可以像使用Internal Catalog一樣,對(duì)External Catalog的數(shù)據(jù)進(jìn)行查看和訪問(wèn)。例如以下操作:
查看數(shù)據(jù)庫(kù)列表:
SHOW DATABASES;
切換數(shù)據(jù)庫(kù):
USE test_db;
查看數(shù)據(jù)庫(kù)表列表:
SHOW TABLES;
查看表數(shù)據(jù)。
在Iceberg中,每次對(duì)表的寫操作都會(huì)產(chǎn)生一個(gè)新的快照(Snapshot)。
默認(rèn)情況下,SelectDB的讀請(qǐng)求只會(huì)讀取Iceberg最新版本的快照,您可以使用
FOR time AS OF
和FOR version AS OF
語(yǔ)句,根據(jù)快照ID或者快照產(chǎn)生的時(shí)間讀取歷史版本的數(shù)據(jù)。示例如下:-- 查詢表test_t最新快照版本的數(shù)據(jù)。 SELECT * FROM test_t; -- 查詢表test_t指定時(shí)間的數(shù)據(jù)。 SELECT * FROM test_t FOR TIME AS OF "2022-10-07 17:20:37"; -- 查詢指定快照ID對(duì)應(yīng)表test_t的數(shù)據(jù)。 SELECT * FROM test_t FOR VERSION AS OF 868895038****72;
如果您不知道iceberg表的各類元數(shù)據(jù)信息,如操作歷史、生成的快照、文件元數(shù)據(jù)等,可通過(guò)表函數(shù)iceberg_meta獲取,更多表函數(shù)iceberg_meta詳情,請(qǐng)參見(jiàn)ICEBERG_META。
在Internal Catalog目錄下查看Iceberg庫(kù)表數(shù)據(jù)。
--查看iceberg_catalog目錄下,數(shù)據(jù)庫(kù)test_db中表test_t的最新快照版本的數(shù)據(jù)。 SELECT * FROM iceberg_catalog.test_db.test_t; -- 查詢指定時(shí)間test_t的數(shù)據(jù)。 SELECT * FROM iceberg_catalog.test_db.test_t FOR TIME AS OF "2022-10-07 17:20:37"; -- 查詢指定快照ID對(duì)應(yīng)的test_t表的數(shù)據(jù)。 SELECT * FROM iceberg_catalog.test_db.test_t FOR VERSION AS OF 868895038****72;
更多操作:遷移數(shù)據(jù)
完成數(shù)據(jù)源集成后,如果你需要將Iceberg的歷史數(shù)據(jù)遷移至SelectDB中,您可通過(guò)內(nèi)聯(lián)語(yǔ)法進(jìn)行歷史數(shù)據(jù)遷移,具體操作,請(qǐng)參見(jiàn)Insert Into。
類型映射
Iceberg數(shù)據(jù)源和SelectDB的列映射關(guān)系,與Hive數(shù)據(jù)源和SelectDB的映射關(guān)系一致。映射詳情,請(qǐng)參見(jiàn)Hive數(shù)據(jù)源。