View a markdown version of this page

將 Iceberg 叢集與 Hive 搭配使用 - Amazon EMR

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

將 Iceberg 叢集與 Hive 搭配使用

透過 Amazon EMR 6.9.0 版及更高版本,您可以將 Iceberg 與 Hive 叢集搭配使用,而無需執行開放原始碼 Iceberg Hive 整合所需的設定步驟。對於 Amazon EMR 6.8.0 版及更早版本,您可以使用引導操作來安裝 iceberg-hive-runtime jar,以設定 Hive for Iceberg 支援。

Amazon EMR 6.9.0 包括 Hive 3.1.3 與 Iceberg 0.14.1 整合的所有功能,還包括 Amazon EMR 新增的功能,例如在執行期自動選取支援的執行引擎 (EKS 6.9.0 上的 Amazon EMR)。

建立 Iceberg 叢集

您可以使用 AWS 管理主控台、 AWS CLI或 Amazon EMR API,建立已安裝 Iceberg 的叢集。在本教學課程中,您會使用 AWS CLI在 Amazon EMR 叢集上使用 Iceberg。若要使用主控台建立已安裝 Iceberg 的叢集,請遵循使用 Amazon Athena、Amazon EMR 和 AWS Glue 建置 Iceberg 資料湖中的步驟進行。

若要在 Amazon EMR 上使用 IcebergAWS CLI,請先使用下列步驟建立叢集。如需使用 AWS CLI或 Java 開發套件指定 Iceberg 分類的資訊,請參閱 當您建立叢集 AWS CLI 時,使用 提供組態在建立叢集時使用 Java SDK 提供組態。建立名為 configurations.json 且具有下列內容的檔案:

[{ "Classification":"iceberg-defaults", "Properties":{"iceberg.enabled":"true"} }]

接下來,使用下列組態建立叢集,並將範例 Amazon S3 儲存貯體路徑和子網路 ID 取代為您自己的值:

aws emr create-cluster --release-label emr-6.9.0 \ --applications Name=Hive \ --configurations file://iceberg_configurations.json \ --region us-east-1 \ --name My_hive_Iceberg_Cluster \ --log-uri s3://amzn-s3-demo-bucket/ \ --instance-type m5.xlarge \ --instance-count 2 \ --service-role EMR_DefaultRole \ --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,SubnetId=subnet-1234567890abcdef

Hive Iceberg 叢集執行下列操作:

  • 在 Hive 中載入 Iceberg Hive 執行期 jar,並為 Hive 引擎啟用 Iceberg 相關的組態。

  • 啟用 Amazon EMR Hive 的動態執行引擎選擇,以防止使用者設定支援的執行引擎實現 Iceberg 相容性。

注意

Hive Iceberg 叢集目前不支援 AWSGlue Data Catalog。預設 Iceberg 型錄為 HiveCatalog,它對應於為 Hive 環境設定的中繼存放區。如需目錄管理的詳細資訊,請參閱 Apache Hive 文件中的使用 HCatalog

功能支援

Amazon EMR 6.9.0 支援 Hive 3.1.3 和 Iceberg 0.14.1。此功能支援僅限於 Hive 3.1.2 和 3.1.3 的 Iceberg 相容功能。支援下列命令:

  • 使用 Amazon EMR 6.9.0 版至 6.12.x 版,您必須將 libfb303 jar 包含在 Hive auxlib 目錄中。使用下列命令將其包含在內:

    sudo /usr/bin/ln -sf /usr/lib/hive/lib/libfb303-*.jar /usr/lib/hive/auxlib/libfb303.jar

    使用 Amazon EMR 6.13 版及更高版本,libfb303 jar 會自動透過符號連結至 Hive auxlib 目錄。

  • 建立資料表

    • 非分割的資料表 – 可以透過提供儲存處理常式在 Hive 中建立外部資料表,如下所示:

      CREATE EXTERNAL TABLE x (i int) STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
    • 分割的資料表 – 可以在 Hive 中建立外部分割的資料表,如下所示:

      CREATE EXTERNAL TABLE x (i int) PARTITIONED BY (j int) STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
    注意

    Hive 3 不支援 ORC/AVRO/PARQUET 的 STORED AS 檔案格式。預設且唯一的選項是 Parquet。

  • 捨棄資料表DROP TABLE 命令用於捨棄資料表,如下列範例所示:

    DROP TABLE [IF EXISTS] table_name [PURGE];
  • 讀取資料表SELECT 陳述式可用於讀取 Hive 中的 Iceberg 資料表,如下列範例所示。支援的執行引擎為 MR 和 Tez。

    SELECT * FROM table_name

    如需有關 Hive 的 select 語法的資訊,請參閱 LanguageManual Select。如需有關 Hive 中 Iceberg 資料表的 select 陳述式的資訊,請參閱 Apache Iceberg Select

  • 插入到資料表 – HiveQL 的 INSERT INTO 陳述式僅適用於支援 Map Reduce 執行引擎的 Iceberg 資料表。Amazon EMR 使用者無需明確地設定執行引擎,因為 Amazon EMR Hive 會在執行期為 Iceberg 資料表選取引擎。

    • 單一資料表插入 – 範例:

      INSERT INTO table_name VALUES ('a', 1); INSERT INTO table_name SELECT...;
    • 多資料表插入 – 支援非原子多資料表插入到陳述式。範例:

      FROM source INSERT INTO table_1 SELECT a, b INSERT INTO table_2 SELECT c,d;

從 Amazon EMR 7.3.0 開始,Hive with Iceberg 支援 AWSGlue Data Catalog 作為中繼存放區。若要使用 AWSGlue Data Catalog 做為中繼存放區,請設定下列屬性。

SET iceberg.catalog.<catalog_name>.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog;

或者,您也可以設定下列屬性。

SET iceberg.catalog.<catalog_name>.type=glue;

然後,您可以使用下列範例建立資料表。

CREATE EXTERNAL TABLE table_name (col1 type1, col2 type2,..) ROW FORMAT SERDE 'org.apache.iceberg.mr.hive.HiveIcebergSerDe' STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler' location '<location>' TBLPROPERTIES ('table_type'='iceberg', 'iceberg.catalog'='<catalog_name>');

將 Iceberg 與 Hive 搭配使用的考量

  • Iceberg 支援下列查詢類型:

    • 建立資料表

    • 卸除資料表

    • 插入到資料表

    • 讀取資料表

  • DML (資料處理語言) 操作僅支援 MR (MapReduce) 執行引擎,而 MR 在 Hive 3.1.3 中已棄用。

  • 對於 7.3.0 之前的 Amazon EMR,搭配 Hive 的 Iceberg 目前不支援 AWSGlue Data Catalog。

  • 錯誤處理不夠強大。在組態錯誤的情況下,插入到查詢可能會成功完成。但是,無法更新中繼資料可能會導致資料遺失。

  • Iceberg Glue 整合不適用於 Redshift 受管儲存目錄。