

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

# 設定 Hive 的外部中繼存放區
<a name="emr-metastore-external-hive"></a>

在預設情況下，Hive 會記錄在主節點的檔案系統上 MySQL 資料庫中的中繼存放區資訊。中繼存放區包含描述資料表和在其中建立它的基礎資料，包括分割區名稱和資料類型等等。叢集終止時，所有叢集節點會關閉 (包括主節點)。當發生這種情況時，本機資料會遺失，因為節點檔案系統使用的是暫時性儲存。如果您需要中繼存放區持續保留，您必須建立在叢集以外存在的*外部中繼存放區*。

適用於外部中繼存放區有兩個選項：
+ AWS Glue Data Catalog （僅限 Amazon EMR 5.8.0 版或更新版本）。

  如需詳細資訊，請參閱[使用 AWS Glue Data Catalog 做為 Hive 的中繼存放區](emr-hive-metastore-glue.md)。
+ Amazon RDS 或 Amazon Aurora。

  如需詳細資訊，請參閱[使用外部 MySQL 資料庫或 Amazon Aurora](emr-hive-metastore-external.md)。

**注意**  
如果您使用 Hive 3 並遇到太多 Hive 中繼存放區連線，請調低參數 `datanucleus.connectionPool.maxPoolSize` 的值或調高資料庫伺服器可處理的連線數量。增加連線數量是由 Hive 計算 JDBC 連線最大數量的方式所致。若要計算效能的最佳值，請參閱 [Hive 組態屬性](https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties#ConfigurationProperties-datanucleus.connectionPool.maxPoolSize.1)。

# 使用 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)。

# 使用外部 MySQL 資料庫或 Amazon Aurora
<a name="emr-hive-metastore-external"></a>

若要使用外部 MySQL 資料庫或 Amazon Aurora 作為 Hive 中繼存放區，請於 Hive 為中繼存放區覆寫預設組態值，以在 Amazon RDS MySQL 執行個體或 Amazon Aurora PostgreSQL 執行個體上指定外部資料庫位置。

**注意**  
Hive 不支援也無法避免對中繼存放區資料表的同時寫入存取權。如果您在兩個叢集間共用中繼存放區資訊，您必須確保不會同時寫入同一個表格中繼存放區，除非您寫入的是相同中繼存放區資料表中的不同分割區。

下列程序說明如何為 Hive 中繼存放區位置覆寫預設組態值，並使用重新設定的中繼存放區位置來啟動叢集。

**若要建立位於 EMR 叢集之外的中繼存放區**

1. 建立 MySQL 或 Aurora PostgreSQL 資料庫。如果您使用 PostgreSQL，則必須在佈建叢集之後進行設定。建立叢集時僅支援 MySQL。如需有關 Aurora MySQL 和 Aurora PostgreSQL 之間差異的資訊，請參閱 [Amazon Aurora MySQL 概觀](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraMySQL.Overview.html)和[使用 Amazon Aurora PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html)。如需有關如何建立 Amazon RDS 資料庫的一般資訊，請參閱 [https://aws.amazon.com/rds/](https://aws.amazon.com/rds/)。

1. 修改您的安全群組以允許資料庫與 **ElasticMapReduce-Master (ElasticMapReduce-Master)** 安全群組之間的 JDBC 連線。如需有關如何修改存取安全群組的資訊，請參閱[使用 Amazon EMR 受管安全群組](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-man-sec-groups.html)。

1. 在 `hive-site.xml` 中設定 JDBC 設定值：
**重要**  
如果您是將敏感資訊 (例如，密碼) 提供到 Amazon EMR 組態 API，將會對許可不足的那些帳戶顯示此資訊。如果您擔心這個資訊可能向其他使用者顯示，透過建立可明確拒絕對 `elasticmapreduce:DescribeCluster` API 金鑰之許可的使用者，使用管理帳戶建立叢集並限制其他使用者 (IAM 使用者或具有委派登入資料的使用者) 存取叢集上的服務。

   1. 建立名為 `hiveConfiguration.json` 的組態檔案，內含對 `hive-site.xml` 的編輯，如下所示。

       使用執行資料庫的 Amazon RDS 執行個體之 DNS 地址取代 *hostname*，並且使用資料庫的登入資料取代 *username* 和 *password*。如需有關連線至 MySQL 和 Aurora 資料庫執行個體的詳細資訊，請參閱《Amazon RDS 使用者指南》**中的[連線至執行 MySQL 資料庫引擎的資料庫執行個體](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ConnectToInstance.html)和[連線至 Athena 資料庫叢集](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Aurora.Connect.html)。`javax.jdo.option.ConnectionURL` 是用於 JDBC 中繼存放區的 JDBC 連線字串。`javax.jdo.option.ConnectionDriverName` 是 JDBC 中繼存放區的驅動程式類別名稱。

      MySQL JDBC 驅動器由 Amazon EMR 安裝。

      值屬性不能包含空格或歸位。它應該顯示在單一列。

      ```
      [
          {
            "Classification": "hive-site",
            "Properties": {
              "javax.jdo.option.ConnectionURL": "jdbc:mysql://hostname:3306/hive?createDatabaseIfNotExist=true",
              "javax.jdo.option.ConnectionDriverName": "org.mariadb.jdbc.Driver",
              "javax.jdo.option.ConnectionUserName": "username",
              "javax.jdo.option.ConnectionPassword": "password"
            }
          }
        ]
      ```

   1. 當您建立叢集時，請參考 `hiveConfiguration.json` 檔案，如下列 AWS CLI 命令所示。在這個命令中，檔案會存放在本機，您也可以將檔案上傳到 Amazon S3 並加以參考 (例如 `s3://DOC-EXAMPLE-BUCKET/hiveConfiguration.json`)。
**注意**  
包含 Linux 行接續字元 (\$1) 是為了提高可讀性。它們可以在 Linux 命令中移除或使用。對於 Windows，請將其移除或取代為插入符號 (^)。

      ```
      aws emr create-cluster --release-label emr-7.12.0 --instance-type m5.xlarge --instance-count 2 \
      --applications Name=Hive --configurations file://hiveConfiguration.json --use-default-roles
      ```

1. 連接至您的叢集主節點。

   有關如何連接到主節點的資訊，請參閱《Amazon EMR 管理指南》**中的[使用 SSH 連接到主節點](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html)。

1. 透過輸入類似如下的命令來建立您的 Hive 資料表，以便在 Amazon S3 上指定位置：

   ```
   CREATE EXTERNAL TABLE IF NOT EXISTS table_name
   (
   key int,
   value int
   )
   LOCATION s3://DOC-EXAMPLE-BUCKET/hdfs/
   ```

1. 將您的 Hive 指令碼新增至執行中叢集。

Hive 叢集會使用位於 Amazon RDS 的中繼存放區來執行。透過指定中繼存放區位置來啟動所有額外的 Hive 叢集，其會共用此中繼存放區。