

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

# 使用 S3 Select Pushdown 搭配 Presto 提高性能
<a name="emr-presto-s3select"></a>

**重要**  
不再向新客户提供 Amazon S3 Select。Amazon S3 Select 的现有客户可以像往常一样继续使用该功能。[了解详情](https://www.amazonaws.cn/blogs/storage/how-to-optimize-querying-your-data-in-amazon-s3/) 

使用 Amazon EMR 发行版 5.18.0 及更高版本，您可以将 [S3 Select](https://www.amazonaws.cn/blogs/aws/s3-glacier-select/) Pushdown 与 Presto on Amazon EMR 搭配使用。此功能允许 Presto 将投影操作（例如，`SELECT`）和谓词操作（例如，`WHERE`）的计算工作“下推”至 Amazon S3。这允许查询仅从 Amazon S3 中检索所需数据，从而可以提高性能并减少某些应用程序在 Amazon EMR 和 Amazon S3 之间传输的数据量。

## S3 Select Pushdown 是否适合我的应用程序？
<a name="emr-presto-s3select-apps"></a>

建议您分别在使用和不使用 S3 Select Pushdown 的情况下对您的应用程序进行基准检验，以查看其是否适用于您的应用程序。

使用以下准则来确定您的应用程序是否为使用 S3 Select 的候选项：
+ 您的查询将筛选掉原始数据集的一半以上的数据。
+ 您的查询筛选谓词使用具有 Presto 和 S3 Select 支持的数据类型的列。S3 Select Pushdown 不支持时间戳、实数和双精度数据类型。建议对数值数据使用十进制数据类型。有关 S3 Select 支持的数据类型的更多信息，请参阅*《Amazon Simple Storage Service 用户指南》*中的[数据类型](https://docs.amazonaws.cn/AmazonS3/latest/userguide/s3-glacier-select-sql-reference-data-types.html)。
+ 您在 Amazon S3 和 Amazon EMR 集群之间的网络连接具有良好的传输速度和可用带宽。Amazon S3 不压缩 HTTP 响应，因此响应大小可能会根据压缩的输入文件而增大。

## 注意事项和限制
<a name="emr-presto-s3select-considerations"></a>
+ 仅支持以 CSV 格式存储的对象。对象可以解压缩，也可以选择使用 gzip 或 bzip2 压缩。
+ 不支持 `AllowQuotedRecordDelimiters` 属性。如果指定该属性，则查询将失败。
+ 使用客户提供的加密密钥进行的 Amazon S3 服务器端加密（SSE-C）与客户端加密都不受支持。
+ S3 Select Pushdown 不能替代使用列式或压缩文件格式（如 ORC 或 Parquet）。
+ Amazon S3 Select 不支持 Presto 和 Trino 的跨区域查询。

## 启用 S3 Select Pushdown with PrestoDB 或 Trino
<a name="emr-presto-s3select-specify"></a>

要在 Amazon EMR 上启用 PrestoDB 的 S3 Select Pushdown，请使用 `presto-connector-hive` 配置分类以将 `hive.s3select-pushdown.enabled` 设置为 `true`，如以下示例所示。有关更多信息，请参阅[配置应用程序](emr-configure-apps.md)。还必须设置 hive.s3select-pushdown.max-connections 值。对于大部分应用程序，`500` 的默认设置应该能满足需求。有关更多信息，请参阅下面的 [了解和调整 hive.s3select-pushdown.max-connections](#emr-presto-s3select-max)。

对于 EMR 版本 6.1.0 - 6.3.0 或更高版本上的 PrestoSQL，只需将以下示例中的 `presto-connector-hive` 替换为 `prestosql-connector-hive`。

Amazon EMR 6.4.0 及更高版本使用新名称 Trino 而不是 PrestoSQL。如果您使用 Trino，请在以下示例中将 `presto-connector-hive` 替换为 `trino-connector-hive`。

```
[
    {
        "classification": "presto-connector-hive",
        "properties": {
            "hive.s3select-pushdown.enabled": "true",
            "hive.s3select-pushdown.max-connections": "500"
        }
    }
]
```

### 了解和调整 hive.s3select-pushdown.max-connections
<a name="emr-presto-s3select-max"></a>

默认情况下，Presto 使用 EMRFS 作为其文件系统。`emrfs-site` 配置分类中的设置 `fs.s3.maxConnections` 指定允许通过 Presto 的 EMRFS 连接到 Amazon S3 的最大客户端连接数。默认情况下，此连接数为 500。S3 Select Pushdown 在访问 Amazon S3 执行谓词操作时绕过 EMRFS。在此示例中，`hive.s3select-pushdown.max-connections` 的值确定从 Worker 节点执行这些操作所允许的最大客户端连接数。但是，Presto 启动的任何未向下推送的发往 Amazon S3 的请求（例如 GET 操作）将继续由 `fs.s3.maxConnections` 的值控制。

如果您的应用程序遇到错误“Timeout waiting for connection from pool”，请增加 `hive.s3select-pushdown.max-connections` 和 `fs.s3.maxConnections` 的值。