

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

# 配置 Tez
<a name="tez-configure"></a>

您可以使用 `tez-site` 配置分类设置值来自定义 Tez，该配置分类将配置 `tez-site.xml` 配置文件中的设置。有关更多信息，请参阅 Apache Tez 文档[TezConfiguration](https://tez.apache.org/releases/0.8.2/tez-api-javadocs/configs/TezConfiguration.html)中的。要将 Hive 或 Pig 更改为使用 Tez 执行引擎，请根据需要使用 `hive-site` 和 `pig-properties` 配置分类。示例如下。

## 示例配置
<a name="tez-configure-example"></a>

**Example 示例：自定义 Tez 根日志记录级别，并将 Tez 设置为 Hive 和 Pig 的执行引擎**  
下面显示的 `create-cluster` 命令将创建一个安装了 Tez、Hive 和 Pig 的集群。该命令引用存储在 Amazon S3 中的文件 `myConfig.json`，该文件为将 `tez.am.log.level` 设置为 `DEBUG` 的 `tez-site` 分类指定属性，以及将执行引擎设置为 Tez，以便 Hive 和 Pig 使用 `hive-site` 和 `pig-properties` 配置分类。  
为了便于读取，包含 Linux 行继续符（\\）。它们可以通过 Linux 命令删除或使用。对于 Windows，请将它们删除或替换为脱字号（^）。

```
aws emr create-cluster --release-label {{emr-7.13.0}} \
--applications Name=Tez Name=Hive Name=Pig --ec2-attributes KeyName={{myKey}} \
--instance-type m5.xlarge --instance-count 3 \
--configurations https://s3.amazonaws.com/amzn-s3-demo-bucket/myfolder/myConfig.json --use-default-roles
```
下面显示的是 `myConfig.json` 的内容示例。  

```
[
    {
      "Classification": "tez-site",
      "Properties": {
        "tez.am.log.level": "DEBUG"
      }
    },
    {
      "Classification": "hive-site",
      "Properties": {
        "hive.execution.engine": "tez"
      }
    },
    {
      "Classification": "pig-properties",
      "Properties": {
        "exectype": "tez"
      }
    }
  ]
```

**注意**  
对于 Amazon EMR 5.21.0 及更高版本，您可以覆盖集群配置，并为运行的集群中的每个实例组指定额外的配置分类。您可以使用 Amazon EMR 控制台、 Amazon Command Line Interface (Amazon CLI) 或软件开发工具包来完成此操作。 Amazon 有关更多信息，请参阅[为运行的集群中的实例组提供配置](https://docs.amazonaws.cn/emr/latest/ReleaseGuide/emr-configure-apps-running-cluster.html)。

## Tez 异步拆分打开
<a name="tez-configure-async"></a>

当表路径中有大量小文件并且查询尝试读取所有文件时，与每个单独拆分相对应的每个小文件将合并在一个 Tez *分组拆分*下。然后，单个映射器将处理单个 Tez 分组拆分。由于执行是同步的，因此分组拆分下的每个单独拆分都将逐一得到处理。这就要求 `RecordReader` 对象同步处理各个拆分。

Amazon EMR 6.15.0 引入了配置，您可以指定这些配置来异步打开 Tez 分组拆分中的输入拆分。该功能由 [TEZ-4397](https://issues.apache.org/jira/browse/TEZ-4397) 启动，但在 OSS Hive 中出现了回归。EMR Hive 修复了 Hive ACID 表中的回归和其他漏洞。当单个 Tez 分组拆分中有大量输入拆分时，此改进可以提高读取查询的性能。


| Name | 分类 | 说明 | 
| --- | --- | --- | 
| `tez.grouping.split.init.threads` | `tez-site` | 指定 Tez 用于预启动 `RecordReaders` 和打开拆分的进程守护程序线程数。对于 ACID 表，`tez.grouping.split.init.threads` 支持的最大值为 `1`。 | 
| `tez.grouping.split.init.recordreaders` | `tez-site` | 指定要由进程守护程序线程保持预初始化 `RecordReaders` 的数量。当 Tez 分组拆分包含大量 `InputSplits` 时，这会有所帮助。处理这些输入拆分的 `RecordReaders` 初始化可以用进程守护线程异步完成，而不是顺序处理。 | 

配置备注：


| 主题专家 | Details | 
| --- | --- | 
| 建议的配置设置 | 建议在 `hive-site` 和 `tez-site` 中将上述配置设置设为所需的值。 | 
| 匹配值 | `hive-site` 和 `tez-site` 中的配置设置值应该相同。 | 
| LLAP 建议 | 启用 LLAP 时，不建议使用此功能。 | 

### Tez 异步拆分打开的基准测试
<a name="tez-configure-async-benchmark"></a>

我们已使用以下环境和配置对 Tez 异步拆分打开功能进行了基准测试：
+ **基准环境**：Amazon EMR 集群，有 1 个使用 m5.16xlarge 的主节点，16 个使用 m5.16xlarge 的核心节点。
+ **基准配置**：要模拟单个 Tez 分组拆分中存在大量输入拆分的基准测试场景，`tez.grouping.split-count` 设置为 `1`。
+ **用于基准测试的表**：该表包含 200 个分区，其中每个分区包含一个文件。基准测试在该表包含 CSV 文件时以及该表包含 parquet 文件时进行。Hive 查询基准测试：从表中 `SELECT COUNT(*)` 十次，取平均运行时间。
+ **启用 Tez 异步拆分打开的配置**：如下所示：
  + `tez.grouping.split.init.threads` = `4`
  + `tez.grouping.split.init.recordreaders` = `10`


| 数据集 | 功能已禁用（基线） | 功能已启用 | 改进 | 
| --- | --- | --- | --- | 
| CSV 数据集 | 90.26 秒 | 79.20 秒 | 12.25% | 
| Parquet 数据集 | 54.67 秒 | 42.23 秒 | 22.75% | 