

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

# 运行 EMR Serverless 作业时使用 Hive 配置
<a name="jobs-hive"></a>

您可以在 `type` 参数设置为 `HIVE` 的情况下在应用程序上运行 Hive 作业。作业必须与适用于 Amazon EMR 发行版的 Hive 版本兼容。例如，当您在 Amazon EMR 发行版 6.6.0 的应用程序上运行作业时，作业必须与 Apache Hive 3.1.2 兼容。有关每个发行版的应用程序版本信息，请参阅 [Amazon EMR Serverless 发行版](release-versions.md)。

## Hive 作业参数
<a name="hive-params"></a>

使用 [`StartJobRun` API](https://docs.aws.amazon.com/emr-serverless/latest/APIReference/API_StartJobRun.html) 运行 Hive 作业时，请指定以下参数。

**Topics**
+ [Hive 作业运行时角色](#hive-defaults-executionRoleArn)
+ [Hive 作业驱动程序参数](#hive-defaults-jobDriver)
+ [Hive 配置覆盖参数](#hive-defaults-configurationOverrides)

### Hive 作业运行时角色
<a name="hive-defaults-executionRoleArn"></a>

使用 **`executionRoleArn`** 指定应用程序用来执行 Hive 作业的 IAM 角色 ARN。此角色必须具有以下权限：
+ 从数据驻留的 S3 存储桶或其他数据来源读取数据
+ 从 Hive 查询文件和 init 查询文件驻留的 S3 存储桶或前缀读取数据
+ 读取和写入 Hive Scratch 目录和 Hive Metastore 仓库目录驻留的 S3 存储桶
+ 写入要写入最终输出的 S3 存储桶
+ 将日志写入 `S3MonitoringConfiguration` 指定的 S3 存储桶或前缀
+ 访问 KMS 密钥（如果使用 KMS 密钥加密 S3 存储桶中的数据）
+ 访问 AWS Glue 数据目录

如果 Hive 作业从/向其他数据来源读取/写入数据，请在此 IAM 角色中指定相应的权限。如果不向 IAM 角色提供这些权限，作业可能会失败。有关更多信息，请参阅[Amazon EMR Serverless 的作业运行时角色](security-iam-runtime-role.md)。

### Hive 作业驱动程序参数
<a name="hive-defaults-jobDriver"></a>

使用 **`jobDriver`** 为作业提供输入。对于要运行的作业类型，作业驱动程序参数只接受一个值。当您指定 `hive` 为作业类型时，EMR Serverless 会将 Hive 查询传递给 `jobDriver` 参数。Hive 作业具有以下参数：
+ **`query`**：这是 Amazon S3 中对要运行的 Hive 查询文件的引用。
+ **`parameters`**：这些是要覆盖的其他 Hive 配置属性。要覆盖属性，请将其作为 `--hiveconf property=value` 传递给此参数。要覆盖变量，请将其作为 `--hivevar key=value` 传递给此参数。
+ **`initQueryFile`**：这是初始化 Hive 查询文件。Hive 会在查询之前运行该文件，并用其初始化表。

### Hive 配置覆盖参数
<a name="hive-defaults-configurationOverrides"></a>

使用 **`configurationOverrides`** 覆盖监控级别和应用程序级别配置属性。该参数接受包含以下两个字段的 JSON 对象：
+ **`monitoringConfiguration`**：使用该字段指定希望 EMR Serverless 作业存储 Hive 作业日志的 Amazon S3 URL（`s3MonitoringConfiguration`）。请务必使用托管应用程序的存储桶以及运行任务的相同 AWS 区域 位置创建此存储桶。 AWS 账户 
+ **`applicationConfiguration`**：您可以在此字段中提供一个配置对象，来覆盖应用程序的默认配置。您可以使用简写语法提供配置，或可引用 JSON 文件中的配置对象。配置对象包含分类、属性和可选的嵌套配置。属性由您希望在该文件中覆盖的设置组成。您可以在一个 JSON 对象中为多个应用程序指定多个分类。
**注意**  
可用的配置分类因特定的 EMR Serverless 发行版而异。例如，自定义 Log4j `spark-driver-log4j2` 和 `spark-executor-log4j2` 的分类仅适用于 6.8.0 及更高版本。

如果在应用程序覆盖和 Hive 参数中传递相同的配置，则 Hive 参数优先。以下列表按优先级从高到低对配置进行排序。
+ 作为 `--hiveconf property=value` 中 Hive 参数的一部分提供的配置。
+ 启动作业时，作为应用程序覆盖的一部分提供的配置。
+ 创建应用程序时，作为 `runtimeConfiguration` 的一部分提供的配置。
+ Amazon EMR 为发行版分配的优化配置。
+ 应用程序的默认开源配置。

有关在应用程序级别声明配置以及在作业运行期间覆盖配置的更多信息，请参阅 [EMR Serverless 的默认应用程序配置](default-configs.md)。

## Hive 作业属性
<a name="hive-defaults"></a>

下表列出了在提交 Hive 作业时配置的必需属性。


**必需 Hive 作业属性**  

| 设置 | 说明 | 
| --- | --- | 
| hive.exec.scratchdir | EMR Serverless 在 Hive 作业执行期间创建临时文件的 Amazon S3 位置。 | 
| hive.metastore.warehouse.dir | Hive 中托管表数据库的 Amazon S3 位置。 | 

下表列出了提交 Hive 作业时可以覆盖的可选 Hive 属性及其默认值。


**可选 Hive 属性和默认值**  

| 设置 | 说明 | 默认 值 | 
| --- | --- | --- | 
| fs.s3.customAWSCredentialsProvider | 您要使用的 AWS 凭证提供商。 | com.amazonaws.auth.de AWSCredentials ProviderChain | 
| fs.s3a.aws.credentials.provider | 您要用于 S3A 文件系统的 AWS 凭证提供程序。 | com.amazonaws.auth.de AWSCredentials ProviderChain | 
| hive.auto.convert.join | 根据输入文件大小，将普通连接自动转换为 mapjoin 的选项。 | TRUE | 
| hive.auto.convert.join.noconditionaltask | 当 Hive 根据输入文件大小将普通连接转换为 mapjoin 时，开启优化的选项。 | TRUE | 
| hive.auto.convert.join.noconditionaltask.size | 低于此大小时，连接会直接转换为 mapjoin。 | 最优值是基于 Tez 任务内存计算的 | 
| hive.cbo.enable | 使用 Calcite 框架开启成本优化的选项。 | TRUE | 
| hive.cli.tez.session.async | 在 Hive 查询编译时启动后台 Tez 会话的选项。设置为 false 时，Tez AM 将在 Hive 查询编译后启动。 | TRUE | 
| hive.compute.query.using.stats | 激活 Hive 以使用元存储中存储的统计数据回答某些查询的选项。对于基本统计数据，将 hive.stats.autogather 设置为 TRUE。要获取更高级的查询集合，请运行 analyze table queries。 | TRUE | 
| hive.default.fileformat | CREATE TABLE 语句的默认文件格式。如果您在 CREATE TABLE 命令中指定 STORED AS [FORMAT]，则可以显式覆盖此设置。 | TEXTFILE | 
| hive.driver.cores | Hive 驱动程序进程使用的核心数。 | 2 | 
| hive.driver.disk | Hive 驱动程序的磁盘大小。 | 20G | 
| hive.driver.disk.type | Hive 驱动程序的磁盘类型。 | 标准 | 
| hive.tez.disk.type | Tez 工作线程的磁盘大小。 | 标准 | 
| hive.driver.memory | 每个 Hive 驱动程序进程使用的内存量。Hive CLI 和 Tez Application Master 均摊此内存，并保留 20% 的余量。 | 6G | 
| hive.emr-serverless.launch.env.[KEY] | 在 Hive 特定进程（如 Hive 驱动程序、Tez AM 和 Tez 任务）中设置 KEY 环境变量的选项。 |  | 
| hive.exec.dynamic.partition | 在 DML/DDL 中开启动态分区的选项。 | TRUE | 
| hive.exec.dynamic.partition.mode | 指定是要使用严格模式还是非严格模式的选项。在严格模式下，至少指定一个静态分区，以免意外覆盖所有分区。在非严格模式下，允许所有分区都是动态的。 | strict | 
| hive.exec.max.dynamic.partitions | Hive 创建的最大动态分区数。 | 1000 | 
| hive.exec.max.dynamic.partitions.pernode | Hive 在每个 mapper 和 reducer 节点中创建的最大动态分区数。 | 100 | 
| hive.exec.orc.split.strategy | 预计为下列值之一：BI、ETL 或 HYBRID。这不是用户级配置。BI 指定您希望在拆分生成上花费的时间比在查询执行上花费的时间更少。ETL 指定您希望在拆分生成上花费更多时间。HYBRID 指定根据启发式方法从上述策略中选择。 | HYBRID | 
| hive.exec.reducers.bytes.per.reducer | 每个 reducer 的大小。默认值为 256MB。如果输入大小为 1G，作业将使用 4 个 reducer。 | 256000000 | 
| hive.exec.reducers.max | 最大 reducer 数。 | 256 | 
| hive.exec.stagingdir | 存储临时文件的目录的名称，Hive 在表位置和 hive.exec.scratchdir 属性中指定的暂存目录位置中创建这些临时文件。 | .hive-staging | 
| hive.fetch.task.conversion | 预计为下列值之一：NONE、MINIMAL 或 MORE。Hive 可以将选定查询转换为单个 FETCH 任务。这样可以最大限度地减少延迟。 | MORE | 
| hive.groupby.position.alias | 使 Hive 在 GROUP BY 语句中使用列位置别名的选项。 | FALSE | 
| hive.input.format | 默认输入格式。如果在使用 CombineHiveInputFormat 时遇到问题，请设置为 HiveInputFormat。 | org.apache.hadoop.hive.ql.io.CombineHiveInputFormat | 
| hive.log.explain.output | 为 Hive 日志中的任何查询开启扩展输出解释的选项。 | FALSE | 
| hive.log.level | Hive 日志记录级别。 | INFO | 
| hive.mapred.reduce.tasks.speculative.execution | 为 reducer 开启推测性启动的选项。仅 Amazon EMR 6.10.x 及更低版本支持。 | TRUE | 
| hive.max-task-containers | 最大并发容器数。将配置的 mapper 内存乘以该值，确定拆分计算和任务抢占使用的可用内存。 | 1000 | 
| hive.merge.mapfiles | 使小文件在仅映射作业结束时合并的选项。 | TRUE | 
| hive.merge.size.per.task | 作业结束时合并文件的大小。 | 256000000 | 
| hive.merge.tezfiles | 在 Tez DAG 结束时开启小文件合并的选项。 | FALSE | 
| hive.metastore.client.factory.class | 生成对象以实现 IMetaStoreClient 接口的工厂类名称。 | com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory | 
| hive.metastore.glue.catalogid | 如果 AWS Glue Data Catalog 充当元存储但运行在与作业 AWS 账户 不同的位置，则为作业运行 AWS 账户 位置的 ID。 | NULL | 
| hive.metastore.uris | 元存储客户端用于连接到远程元存储的 thrift URI。 | NULL | 
| hive.optimize.ppd | 开启谓词下推的选项。 | TRUE | 
| hive.optimize.ppd.storage | 开启对存储处理程序谓词下推的选项。 | TRUE | 
| hive.orderby.position.alias | 使 Hive 在 ORDER BY 语句中使用列位置别名的选项。 | TRUE | 
| hive.prewarm.enabled | 为 Tez 开启容器预热的选项。 | FALSE | 
| hive.prewarm.numcontainers | 为 Tez 预热的容器数量。 | 10 | 
| hive.stats.autogather | 使 Hive 在 INSERT OVERWRITE 命令执行期间自动收集基本统计数据的选项。 | TRUE | 
| hive.stats.fetch.column.stats | 关闭从元数据仓获取列统计数据的选项。当列数很大时，获取列统计数据的开销会很大。 | FALSE | 
| hive.stats.gather.num.threads | partialscan 和 noscan analyze 命令用于分区表的线程数。这仅适用于实现 StatsProvidingRecordReader 的文件格式（如 ORC）。 | 10 | 
| hive.strict.checks.cartesian.product | 开启严格笛卡尔连接检查的选项。这些检查不允许使用笛卡尔乘积（交叉连接）。 | FALSE | 
| hive.strict.checks.type.safety | 开启严格类型安全检查，并关闭 bigint 与 string 和 double 比较的选项。 | TRUE | 
| hive.support.quoted.identifiers | 预期值为 NONE 或 COLUMN。NONE 意味着标识符中只有字母数字和下划线字符有效。COLUMN 意味着列名可以包含任何字符。 | COLUMN | 
| hive.tez.auto.reducer.parallelism | 开启 Tez auto-reducer 并行度功能的选项。Hive 仍会估计数据大小并设置并行度估计。Tez 会对源顶点的输出大小进行采样，并在运行时根据需要调整估计值。 | TRUE | 
| hive.tez.container.size | 每个 Tez 任务进程使用的内存量。 | 6144 | 
| hive.tez.cpu.vcores | 每个 Tez 任务使用的核心数。 | 2 | 
| hive.tez.disk.size | 每个任务容器的磁盘大小。 | 20G | 
| hive.tez.input.format | Tez AM 中拆分生成的输入格式。 | org.apache.hadoop.hive.ql.io.HiveInputFormat | 
| hive.tez.min.partition.factor | Tez 在开启 auto-reducer 并行度时指定的 reducer 下限。 | 0.25 | 
| hive.vectorized.execution.enabled | 开启查询执行的向量化模式的选项。 | TRUE | 
| hive.vectorized.execution.reduce.enabled | 开启查询执行 reduce-side 的向量化模式的选项。 | TRUE | 
| javax.jdo.option.ConnectionDriverName | JDBC 元存储的驱动程序类名称。 | org.apache.derby.jdbc.EmbeddedDriver | 
| javax.jdo.option.ConnectionPassword | 与元存储数据库关联的密码。 | NULL | 
| javax.jdo.option.ConnectionURL | JDBC 元存储的 JDBC 连接字符串。 | jdbc:derby:;databaseName=metastore\$1db;create=true | 
| javax.jdo.option.ConnectionUserName | 与元存储数据库关联的用户名。 | NULL | 
| mapreduce.input.fileinputformat.split.maxsize | 当输入格式为 org.apache.hadoop.hive.ql.io.CombineHiveInputFormat 时，拆分计算时拆分的最大大小。值为 0 表示没有限制。 | 0 | 
| tez.am.dag.cleanup.on.completion | 在 DAG 完成时开启随机排序数据清理的选项。 | TRUE | 
| tez.am.emr-serverless.launch.env.[KEY] | 在 Tez AM 进程中设置 KEY 环境变量的选项。对于 Tez AM，此值将覆盖 hive.emr-serverless.launch.env.[KEY] 值。 |  | 
| tez.am.log.level | EMR Serverless 传递给 Tez 应用程序主进程的根日志记录级别。 | INFO | 
| tez.am.sleep.time.before.exit.millis | EMR Serverless 应在 AM 关闭请求发出后的这段时间后推送 ATS 事件。 | 0 | 
| tez.am.speculation.enabled | 使较慢任务推测性启动的选项。当某些任务因机器故障或速度缓慢而运行较慢时，这有助于减少作业延迟。仅 Amazon EMR 6.10.x 及更低版本支持。 | FALSE | 
| tez.am.task.max.failed.attempts | 在任务失败之前，特定任务可以失败的最大尝试次数。此数字不计入手动终止的尝试次数。 | 3 | 
| tez.am.vertex.cleanup.height | 如果所有从属顶点都已完成，Tez AM 将删除顶点随机排序数据的距离。值为 0 时，此功能关闭。Amazon EMR 6.8.0 及更高版本支持此功能。 | 0 | 
| tez.client.asynchronous-stop | 使 EMR Serverless 在结束 Hive 驱动程序之前推送 ATS 事件的选项。 | FALSE | 
| tez.grouping.max-size | 分组拆分的大小上限（字节）。此限制可防止过大的拆分。 | 1073741824 | 
| tez.grouping.min-size | 分组拆分的大小下限（字节）。此限制可防止过小的拆分。 | 16777216 | 
| tez.runtime.io.sort.mb | Tez 对输出排序时软缓冲区的大小。 | 最优值是基于 Tez 任务内存计算的 | 
| tez.runtime.unordered.output.buffer.size-mb | Tez 不直接写入磁盘时使用的缓冲区大小。 | 最优值是基于 Tez 任务内存计算的 | 
| tez.shuffle-vertex-manager.max-src-fraction | 在 EMR Serverless 为当前顶点安排所有任务之前必须完成的源任务的比例（在 ScatterGather 连接的情况下）。当前顶点上准备安排的任务数量在 min-fraction 和 max-fraction 之间线性缩放。这将为默认值或 tez.shuffle-vertex-manager.min-src-fraction，以较大者为准。 | 0.75 | 
| tez.shuffle-vertex-manager.min-src-fraction | 在 EMR Serverless 为当前顶点安排任务之前必须完成的源任务的比例（在 ScatterGather 连接的情况下）。 | 0.25 | 
| tez.task.emr-serverless.launch.env.[KEY] | 在 Tez 任务进程中设置 KEY 环境变量的选项。对于 Tez 任务，此值将覆盖 hive.emr-serverless.launch.env.[KEY] 值。 |  | 
| tez.task.log.level | EMR Serverless 传递给 Tez 任务的根日志记录级别。 | INFO | 
| tez.yarn.ats.event.flush.timeout.millis | AM 在关闭之前等待事件刷新的最长时间。 | 300000 | 

## Hive 作业示例
<a name="hive-examples"></a>

下面的代码示例展示了如何使用 `StartJobRun` API 运行 Hive 查询。

```
aws emr-serverless start-job-run \
    --application-id application-id \
    --execution-role-arn job-role-arn \
    --job-driver '{
        "hive": {
            "query": "s3://amzn-s3-demo-bucket/emr-serverless-hive/query/hive-query.ql",
            "parameters": "--hiveconf hive.log.explain.output=false"
        }
    }' \
    --configuration-overrides '{
        "applicationConfiguration": [{
            "classification": "hive-site",
            "properties": {
                "hive.exec.scratchdir": "s3://amzn-s3-demo-bucket/emr-serverless-hive/hive/scratch",
                "hive.metastore.warehouse.dir": "s3://amzn-s3-demo-bucket/emr-serverless-hive/hive/warehouse",
                "hive.driver.cores": "2",
                "hive.driver.memory": "4g",
                "hive.tez.container.size": "4096",
                "hive.tez.cpu.vcores": "1"
            }
        }]
    }'
```

您可以在 [EMR Serverless](https://github.com/aws-samples/emr-serverless-samples/tree/main/examples/hive) GitHub 示例存储库中找到有关如何运行 Hive 作业的其他示例。