

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

# 使用 AWS Glue Data Catalog 做為 Hive 的中繼存放區
<a name="emr-hive-metastore-glue"></a>

使用 Amazon EMR 5.8.0 版或更新版本，您可以將 Hive 設定為使用 AWS Glue Data Catalog 作為其中繼存放區。若您需要持久的中繼存放區或由不同叢集、服務、應用程式或 AWS 帳戶分享的中繼存放區，我們建議使用此組態。

AWS Glue 是一種全受管擷取、轉換和載入 (ETL) 服務，可讓您以簡單且經濟實惠的方式分類資料、清理資料、擴充資料，並在各種資料存放區之間可靠地移動資料。 AWS Glue Data Catalog 提供跨各種資料來源和資料格式的統一中繼資料儲存庫，與 Amazon EMR 以及 Amazon RDS、Amazon Redshift、Redshift Spectrum、Athena 以及與 Apache Hive 中繼存放區相容的任何應用程式整合。 AWS Glue 爬蟲程式可以從 Amazon S3 中的來源資料自動推斷結構描述，並將相關聯的中繼資料存放在 Data Catalog 中。如需 Data Catalog 的詳細資訊，請參閱《[Glue AWS 開發人員指南》中的填入 Glue Data Catalog](https://docs.aws.amazon.com/glue/latest/dg/populate-data-catalog.html)。 *AWS *

Glue AWS 會另外收費。資料目錄中儲存和存取中繼資料的每月費率、Glue ETL AWS 任務和爬蟲程式執行期每分鐘計費的每小時費率，以及每個佈建開發端點每分鐘計費的每小時費率。Data Catalog 可讓您免費儲存多達一百萬個物件。如果您存放超過一百萬個物件，之後每 100,000 個物件會向您收費 1 美元。Data Catalog 中的物件是資料表、分割區或資料庫。如需詳細資訊，請參閱 [Glue 定價](https://aws.amazon.com/glue/pricing)。

**重要**  
如果您在 2017 年 8 月 14 日之前使用 Amazon Athena 或 Amazon Redshift Spectrum 建立資料表，資料庫和資料表會存放在 Athena 受管目錄中，這與 AWS Glue Data Catalog 不同。若要整合 Amazon EMR 與這些資料表，您必須升級至 AWS Glue Data Catalog。如需詳細資訊，請參閱《*Amazon Athena 使用者指南*》中的[升級至 AWS Glue Data Catalog](https://docs.aws.amazon.com/athena/latest/ug/glue-upgrade.html)。

## 將 AWS Glue Data Catalog 指定為中繼存放區
<a name="emr-hive-glue-configure"></a>

您可以使用 AWS AWS 管理主控台 AWS CLI或 Amazon EMR API，將 Glue Data Catalog 指定為中繼存放區。當使用 CLI 或 API 時，您要使用 Hive 的組態分類來指定 Data Catalog。此外，使用 Amazon EMR 5.16.0 和更新版本，您可以使用組態分類，在不同的 中指定資料目錄 AWS 帳戶。在使用主控台時，您可以透過**進階選項**或**快速選項**指定 Data Catalog。

------
#### [ Console ]

**使用主控台將 AWS Glue Data Catalog 指定為 Hive 中繼存放區**

1. 登入 AWS 管理主控台，並在 https：//[https://console.aws.amazon.com/emr](https://console.aws.amazon.com/emr) 開啟 Amazon EMR 主控台。

1. 在左側導覽窗格中的 **EC2 上的 EMR** 下方，選擇**叢集**，然後選擇**建立叢集**。

1. 在**應用程式套件**下方，選擇**核心 Hadoop**、**HBase** 或 **自訂**。如果您自訂叢集，確保選取 Hive 或 HCatalog 作為您的其中一個應用程式。

1. 在 **AWS Glue Data Catalog 設定**下方，選取**用於 Hive 資料表中繼資料**核取方塊。

1. 選擇適用於您的叢集的任何其他選項。

1. 若要啟動您的叢集，請選擇**建立叢集**。

------
#### [ CLI ]

**使用 將 AWS Glue Data Catalog 指定為 Hive 中繼存放區 AWS CLI**

如需使用 AWS CLI 和 EMR API 指定組態分類的詳細資訊，請參閱 [設定應用程式](emr-configure-apps.md)。
+ 使用以下範例中顯示的 `hive-site` 組態分類為 `hive.metastore.client.factory.class` 指定值：

  ```
  [
    {
      "Classification": "hive-site",
      "Properties": {
        "hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory"
      }
    }
  ]
  ```

  在 EMR 發行版本 5.28.0、5.28.1、5.29.0 或 6.x 上，如果您使用 AWS Glue Data Catalog 作為中繼存放區建立叢集，請將 `hive.metastore.schema.verification` 設定為 `false`。這樣可以防止 Hive 和 HCatalog 針對 MySQL 驗證中繼存放區結構描述。如果沒有此組態，則在 Hive 或 HCatalog 上重新設定後，主要執行個體群組將變成暫停狀態。

  ```
  [
    {
      "Classification": "hive-site",
      "Properties": {
        "hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory",
        "hive.metastore.schema.verification": "false"
      }
    }
  ]
  ```

  如果在 EMR 發行版本 5.28.0、5.28.1 或 5.29.0 上已有叢集，可以利用以下資訊，將主要執行個體群組 `hive.metastore.schema.verification` 設為 `false`：

  ```
     
      Classification = hive-site
      Property       = hive.metastore.schema.verification
      Value          = false
  ```

  若要在不同的 AWS 帳戶中指定 Data Catalog，請新增 `hive.metastore.glue.catalogid` 屬性，如下列範例所示。使用 Data Catalog 的 AWS 帳戶取代 `acct-id`。

  ```
  [
    {
      "Classification": "hive-site",
      "Properties": {
        "hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory",
        "hive.metastore.schema.verification": "false",
        "hive.metastore.glue.catalogid": "acct-id"
      }
    }
  ]
  ```

------

## IAM 許可
<a name="emr-hive-glue-permissions"></a>

叢集的 EC2 執行個體描述檔必須具有 Glue 動作的 IAM AWS 許可。此外，如果您啟用 AWS Glue Data Catalog 物件的加密，也必須允許該角色加密、解密和產生 AWS KMS key 用於加密的 。

### Glue AWS 動作的許可
<a name="emr-hive-glue-permissions-actions"></a>

如果您將預設的 EC2 執行個體設定檔用於 Amazon EMR，就不需要採取任何動作。連接到 的 `AmazonElasticMapReduceforEC2Role`受管政策`EMR_EC2_DefaultRole`允許所有必要的 AWS Glue 動作。不過，如果您指定自訂 EC2 執行個體描述檔和許可，則必須設定適當的 AWS Glue 動作。使用 `AmazonElasticMapReduceforEC2Role` 受管政策做為起點。如需詳細資訊，請參閱《Amazon EMR 管理指南》**中的[叢集 EC2 執行個體的服務角色 (EC2 執行個體設定檔)](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-iam-role-for-ec2.html)。

### 加密和解密 Glue Data Catalog AWS 的許可
<a name="emr-hive-glue-permissions-encrypt"></a>

您的執行個體設定檔需要許可，以便使用您的金鑰來加密和解密資料。如若下列兩個陳述式均適用，則您*不*需要設定這些許可：
+ 您可以使用 Glue AWS 的受管金鑰啟用 AWS Glue Data Catalog 物件的加密。
+ 您可以使用 AWS 帳戶 與 Glue Data Catalog AWS 位於相同 中的叢集。

否則，您必須新增以下陳述式至附接至您的 EC2 執行個體設定檔的許可政策。

如需 AWS Glue Data Catalog 加密的詳細資訊，請參閱《*AWS Glue 開發人員指南*》中的[加密您的資料目錄](https://docs.aws.amazon.com/glue/latest/dg/encrypt-glue-data-catalog.html)。

### 資源型許可
<a name="emr-hive-glue-permissions-resource"></a>

如果您在 AWS Amazon EMR 中使用 Glue 搭配 Hive、Spark 或 Presto， AWS Glue 支援以資源為基礎的政策來控制對 Data Catalog 資源的存取。這些資源包含資料庫、資料表、連線和使用者定義的函數。如需詳細資訊，請參閱《AWS Glue 開發人員指南》**中的 [AWS Glue 資源政策](https://docs.aws.amazon.com/glue/latest/dg/glue-resource-policies.html)。

使用資源型政策限制從 Amazon EMR 內存取 AWS Glue 時，您在許可政策中指定的委託人必須是與建立叢集時指定的 EC2 執行個體描述檔相關聯的角色 ARN。例如，對於附接至型錄的資源型政策，您可以使用下列範例所示的格式，將叢集 EC2 執行個體的預設服務角色的角色 ARN (*EMR\$1EC2\$1DefaultRole*) 指定為 `Principal`：

```
arn:aws:iam::acct-id:role/EMR_EC2_DefaultRole
```

*acct-id* 可以與 Glue AWS 帳戶 ID 不同。這可讓您從不同帳戶中的 EMR 叢集進行存取。您可以指定多個主體，每個主體都來自不同的帳戶。

## 使用 Glue Data Catalog AWS 時的考量事項
<a name="emr-hive-glue-considerations-hive"></a>

使用 AWS Glue Data Catalog 做為 Hive 中繼存放區時，請考慮下列項目：
+ 使用 Hive shell 新增輔助 JAR 並未受到支援。為了解決此問題，請使用 `hive-site` 組態分類來設定 `hive.aux.jars.path` 屬性，其會將輔助 JAR 新增到 Hive classpath。
+ 不支援 [Hive 交易](https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions)。
+ 不支援從 Glue AWS 中重新命名資料表。
+ 當您建立 Hive 資料表而未指定 `LOCATION` 時，資料表資料將儲存在 `hive.metastore.warehouse.dir` 屬性指定的位置。依預設，該位置在 HDFS 中。如果另一個叢集需要存取該資料表，除非它對建立資料表的叢集具有足夠的許可，否則存取將會失敗。此外，由於 HDFS 儲存是暫時性的，若叢集終止，資料表資料將會丟失，還必須重新建立資料表。當您使用 Glue 建立 Hive 資料表時，建議您在 Amazon S3 AWS `LOCATION`中指定 。或者，您可以使用 `hive-site` 組態分類在 Amazon S3 中指定 `hive.metastore.warehouse.dir` 的位置，該位置將套用到全部 Hive 資料表。如果在 HDFS 位置建立資料表，且建立資料表的叢集仍在執行中，您可以從 Glue 內將資料表位置更新為 AWS Amazon S3。如需詳細資訊，請參閱《[Glue AWS 開發人員指南》中的在 Glue 主控台上使用資料表](https://docs.aws.amazon.com/glue/latest/dg/console-tables.html)。 *AWS *
+ 不支援包含引號和撇號的分割區值，例如，`PARTITION (owner="Doe's").`
+ emr-5.31.0 及更高版本不支援[資料欄統計資料](https://cwiki.apache.org/confluence/display/Hive/StatsDev#StatsDev-ColumnStatistics)。
+ 不支援使用 [Hive 授權](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Authorization)。或者，您可以考慮使用 [AWS Glue 資源型政策](https://docs.aws.amazon.com/glue/latest/dg/glue-resource-policies.html)。如需詳細資訊，請參閱[使用資源型政策來存取 AWS Glue Data Catalog](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-iam-roles-glue.html)。
+ 不支援 [Hive 限制條件](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-Constraints)。
+ 不支援 [Hive 中的成本型優化](https://cwiki.apache.org/confluence/display/Hive/Cost-based+optimization+in+Hive)。
+ 不支援設定 `hive.metastore.partition.inherit.table.properties`。
+ 不支援使用下列中繼存放區常數：`BUCKET_COUNT, BUCKET_FIELD_NAME, DDL_TIME, FIELD_TO_DIMENSION, FILE_INPUT_FORMAT, FILE_OUTPUT_FORMAT, HIVE_FILTER_FIELD_LAST_ACCESS, HIVE_FILTER_FIELD_OWNER, HIVE_FILTER_FIELD_PARAMS, IS_ARCHIVED, META_TABLE_COLUMNS, META_TABLE_COLUMN_TYPES, META_TABLE_DB, META_TABLE_LOCATION, META_TABLE_NAME, META_TABLE_PARTITION_COLUMNS, META_TABLE_SERDE, META_TABLE_STORAGE, ORIGINAL_LOCATION`。
+ 當您使用述詞表達式時，明確值必須在比較運算子的右側，否則查詢可能失敗。
  + **正確**：`SELECT * FROM mytable WHERE time > 11`
  + **不正確**：`SELECT * FROM mytable WHERE 11 > time`
+ Amazon EMR 版本 5.32.0 和 6.3.0 及更高版本支援在述詞表達式中使用使用者定義的函數 (UDF)。使用早期版本時，由於 Hive 嘗試優化查詢執行的方式，您的查詢可能會失敗。
+ 不支援[暫時資料表](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-TemporaryTables)。
+ 我們建議您透過 Amazon EMR 使用應用程式建立資料表，而不是直接使用 Glue AWS 建立資料表。透過 Glue AWS 建立資料表可能會導致必要欄位遺失，並導致查詢例外狀況。
+ 在 EMR 5.20.0 或更新版本中，當 Glue Data Catalog AWS 用作中繼存放區時，Spark 和 Hive 會自動啟用平行分割區剔除。這項變更會平行執行多個請求來擷取分割區，從而大幅縮短查詢規劃時間。可同時執行的區段總數範圍介於 1 到 10 之間。預設值為 5，此為建議設定。您可以在 `hive-site` 組態分類中指定屬性 `aws.glue.partition.num.segments` 加以變更。如果發生限流，您可以透過將值變更為 1 以關閉該功能。如需詳細資訊，請參閱 [AWS Glue 區段結構](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-partitions.html#aws-glue-api-catalog-partitions-Segment)。