

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

# 使用 Amazon EMR 4.x 上的 Hive 的注意事项
<a name="emr-Hive-4x"></a>

本节介绍在使用 Amazon EMR 4.x 发行版上的 Hive 版本 1.0.0 时要注意的差异（与 Amazon EMR 5.x 发行版上的 Hive 2.x 相比）。

## 不支持 ACID 事务
<a name="emr-Hive-acid-4x"></a>

使用 Amazon EMR 4.x 发行版时，4.x 发行版上的 Hive 不支持 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 中的表。这些语句基于 Amazon S3 中一个名为 `my_s3_table` 的表在 HDFS 中创建一个名为 `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>

亚马逊 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`，会始终触发合并任务。