

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

# 在 Amazon EMR 4.x 上使用 Hive 的考量
<a name="emr-Hive-4x"></a>

本章節涵蓋與 Amazon EMR 5.x 發行版本上的 Hive 2.x 相較之下，在 Amazon EMR 4.x 發行版本上使用 Hive 1.0.0 版時應考量的差異。

## 不支援 ACID 交易
<a name="emr-Hive-acid-4x"></a>

Amazon EMR 4.x 發行版本上的 Hive 不支援使用 4.x 發行版本時，將 Hive 資料儲存在 Amazon S3 中的 ACID 交易。如果您嘗試在 Amazon S3 中建立交易型資料表，則會發生例外狀況。

## 讀取和寫入 Amazon S3 中的資料表
<a name="emr-Hive-s3table-4x"></a>

Amazon EMR 4.x 發行版本上的 Hive 可直接寫入 Amazon S3，無需使用暫時檔案。這樣做可提高效能，但後果是，您無法在相同的 Hive 陳述式內讀取和寫入 Amazon S3 中的相同資料表。解決方法是在 HDFS 中建立並使用暫時資料表。

以下範例說明如何使用多個 Hive 陳述式更新 Amazon S3 中的資料表。陳述式會在 HDFS 中根據 Amazon S3 中名為 `my_s3_table` 的資料表建立名為 `tmp` 的暫時資料表。接著 Amazon S3 中的資料表會以暫時資料表的內容更新。

```
CREATE TEMPORARY TABLE tmp LIKE my_s3_table;
INSERT OVERWRITE TABLE tmp SELECT ....;
INSERT OVERWRITE TABLE my_s3_table SELECT * FROM tmp;
```

## Log4j 與 Log4j 2
<a name="emr-Hive-log4j-4x"></a>

Amazon EMR 4.x 發行版本上的 Hive 使用 Log4j。從 5.0.0 版開始，Log4j 2 為預設值。這些版本可能需要不同的記錄組態。請參閱 [Apache Log4j 2](http://logging.apache.org/log4j/2.x/) 了解詳細資訊。

## MapReduce 是預設執行引擎
<a name="emr-Hive-tez-4x"></a>

Amazon EMR 4.x 發行版本上的 Hive 使用 MapReduce 作為預設執行引擎。從 Amazon EMR 5.0.0 版開始，Tez 是預設值，它可改善大多數工作流程的效能。

## Hive 授權
<a name="emr-Hive-authz-4x"></a>

Amazon EMR 4.x 上的 Hive 支援 HDFS 的 [Hive 授權](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Authorization)，但不支援 EMRFS 和 Amazon S3。Amazon EMR 叢集會在預設停用授權的情況下執行。

## Amazon S3 的 Hive 檔案合併行為
<a name="emr-Hive-filemerge-4x"></a>

如果 `hive.merge.mapfiles` 為 `true`，則 Amazon EMR 4.x 發行版本上的 Hive 會在僅限映射作業結束時合併小檔案。只有在任務的平均輸出大小低於 `hive.merge.smallfiles.avgsize` 設定時，才會觸發合併。如果最終輸出路徑是在 HDFS 中，Amazon EMR Hive 也會有完全相同的行為。不過，如果輸出路徑是在 Amazon S3 中，則會忽略 `hive.merge.smallfiles.avgsize` 參數。在此情況下，如果 `hive.merge.mapfiles` 設為 `true`，則合併任務一律會觸發。