

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

# 激活 Presto 严格模式
<a name="presto-strict-mode"></a>

在某些情况下，长时间运行的查询会产生极高的成本，并且可能导致 Amazon EMR 使用更多的集群资源。这会与集群上的其他工作负载竞争资源。在 Amazon EMR 版本 6.8 及更高版本中，您可以使用严格模式功能，拒绝以下类型的长时间运行的查询或向您发出警告：
+ 分区列上没有谓词的查询，这会导致对大量数据进行表扫描
+ 在两个大表之间使用交叉连接的查询
+ 对大量行进行无限制排序的查询

在 Presto 完全优化查询计划后，严格模式将开始运行。要根据您的查询需求使用和自定义严格模式，您可以通过以下方式配置 Presto。


**Presto 严格模式配置**  

| 设置 | 说明 | 默认 | 
| --- | --- | --- | 
| strict-mode-enabled | 开启和关闭严格模式。值 true 表示严格模式已开启。 | false | 
| strict-mode-fail-query | 如果严格模式检测到可能长时间运行的查询，则会拒绝相关查询。如果值为 false，则 Amazon EMR 只会发出警告。 | false | 
| strict-mode-restrictions | 指定严格模式开启时将应用的限制。严格模式支持以下限制：MANDATORY\$1PARTITION\$1PREDICATE、DISALLOW\$1CROSS\$1JOIN 和 LIMITED\$1SORT。 |  MANDATORY\$1PARTITION\$1PREDICATE、DISALLOW\$1CROSS\$1JOIN、LIMITED\$1SORT  | 

要试用严格模式，您可以覆盖这些配置，或者在使用 Presto 客户端时将其设置为会话属性。

**要在创建集群时使用设置配置 AWS 管理控制台**

1. 选择 **Create cluster**（创建集群）并选择 Amazon EMR 版本 6.8.0，然后选择 Presto 或 Trino。有关更多信息，请参阅 [安装 PrestoDB 和 Trino](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-presto-considerations.html#emr-prestodb-prestosql)。

1. 直接指定严格模式的配置属性，或者将 JSON 文件上传到 Amazon S3。或者，为您的元数据 AWS 仓选择 Glue 数据目录。指定您的 VPC、子网、引导操作、密钥对和安全组。选择 **Create cluster**（创建集群）以创建集群。

1. 登录到集群的主节点，然后运行 `presto-cli` 或 `trino-cli`。

1. 提交查询。严格模式会验证每个查询并确定它是否在长时间运行。根据您的 `strict-mode-fail-query` 设置，Amazon EMR 会拒绝查询或发出警告。

1. 完成查询后，终止集群并删除您的资源。

**使用在正在运行的集群上设置配置 AWS CLI**

1. 使用 AWS CLI 和运行`presto-cli`或，登录到集群的主节点`trino-cli`。

1. 使用所需的值运行以下命令。

   ```
   set session strict_mode_enabled = true; 
   set session strict_mode_fail_query = false;
   set session strict_mode_restrictions = 'DISALLOW_CROSS_JOIN,LIMITED_SORT';
   ```

## 注意事项
<a name="presto-strict-mode-considerations"></a>

在使用严格模式时，请注意以下几点：
+ 在某些情况下，严格模式可能会拒绝并未消耗大量资源的短时查询。例如，对小表的查询未应用动态筛选，也未用交叉连接替内部连接。这可能导致查询使用强制分区谓词或禁止交叉连接。发生这种情况时，严格模式会拒绝该查询。
+ 严格模式检查仅适用于 SELECT、INSERT、CREATE TABLE AS SELECT 和 EXPLAIN ANALYZE 查询类型。
+ 您只能通过 Hive 连接器使用对强制分区谓词的限制。