本文介紹如何在AnalyticDB for PostgreSQL中,通過OSS FDW(Foreign Data Wrapper)訪問Apache Iceberg資料。
背景資訊
Apache Iceberg是一種開放的表格式,用於超大規模的分析資料集。它提供了版本控制、Schema演化、分區演化和高效查詢等特性。通過AnalyticDB for PostgreSQL提供的Iceberg支援,您可以:
直接存取Iceberg表中的資料,無需匯入。
利用AnalyticDB for PostgreSQL的MPP架構來加速分析Iceberg資料。
將本地表和Iceberg表進行關聯查詢、分析等。
與支援Iceberg的其他資料系統(如開源巨量資料元件Hive、Spark、StarRocks以及雲上EMR等)之間實現無縫資料共用。
版本限制
核心版本為7.3.0.0及以上的AnalyticDB for PostgreSQL7.0版執行個體。
前提條件
使用阿里雲帳號或具備
AliyunGPDBFullAccess、AliyunECSFullAccess、AliyunEMRFullAccess和AliyunOSSFullAccess許可權的RAM使用者,並為其建立AccessKey ID和AccessKey Secret。AnalyticDB for PostgreSQL執行個體和OSS儲存空間Bucket位於同一地區。
EMR叢集和AnalyticDB for PostgreSQL執行個體位於同一VPC。
說明除了EMR叢集外,您也可以使用其他工具(如Flink、StarRocks、Doris等)寫入Iceberg資料。
Iceberg表和資料已存在於OSS Bucket。
使用限制
確保AnalyticDB for PostgreSQL執行個體能夠訪問Iceberg的儲存系統和中繼資料服務。AnalyticDB for PostgreSQL支援以下儲存系統和中繼資料服務。
儲存系統:支援阿里雲Object Storage Service。暫不支援OSS-HDFS儲存和外部HDFS儲存。
中繼資料服務:Hive Metastore(以下簡稱HMS)以及基於目錄的Hadoop Catalog,其中HMS的串連地址應該為同一地區的內網地址,確保AnalyticDB for PostgreSQL的協調節點與HMS之間的網路暢通。
當前僅支援Iceberg表的查詢,暫不支援
INSERT、UPDATE或DELETE等修改操作。僅支援Iceberg表底層檔案格式為ORC和Parquet。
步驟一:建立OSS Server
使用以下SQL建立OSS Server,指定需要訪問的OSS服務端資訊。
文法
CREATE SERVER <server_name>
FOREIGN DATA WRAPPER <fdw_name>
OPTIONS (
endpoint '<endpoint_name>', -- OSS地區節點,請替換為實際使用的地區
bucket '<bucket_name>', -- OSS Bucket名稱
catalog_type '<catalog_name>', -- Iceberg catalog類型
CatalogParams
);參數說明
參數 | 類型 | 是否必填 | 說明 |
server_name | 字串 | 是 | OSS Server的名稱。 |
fdw_name | 字串 | 是 | 管理伺服器的外部資料容器的名稱,固定為oss_fdw。 |
OPTIONS參數選項請參見下表。
參數名稱 | 參數類型 | 是否必填 | 描述 | |
endpoint | 字串 | 是 | 訪問網域名稱,即訪問OSS的入口。AnalyticDB for PostgreSQL僅支援配置內網網域名稱。詳情請參見OSS地區和訪問網域名稱公用雲小節。 | |
bucket | 字串 | 否 | 資料檔案所屬的Bucket的名稱,擷取方法請參見準備工作。 說明
| |
catalog_type | 字串 | 是 | Iceberg Catalog的類型,取值如下:
重要 推薦您使用hive或hadoop。如需使用onemeta,請提交工單聯絡支援人員將Iceberg資料寫入DMS OneMeta。 | |
CatalogParams | hms_uris | 字串 | 否 | Hive MetaStore的URL,用於訪問Hive Catalog。格式為
重要
|
warehouse | 字串 | 否 | Iceberg資料倉儲的OSS路徑,用於訪問Hadoop Catalog。 | |
dms_endpoint | 字串 | 否 | 阿里雲DMS Endpoint,用於訪問DMS OneMeta。您可根據服務存取點擷取Endpoint與地區的對應關係。 | |
dms_region | 字串 | 否 | 阿里雲DMS地區ID,用於訪問DMS OneMeta。在DMS控制台點擊對應Catalog執行個體地區對應的 | |
更多詳情請參見使用OSS Foreign Table進行資料湖分析。
步驟二:建立OSS User Mapping
建立OSS Server後,您還需要建立一個訪問OSS Server的使用者。您可以使用CREATE USER MAPPING語句建立OSS User Mapping,用於定義AnalyticDB PostgreSQL版資料庫使用者與訪問OSS Server使用者的映射關係。更多介紹,請參見CREATE USER MAPPING。
文法
CREATE USER MAPPING FOR {username | USER | CURRENT_USER | PUBLIC}
SERVER <server_name>
OPTIONS (
id '<AccessKey ID>', -- 訪問OSS的AccessKey ID
key '<AccessKey Secret>' -- 訪問OSS的AccessKey Secret
dms_id '<AccessKey ID>', -- 訪問DMS的AccessKey ID
dms_key '<AccessKey Secret>' -- 訪問DMS的AccessKey Secret
);參數說明
參數 | 類型 | 是否必填 | 說明 |
username | 字串 | 是,四選一 | 指定映射的AnalyticDB PostgreSQL版執行個體的使用者名稱。 |
USER | 字串 | 映射當前的AnalyticDB PostgreSQL版執行個體的使用者名稱。 | |
CURRENT_USER | 字串 | ||
PUBLIC | 字串 | 匹配所有AnalyticDB PostgreSQL版執行個體的使用者名稱,包括以後建立的使用者。 | |
server_name | 字串 | 是 | OSS Server的名稱。 |
OPTIONS參數選項請參見下表。
參數 | 類型 | 是否必填 | 說明 |
id | 字串 | 是 | AccessKey ID,擷取方法,請參見建立AccessKey。 |
key | 字串 | 是 | AccessKey Secret,擷取方法,請參見建立AccessKey。 |
dms_id | 字串 | 否 | 用於訪問DMS OneMeta的AccessKey ID,可與本表格參數 |
dms_key | 字串 | 否 | 用於訪問DMS OneMeta的AccessKey Secret,可與本表格參數 |
步驟三:建立OSS FDW
擁有OSS Server和訪問OSS Server的使用者後,您可以開始建立OSS FDW。您可以使用CREATE FOREIGN TABLE語句建立OSS FDW,映射到Iceberg表。
Iceberg的基礎資料型別 (Elementary Data Type)會自動對應到AnalyticDB for PostgreSQL的資料類型,如BIGINT映射到bigint,STRING映射到text等。為了建立外表時確保類型相容,您可查看OSS Foreign Table資料類型對照表擷取更多映射類型詳情。
文法
CREATE FOREIGN TABLE <table_name> (
<column_name> <data_type>
[,...]
)
SERVER <server_name>
OPTIONS (
format 'iceberg', -- 指定格式為Iceberg
dms_catalog_name '<dms-catalog-name>', --DMS Onemeta Catalog 名稱
database_name '<database_name>', -- Iceberg資料庫名
table_name '<iceberg_table_name>' -- Iceberg表名
);參數說明
參數名稱 | 類型 | 是否必填 | 說明 |
table_name | 字串 | 是 | OSS FDW名稱。 |
column_name | 字串 | 是 | 列名。 |
data_type | 字串 | 是 | 該列的資料類型。 |
server_name | 字串 | 是 | OSS Server的名稱。 |
OPTIONS參數選項請參見下表。
參數 | 類型 | 是否必填 | 說明 |
format | 字串 | 是 | 此處設定為 |
dms_catalog_name | 字串 | 否 | DMS Onemeta Catalog名稱,僅在需要訪問DMS OneMeta時配置該參數。您可以在DMS控制台點擊對應Catalog執行個體查看。 |
database_name | 字串 | 是 | 目標Iceberg表所在的database名稱,OSS上的完整路徑為 |
table_name | 字串 | 是 | 目標Iceberg表的名稱,OSS上的完整路徑為 |
步驟四:訪問Iceberg資料
建立OSS Foreign Table後,您可以像查詢普通表一樣查詢Iceberg資料。
SELECT * FROM <iceberg_table_name>;
SELECT COUNT(*) FROM <iceberg_table_name>;使用樣本
本章節示範如何在AnalyticDB for PostgreSQL中訪問Iceberg資料。
樣本一:訪問EMR的Iceberg資料(Hadoop Catalog)
步驟一:登入EMR執行個體
使用SSH方式登入EMR叢集。
步驟二:登入Spark SQL
執行以下命令,通過Spark SQL讀寫Iceberg配置。
spark-sql --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \
--conf spark.sql.catalog.hadoop=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.hadoop.type=hadoop \
--conf spark.sql.catalog.hadoop.warehouse=oss://testBucketName/warehouse請將--conf spark.sql.catalog.hadoop.warehouse=oss://testBucketName/warehouse中的OSS路徑替換為實際OSS路徑。
當出現如下資訊時,表示已進入spark-sql命令列。
spark-sql>步驟三:建立Iceberg表並寫入資料
建立hadoop資料庫。
CREATE DATABASE IF NOT EXISTS hadoop.hadoop_db;建立測試表並寫入資料。
-- 建立測試表
CREATE TABLE IF NOT EXISTS hadoop.hadoop_db.hadoop_sample(
id BIGINT COMMENT 'unique id',
data STRING
)
USING iceberg;
-- 寫入資料
INSERT INTO hadoop.hadoop_db.hadoop_sample VALUES (1, 'a'), (2, 'b'), (3, 'c');查詢資料。
SELECT * FROM hadoop.hadoop_db.hadoop_sample;步驟四:驗證OSS檔案結構
登入OSS控制台,在目標Bucket中確認Iceberg中繼資料及資料檔案結構如下。
oss://testBucketName/warehouse/hadoop_db/hadoop_sample/
├── metadata/
│ ├── metadata.json
│ ├── snapshots.avro
│ └── manifests.avro
└── data/
└── parquet files...步驟五:建立Iceberg外表
根據EMR建立的Iceberg表結構,在AnalyticDB for PostgreSQL執行以下SQL建立Iceberg外表。
-- 建立OSS SERVER
CREATE SERVER oss_hadoop_srv
FOREIGN DATA WRAPPER oss_fdw
OPTIONS (
endpoint 'oss-cn-hangzhou-********.aliyuncs.com',
bucket 'testBucketName',
catalog_type 'hadoop',
warehouse 'oss://testBucketName/warehouse'
);
-- 建立OSS User Mapping
CREATE USER MAPPING FOR PUBLIC
SERVER oss_hadoop_srv
OPTIONS (
id 'LTAI****************', -- 訪問OSS的AccessKey ID
key 'yourAccessKeySecret' -- 訪問OSS的AccessKey Secret
);
-- 建立OSS FDW
CREATE FOREIGN TABLE sample (
id BIGINT,
data text
)
SERVER oss_hadoop_srv
OPTIONS (
format 'iceberg',
database_name 'hadoop_db',
table_name 'hadoop_sample'
);步驟六:執行聯邦查詢
使用如下SQL查詢資料。
SELECT * FROM sample;樣本二:訪問EMR的Iceberg資料(Hive Catalog)
步驟一:登入EMR執行個體
使用SSH方式登入EMR叢集。
步驟二:登入Spark SQL
執行以下命令,通過Spark SQL讀寫Iceberg配置。
spark-sql --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \
--conf spark.sql.catalog.hive=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.hive.type=hive當出現如下資訊時,表示已進入spark-sql命令列。
spark-sql>步驟三:建立Iceberg表並寫入資料
建立hive資料庫。
CREATE DATABASE IF NOT EXISTS hive.hive_db
COMMENT '資料庫儲存在OSS上'
LOCATION 'oss://testBucketName/warehouse/hive_db.db/';建立測試表並寫入資料。
-- 建立測試表
CREATE TABLE IF NOT EXISTS hive.hive_db.hive_sample(
id BIGINT COMMENT 'unique id',
data STRING
)
USING iceberg;
-- 寫入資料
INSERT INTO hive.hive_db.hive_sample VALUES (1, 'a'), (2, 'b'), (3, 'c');查詢資料。
SELECT * FROM hive.hive_db.hive_sample;步驟四:驗證OSS儲存結構
登入OSS控制台,在目標Bucket中確認Iceberg中繼資料及資料檔案結構如下。
oss://testBucketName/warehouse/hive_db.db/hive_sample/
├── metadata/
│ ├── metadata.json
│ ├── snapshots.avro
│ └── manifests.avro
└── data/
└── parquet files...步驟五:建立Iceberg外表
根據EMR建立的Iceberg表結構,在AnalyticDB for PostgreSQL執行以下SQL建立Iceberg外表。
-- 建立OSS SERVER
CREATE SERVER oss_hive_srv
FOREIGN DATA WRAPPER oss_fdw
OPTIONS (
endpoint 'oss-cn-hangzhou-********.aliyuncs.com',
bucket 'testBucketName',
catalog_type 'hive',
hms_uris 'thrift://192.168.XXX.XXX:9083'
);
-- 建立OSS User Mapping
CREATE USER MAPPING FOR PUBLIC
SERVER oss_hive_srv
OPTIONS (
id 'LTAI****************', -- 訪問OSS的AccessKey ID
key 'yourAccessKeySecret' -- 訪問OSS的AccessKey Secret
);
-- 建立OSS FDW
CREATE FOREIGN TABLE hive_sample(
id BIGINT,
data text
)
SERVER oss_hive_srv OPTIONS (
format 'iceberg',
database_name 'hive_db',
table_name 'hive_sample'
);步驟六:執行聯邦查詢
使用如下SQL查詢資料。
SELECT * FROM hive_sample;樣本三:訪問DMS OneMeta的Iceberg資料
如需使用DMS OneMeta Catalog,請提交工單聯絡支援人員將Iceberg資料寫入DMS OneMeta。
步驟一:建立Iceberg外表
根據DMS OneMeta中建立的Iceberg表結構,在AnalyticDB for PostgreSQL執行以下SQL建立Iceberg外表。
-- 建立SERVER
CREATE SERVER oss_dms_serv
FOREIGN DATA WRAPPER oss_fdw
OPTIONS (
endpoint 'oss-cn-hangzhou-********.aliyuncs.com',
bucket 'testBucketName',
catalog_type 'onemeta',
dms_endpoint '<dms_endpoint_name>',
dms_region '<dms_region_id>'
);
-- 建立OSS User Mapping
CREATE USER MAPPING FOR PUBLIC
SERVER oss_dms_serv
OPTIONS (
id 'LTAI****************', -- 訪問OSS的AccessKey ID
key 'yourAccessKeySecret', -- 訪問OSS的AccessKey Secret
dms_id 'LTAI****************', -- 訪問DMS的AccessKey ID
dms_key 'yourAccessKeySecret' -- 訪問DMS的AccessKey Secret
);
-- 建立外表
CREATE FOREIGN TABLE sample(
id BIGINT,
data text
)
SERVER oss_dms_serv OPTIONS (
format 'iceberg',
dms_catalog_name '<dms-catalog-name>',
database_name '<dms-database-name>',
table_name '<dms-table-name>'
);步驟二:執行聯邦查詢
使用如下SQL查詢資料。
SELECT * FROM sample;常見問題
Iceberg表中的資料類型如何映射到AnalyticDB for PostgreSQL?
Iceberg的基礎資料型別 (Elementary Data Type)會自動對應到AnalyticDB for PostgreSQL的資料類型,如BIGINT映射到bigint,STRING映射到text等。為了建立外表時確保類型相容,您可查看OSS Foreign Table資料類型對照表擷取更多映射類型詳情。
能否對Iceberg外表進行寫入操作?
不能。AnalyticDB for PostgreSQL僅支援查詢Iceberg外表。
如果Iceberg表所在Schema變更怎麼辦?
當Iceberg表所在的Schema發生變更時,需要重新建立AnalyticDB for PostgreSQL中的外表DDL以反映最新的表結構。