Hive支援通過內表或外表的方式訪問Iceberg資料。本文通過樣本為您介紹如何使用EMR上的Hive訪問EMR Iceberg資料。
前提條件
已建立Hadoop叢集,詳情請參見建立叢集。
說明 此文檔僅適用於EMR-3.38.0及後續版本與EMR-5.4.0及後續版本的Hadoop叢集。
使用限制
EMR-3.38.0及後續版本與EMR-5.4.0及後續版本的Hadoop叢集,支援Hive讀寫Iceberg的資料。
操作步驟
- 可選:如果您建立的是EMR-3.38.0與EMR-5.4.0版本的叢集,則需要修改以下配置項。因為EMR-3.38.0與EMR-5.4.0版本的Hive與Iceberg整合存在一定相容性問題,所以需要修改以下配置。
- 進入Hive頁面。
- 在頂部功能表列處,根據實際情況選擇地區和資源群組。
- 單擊目的地組群操作列的叢集服務。
- 在叢集服務頁面,單擊Hive服務地區的配置。
- 根據您建立叢集的版本,修改配置資訊。
- EMR-3.38.0版本:在Hive服務的配置頁面,搜尋參數hive.metastore.event.listeners,刪除參數值。

- EMR-5.4.0版本:在Hive服務的配置頁面,搜尋參數metastore.event.listeners,刪除參數值。
- EMR-3.38.0版本:在Hive服務的配置頁面,搜尋參數hive.metastore.event.listeners,刪除參數值。
- 儲存配置。
- 單擊儲存。
- 在彈出的對話方塊中,輸入執行原因,單擊儲存。
- 重啟Hive服務,詳情請參見重啟服務。
- 進入Hive頁面。
- 進入Hive命令列。
- 使用SSH方式登入到叢集主節點,詳情請參見登入叢集。
- 執行以下命令,進入Hive命令列。
hive返回資訊如下所示時,表示進入Hive命令列。Logging initialized using configuration in file:/etc/ecm/hive-conf-2.3.5-2.0.3/hive-log4j2.properties Async: true Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
- 建立表。
- 如果建立叢集時,中繼資料選擇設定為DLF統一中繼資料,則可以按照以下步驟操作。
使用DLF統一中繼資料作為Hive中繼資料。該情境下,Hive只支援以外部表格的方式訪問Iceberg表。
- EMR-3.38.x版本和EMR-5.3.x~EMR-5.4.x版本(包含),需要設定Hive接入Iceberg使用DLF統一中繼資料的必要配置,其餘版本已預設添加。
SET iceberg.catalog=dlf_catalog; SET iceberg.catalog.dlf_catalog.type=custom; SET iceberg.catalog.dlf_catalog.io-impl=org.apache.iceberg.hadoop.HadoopFileIO; SET iceberg.catalog.dlf_catalog.catalog-impl=org.apache.iceberg.aliyun.dlf.DlfCatalog; SET iceberg.catalog.dlf_catalog.access.key.id=<yourAccessKeyId>; SET iceberg.catalog.dlf_catalog.access.key.secret=<yourAccessKeySecret>; SET iceberg.catalog.dlf_catalog.warehouse=<yourOSSWarehousePath> SET iceberg.catalog.dlf_catalog.dlf.catalog-id=<yourCatalogId>; SET iceberg.catalog.dlf_catalog.dlf.endpoint=<yourDLFEndpoint>; SET iceberg.catalog.dlf_catalog.dlf.region-id=<yourDLFRegionId>;說明 樣本中dlf_catalog為您建立的Catalog名稱,warehouse配置使用阿里雲Object Storage Service路徑,其餘參數含義請參見資料湖中繼資料配置。 - 建立Iceberg表。
- EMR-3.39.0及後續版本和EMR-5.5.0及後續版本,使用內表的方式建立Iceberg表。
create database iceberg_db; use iceberg_db; CREATE TABLE hive_iceberg ( id BIGINT, data STRING ) PARTITIONED BY ( dt STRING ) STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler' LOCATION 'hdfs://master-1-1.c-****:9000/user/hive/warehouse/iceberg_db/hive_iceberg' TBLPROPERTIES ('iceberg.catalog'='dlf'); insert into hive_iceberg values(1,"abc","20230407"),(2,"hello", "20230407"); select * from hive_iceberg;說明LOCATION 'hdfs://master-1-1.c-****:9000/user/hive/warehouse/iceberg_db/hive_iceberg':儲存資料路徑,支援HDFS和OSS路徑。請根據實際情況更換為實際路徑。 - EMR-3.38.x版本和EMR-5.3.x~EMR-5.4.x版本(包含),使用外表的方式建立Iceberg表,映射已經存在的iceberg_db.sample表。
CREATE EXTERNAL TABLE iceberg_db.sample_tbl STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler' LOCATION 'oss://some_bucket/some_path/sample' TBLPROPERTIES ( 'iceberg.catalog'='<yourCatalogName>', 'name'='iceberg_db.sample' );
- EMR-3.39.0及後續版本和EMR-5.5.0及後續版本,使用內表的方式建立Iceberg表。
- EMR-3.38.x版本和EMR-5.3.x~EMR-5.4.x版本(包含),需要設定Hive接入Iceberg使用DLF統一中繼資料的必要配置,其餘版本已預設添加。
- 如果建立叢集時,中繼資料選擇設定為內建MySQL或自建RDS,則可以按照以下步驟操作。
- 使用預設Catalog時,執行以下命令,建立表。
CREATE TABLE iceberg_db.sample_tbl ( id BIGINT, name STRING ) STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'; - 自訂Catalog時,執行以下命令。說明 Iceberg支援Hive類型、Hadoop類型或其他限定的自訂Catalog,本文檔以Hive類型為例。
- 設定Hive接入Iceberg的配置。
SET iceberg.catalog.hive_catalog.type=hive; - 建立Hive表。
CREATE TABLE iceberg_db.sample_tbl ( id bigint, name string ) STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler' TBLPROPERTIES ('iceberg.catalog'='hive_catalog');
- 設定Hive接入Iceberg的配置。
- 使用預設Catalog時,執行以下命令,建立表。
- 如果建立叢集時,中繼資料選擇設定為DLF統一中繼資料,則可以按照以下步驟操作。
- 執行以下命令,向表中寫入資料。
INSERT INTO iceberg_db.sample_tbl VALUES (4, 'd'), (5, 'e'), (6, 'f');如果寫資料時,遇到異常提示return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask,找不到fb303相關類路徑。您可以在Hive命令列中手動執行以下命令:- 非DataLake叢集
add jar /usr/lib/hive-current/lib/libfb303-0.9.3.jar - DataLake叢集
add jar /opt/apps/HIVE/hive-current/lib/libfb303-0.9.3.jar
- 非DataLake叢集
- 執行以下命令,查看錶資料。
SELECT * FROM iceberg_db.sample_tbl;
樣本1
本樣本使用DLF統一中繼資料,通過Hive外部表格的方式對一張已有的Iceberg表進行讀寫操作。
- 建立一個EMR-5.4.0的Hadoop叢集,中繼資料選擇DLF統一中繼資料,詳情請參見建立叢集。
- 修改配置項,詳情請參見操作步驟中的步驟1。
- 進入Hive命令列,詳情請參見操作步驟中的步驟2。
- 根據您實際資訊替換以下配置,設定Hive接入Iceberg使用DLF統一中繼資料的必要配置。
SET iceberg.catalog=dlf_catalog; SET iceberg.catalog.dlf_catalog.type=custom; SET iceberg.catalog.dlf_catalog.io-impl=org.apache.iceberg.hadoop.HadoopFileIO; SET iceberg.catalog.dlf_catalog.catalog-impl=org.apache.iceberg.aliyun.dlf.DlfCatalog; SET iceberg.catalog.dlf_catalog.access.key.id=<yourAccessKeyId>; SET iceberg.catalog.dlf_catalog.access.key.secret=<yourAccessKeySecret>; SET iceberg.catalog.dlf_catalog.warehouse=<yourOSSWarehousePath> SET iceberg.catalog.dlf_catalog.dlf.catalog-id=<yourCatalogId>; SET iceberg.catalog.dlf_catalog.dlf.endpoint=<yourDLFEndpoint>; SET iceberg.catalog.dlf_catalog.dlf.region-id=<yourDLFRegionId>;說明 樣本中dlf_catalog為預設的Catalog名稱,warehouse配置使用阿里雲Object Storage Service路徑,其餘參數含義請參見資料湖中繼資料配置。 - 執行以下命令,建立資料表iceberg_db.sample_ext,映射已有的iceberg_db.sample表。
CREATE EXTERNAL TABLE iceberg_db.sample_ext STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler' LOCATION 'oss://mybucket/iceberg-test/warehouse/iceberg_db.db/sample' TBLPROPERTIES ( 'iceberg.catalog'='dlf_catalog', 'name'='iceberg_db.sample' ); - 執行以下命令,通過外部表格查詢Iceberg表資料。
SELECT * FROM iceberg_db.sample_ext;返回資訊如下。OK 1 a 2 b 3 c Time taken: 19.075 seconds, Fetched: 3 row(s) - 執行以下命令,向表中寫入資料。
INSERT INTO iceberg_db.sample_ext VALUES (4, 'd'), (5, 'e'), (6, 'f'); - 執行以下命令,查詢Iceberg表資料。
SELECT * FROM iceberg_db.sample_ext;返回資訊如下。OK 1 a 2 b 3 c 4 d 5 e 6 f Time taken: 18.908 seconds, Fetched: 6 row(s)
樣本2
本樣本使用Hive預設中繼資料,建立一張格式為Iceberg的Hive內表並對其進行讀寫操作。
- 建立一個EMR-5.4.0的Hadoop叢集,中繼資料選擇內建MySQL,詳情請參見建立叢集。
- 修改配置項,詳情請參見操作步驟中的步驟1。
- 進入Hive命令列,詳情請參見操作步驟中的步驟2。
- 執行以下命令,建立資料庫iceberg_db。
CREATE DATABASE IF NOT EXISTS iceberg_db; - 執行以下命令,建立資料表sample_tbl。
CREATE TABLE iceberg_db.sample_tbl ( id BIGINT, name STRING ) STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'; - 執行以下命令,向表中寫入資料。
INSERT INTO iceberg_db.sample_tbl VALUES (1, 'a'), (2, 'b'), (3, 'c'); - 執行以下命令,查詢Iceberg表資料。
SELECT * FROM iceberg_db.sample_tbl;返回資訊如下。OK 1 a 2 b 3 c Time taken: 0.233 seconds, Fetched: 3 row(s)