

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 将 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>

您可以使用 Amazon Web Services 管理控制台、 Amazon CLI 或 Amazon EMR API 创建安装了 Iceberg 的集群。在本教程中，您将使用在 Amazon CLI Amazon EMR 集群上使用 Iceberg。要使用控制台创建安装了 Iceberg 的集群，请按照[使用 Amazon Athena、Amazon EMR 和 Amazon Glue 构建 Iceberg 数据湖](https://www.amazonaws.cn/blogs/big-data/build-an-apache-iceberg-data-lake-using-amazon-athena-amazon-emr-and-aws-glue/)中的步骤操作。

要将 Amazon EMR 上的 Iceberg 与一起 Amazon CLI使用，请先使用以下步骤创建一个集群。有关使用 Amazon CLI 或 Java SDK 指定 Iceberg 分类的信息，请参阅[创建集群 Amazon 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 集群目前不支持 Glue Amazon 数据目录。默认 Iceberg 目录为 `HiveCatalog`，它对应于为 Hive 环境配置的元存储。有关目录管理的更多信息，请参阅 [Apache Hiv](https://cwiki.apache.org/confluence/display/HIVE) e 文档 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 的选择语法的信息，请参阅[LanguageManual 选择](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select)。有关在 Hive 中使用 Iceberg 表的选择语句的信息，请参阅 [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;
    ```

从亚马逊 EMR 7.3.0 开始，Hive with Iceberg 支持 Glue 数据目录 Amazon 作为元存储库。要使用 Amazon Glue 数据目录作为元数据库，请设置以下属性。

```
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（数据操作语言MapReduce）操作仅支持 MR () 执行引擎，Hive 3.1.3 中已弃用 MR。
+ 对于 7.3.0 之前的亚马逊 EMR，带有 Hive 的 Iceberg 目前不支持 Amazon Glue 数据目录。
+ 错误处理不够强大。在配置错误的情况下，插入查询可能会成功完成。但是，无法更新元数据可能会导致数据丢失。
+ Iceberg Glue 集成不适用于 Redshift 托管存储目录。