

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

# 將 Iceberg 叢集與 Hive 搭配使用
<a name="emr-iceberg-use-hive-cluster"></a>

透過 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 整合](https://iceberg.apache.org/releases/#0140-release)的所有功能，還包括 Amazon EMR 新增的功能，例如在執行期自動選取支援的執行引擎 (EKS 6.9.0 上的 Amazon EMR)。

## 建立 Iceberg 叢集
<a name="create-iceberg-cluster"></a>

您可以使用 AWS Management Console、 AWS CLI或 Amazon EMR API，建立已安裝 Iceberg 的叢集。在本教學課程中，您會使用 AWS CLI在 Amazon EMR 叢集上使用 Iceberg。若要使用主控台建立已安裝 Iceberg 的叢集，請遵循[使用 Amazon Athena、Amazon EMR 和 AWS Glue 建置 Iceberg 資料湖](https://aws.amazon.com/blogs/big-data/build-an-apache-iceberg-data-lake-using-amazon-athena-amazon-emr-and-aws-glue/)中的步驟進行。

若要在 Amazon EMR 上使用 IcebergAWS CLI，請先使用下列步驟建立叢集。如需使用 AWS CLI或 Java 開發套件指定 Iceberg 分類的資訊，請參閱 [當您建立叢集 AWS CLI 時，使用 提供組態](emr-configure-apps-create-cluster.md#emr-configure-apps-create-cluster-cli)或 [在建立叢集時使用 Java SDK 提供組態](emr-configure-apps-create-cluster.md#emr-configure-apps-create-cluster-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 文件](https://cwiki.apache.org/confluence/display/HIVE)中的[使用 HCatalog](https://cwiki.apache.org/confluence/display/Hive/HCatalog+UsingHCat#HCatalogUsingHCat-UsingHCatalog)。

## 功能支援
<a name="feature-support"></a>

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](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select)。如需有關 Hive 中 Iceberg 資料表的 select 陳述式的資訊，請參閱 [Apache Iceberg Select](https://iceberg.apache.org/docs/latest/hive/#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 搭配使用的考量
<a name="hive-considerations"></a>
+ Iceberg 支援下列查詢類型：
  + 建立資料表
  + 卸除資料表
  + 插入到資料表
  + 讀取資料表
+ DML (資料處理語言) 操作僅支援 MR (MapReduce) 執行引擎，而 MR 在 Hive 3.1.3 中已棄用。
+ 對於 7.3.0 之前的 Amazon EMR，搭配 Hive 的 Iceberg 目前不支援 AWSGlue Data Catalog。
+ 錯誤處理不夠強大。在組態錯誤的情況下，插入到查詢可能會成功完成。但是，無法更新中繼資料可能會導致資料遺失。
+ Iceberg Glue 整合不適用於 Redshift 受管儲存目錄。