Hive支持通過(guò)內(nèi)表或外表的方式訪問(wèn)Iceberg數(shù)據(jù)。本文通過(guò)示例為您介紹如何使用EMR上的Hive訪問(wèn)EMR Iceberg數(shù)據(jù)。
前提條件
已創(chuàng)建Hadoop集群,詳情請(qǐng)參見(jiàn)創(chuàng)建集群。
說(shuō)明 此文檔僅適用于EMR-3.38.0及后續(xù)版本與EMR-5.4.0及后續(xù)版本的Hadoop集群。
使用限制
EMR-3.38.0及后續(xù)版本與EMR-5.4.0及后續(xù)版本的Hadoop集群,支持Hive讀寫(xiě)Iceberg的數(shù)據(jù)。
操作步驟
- 可選:如果您創(chuàng)建的是EMR-3.38.0與EMR-5.4.0版本的集群,則需要修改以下配置項(xiàng)。因?yàn)镋MR-3.38.0與EMR-5.4.0版本的Hive與Iceberg集成存在一定兼容性問(wèn)題,所以需要修改以下配置。
- 進(jìn)入Hive命令行。
- 創(chuàng)建表。
- 如果創(chuàng)建集群時(shí),元數(shù)據(jù)選擇設(shè)置為DLF統(tǒng)一元數(shù)據(jù),則可以按照以下步驟操作。
使用DLF統(tǒng)一元數(shù)據(jù)作為Hive元數(shù)據(jù)。該場(chǎng)景下,Hive只支持以外部表的方式訪問(wèn)Iceberg表。
- EMR-3.38.x版本和EMR-5.3.x~EMR-5.4.x版本(包含),需要設(shè)置Hive接入Iceberg使用DLF統(tǒng)一元數(shù)據(jù)的必要配置,其余版本已默認(rèn)添加。
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>;
說(shuō)明 示例中dlf_catalog為您創(chuàng)建的Catalog名稱(chēng),warehouse配置使用阿里云對(duì)象存儲(chǔ)OSS路徑,其余參數(shù)含義請(qǐng)參見(jiàn)數(shù)據(jù)湖元數(shù)據(jù)配置。 - 創(chuàng)建Iceberg表。
- EMR-3.39.0及后續(xù)版本和EMR-5.5.0及后續(xù)版本,使用內(nèi)表的方式創(chuàng)建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;
說(shuō)明LOCATION 'hdfs://master-1-1.c-****:9000/user/hive/warehouse/iceberg_db/hive_iceberg'
:存儲(chǔ)數(shù)據(jù)路徑,支持HDFS和OSS路徑。請(qǐng)根據(jù)實(shí)際情況更換為實(shí)際路徑。 - EMR-3.38.x版本和EMR-5.3.x~EMR-5.4.x版本(包含),使用外表的方式創(chuàng)建Iceberg表,映射已經(jīng)存在的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' );
說(shuō)明 示例中參數(shù):<yourCatalogName>
:Catalog的名稱(chēng),不同集群版本的Catalog名稱(chēng)有差異,具體請(qǐng)根據(jù)數(shù)據(jù)湖元數(shù)據(jù)配置修改Catalog名稱(chēng)。iceberg_db.sample
:是一張已存在的表,您可以提前創(chuàng)建好,詳情請(qǐng)參見(jiàn)基礎(chǔ)使用。
- EMR-3.39.0及后續(xù)版本和EMR-5.5.0及后續(xù)版本,使用內(nèi)表的方式創(chuàng)建Iceberg表。
- EMR-3.38.x版本和EMR-5.3.x~EMR-5.4.x版本(包含),需要設(shè)置Hive接入Iceberg使用DLF統(tǒng)一元數(shù)據(jù)的必要配置,其余版本已默認(rèn)添加。
- 如果創(chuàng)建集群時(shí),元數(shù)據(jù)選擇設(shè)置為內(nèi)置MySQL或自建RDS,則可以按照以下步驟操作。
- 使用默認(rèn)Catalog時(shí),執(zhí)行以下命令,創(chuàng)建表。
CREATE TABLE iceberg_db.sample_tbl ( id BIGINT, name STRING ) STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';
- 自定義Catalog時(shí),執(zhí)行以下命令。說(shuō)明 Iceberg支持Hive類(lèi)型、Hadoop類(lèi)型或其他限定的自定義Catalog,本文檔以Hive類(lèi)型為例。
- 設(shè)置Hive接入Iceberg的配置。
SET iceberg.catalog.hive_catalog.type=hive;
- 創(chuàng)建Hive表。
CREATE TABLE iceberg_db.sample_tbl ( id bigint, name string ) STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler' TBLPROPERTIES ('iceberg.catalog'='hive_catalog');
- 設(shè)置Hive接入Iceberg的配置。
- 使用默認(rèn)Catalog時(shí),執(zhí)行以下命令,創(chuàng)建表。
- 如果創(chuàng)建集群時(shí),元數(shù)據(jù)選擇設(shè)置為DLF統(tǒng)一元數(shù)據(jù),則可以按照以下步驟操作。
- 執(zhí)行以下命令,向表中寫(xiě)入數(shù)據(jù)。
INSERT INTO iceberg_db.sample_tbl VALUES (4, 'd'), (5, 'e'), (6, 'f');
如果寫(xiě)數(shù)據(jù)時(shí),遇到異常提示return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
,找不到fb303相關(guān)類(lèi)路徑。您可以在Hive命令行中手動(dòng)執(zhí)行以下命令:- 非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集群
- 執(zhí)行以下命令,查看表數(shù)據(jù)。
SELECT * FROM iceberg_db.sample_tbl;
示例1
本示例使用DLF統(tǒng)一元數(shù)據(jù),通過(guò)Hive外部表的方式對(duì)一張已有的Iceberg表進(jìn)行讀寫(xiě)操作。
- 創(chuàng)建一個(gè)EMR-5.4.0的Hadoop集群,元數(shù)據(jù)選擇DLF統(tǒng)一元數(shù)據(jù),詳情請(qǐng)參見(jiàn)創(chuàng)建集群。
- 修改配置項(xiàng),詳情請(qǐng)參見(jiàn)操作步驟中的步驟1。
- 進(jìn)入Hive命令行,詳情請(qǐng)參見(jiàn)操作步驟中的步驟2。
- 根據(jù)您實(shí)際信息替換以下配置,設(shè)置Hive接入Iceberg使用DLF統(tǒng)一元數(shù)據(jù)的必要配置。
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>;
說(shuō)明 示例中dlf_catalog為默認(rèn)的Catalog名稱(chēng),warehouse配置使用阿里云對(duì)象存儲(chǔ)OSS路徑,其余參數(shù)含義請(qǐng)參見(jiàn)數(shù)據(jù)湖元數(shù)據(jù)配置。 - 執(zhí)行以下命令,創(chuàng)建數(shù)據(jù)表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' );
- 執(zhí)行以下命令,通過(guò)外部表查詢Iceberg表數(shù)據(jù)。
SELECT * FROM iceberg_db.sample_ext;
返回信息如下。OK 1 a 2 b 3 c Time taken: 19.075 seconds, Fetched: 3 row(s)
- 執(zhí)行以下命令,向表中寫(xiě)入數(shù)據(jù)。
INSERT INTO iceberg_db.sample_ext VALUES (4, 'd'), (5, 'e'), (6, 'f');
- 執(zhí)行以下命令,查詢Iceberg表數(shù)據(jù)。
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默認(rèn)元數(shù)據(jù),創(chuàng)建一張格式為Iceberg的Hive內(nèi)表并對(duì)其進(jìn)行讀寫(xiě)操作。
- 創(chuàng)建一個(gè)EMR-5.4.0的Hadoop集群,元數(shù)據(jù)選擇內(nèi)置MySQL,詳情請(qǐng)參見(jiàn)創(chuàng)建集群。
- 修改配置項(xiàng),詳情請(qǐng)參見(jiàn)操作步驟中的步驟1。
- 進(jìn)入Hive命令行,詳情請(qǐng)參見(jiàn)操作步驟中的步驟2。
- 執(zhí)行以下命令,創(chuàng)建數(shù)據(jù)庫(kù)iceberg_db。
CREATE DATABASE IF NOT EXISTS iceberg_db;
- 執(zhí)行以下命令,創(chuàng)建數(shù)據(jù)表sample_tbl。
CREATE TABLE iceberg_db.sample_tbl ( id BIGINT, name STRING ) STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';
- 執(zhí)行以下命令,向表中寫(xiě)入數(shù)據(jù)。
INSERT INTO iceberg_db.sample_tbl VALUES (1, 'a'), (2, 'b'), (3, 'c');
- 執(zhí)行以下命令,查詢Iceberg表數(shù)據(jù)。
SELECT * FROM iceberg_db.sample_tbl;
返回信息如下。OK 1 a 2 b 3 c Time taken: 0.233 seconds, Fetched: 3 row(s)
相關(guān)文檔
- Iceberg相關(guān)的介紹,請(qǐng)參見(jiàn)Iceberg概述。
- Iceberg表使用DLF統(tǒng)一元數(shù)據(jù)的必要配置,請(qǐng)參見(jiàn)數(shù)據(jù)湖元數(shù)據(jù)配置。