

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

# 为 Amazon EMR 使用无服务器存储 Serverless
<a name="jobs-serverless-storage"></a>

在 Amazon EMR 7.12 及更高版本中，在运行 Apache Spark 任务时使用无服务器存储，以消除本地磁盘配置并降低数据处理成本，并防止由于磁盘容量限制而导致任务失败。Serverless 存储无需配置容量即可自动处理作业的洗牌、磁盘溢出和磁盘缓存操作，并免费存储中间数据。Amazon EMR Serverless 将中间数据存储在完全托管的无服务器存储中，该存储可根据工作负载需求自动扩展，并使 Spark 能够在空闲时立即释放计算工作人员，从而降低计算成本。

## 主要优势
<a name="jobs-serverless-storage-key-benefits"></a>

EMR Serverless 的无服务器存储具有以下优势。
+ **零配置存储** — 无服务器存储无需为每个应用程序或任务配置本地磁盘类型和大小。EMR Serverless 无需容量规划即可自动管理中间数据操作。
+ **通过自动扩展防止任务失败** — 存储容量可根据工作负载需求自动扩展，防止因磁盘容量不足而导致任务失败。
+ **降低数据处理成本** — 无服务器存储通过两种机制降低了处理成本。首先，中间数据存储是免费提供的，您只需为计算和内存资源付费。其次，将存储与 Spark 的动态资源分配分开后，Spark 能够在闲置时立即释放工作人员，而不是保留他们以将中间数据保留在本地磁盘上。这可以加快每个 Spark 阶段的横向扩展和缩小规模，从而降低后期阶段需要比初始阶段更少的工作人员的计算成本。
+ **具有作业级隔离功能的加密存储** — 所有中间数据在传输过程中和静态数据都经过严格的作业级隔离。
+ **精细访问控制支持** — 无服务器存储通过 AWS Lake Formation 集成支持精细的访问控制。

## 开始使用
<a name="jobs-serverless-storage-getting-started"></a>

要在 Spark 工作流程中使用适用于 EMR Serverless 的无服务器存储，请参阅以下步骤。

1. **创建 EMR 无服务器应用程序**

   通过在 spark-defaults 分类中将 spark 属性`spark.aws.serverlessStorage.enabled`设置为 **t** rue，创建启用无服务器存储的 EMR Serverless 7.12（或更高版本）应用程序。

   ```
   aws emr-serverless create-application \
     --type "SPARK" \
     --name my-application \
     --release-label emr-7.12.0 \
     --runtime-configuration '[{
         "classification": "spark-defaults",
           "properties": {
             "spark.aws.serverlessStorage.enabled": "true"
           }
       }]' \
     --region <AWS_REGION>
   ```

1. **开始一个 Spark 任务**

   开始在您的应用程序上运行作业。EMR 的无服务器存储 Serverless 会自动处理中间数据操作，例如作业的随机播放。

   ```
   aws emr-serverless start-job-run \
     --application-id <application-id> \
     --execution-role-arn <job-role-arn> \
     --job-driver '{
       "sparkSubmit": {
         "entryPoint": "s3://<bucket>/script.py",
         "sparkSubmitParameters": "--conf spark.executor.cores=4 
           --conf spark.executor.memory=20g 
           --conf spark.driver.cores=4 
           --conf spark.driver.memory=8g 
           --conf spark.executor.instances=10"
       }
     }'
   ```

   即使未在应用程序级别启用无服务器存储，您也可以在作业级别为 EMR Serverless 启用无服务器存储。这将启动启用了无服务器存储的工作节点来处理您的作业。您还可以通过将相同的 Spark 属性设置为 **false `spark.aws.serverlessStorage.enabled`** 来禁用特定作业的无服务器存储。

   ```
   # Turn on serverless storage for EMR serverless for a specific job
   aws emr-serverless start-job-run \
       --application-id <application-id> \
       --execution-role-arn <job-role-arn> \
       --job-driver '{
   "sparkSubmit": {
   "entryPoint": "/usr/lib/spark/examples/jars/spark-examples.jar",
               "entryPointArguments": ["1"],
               "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi
               --conf spark.aws.serverlessStorage.enabled": "true"
           }
       }'
   ```
**注意**  
要继续使用传统的本地磁盘配置，请省略`spark.aws.serverlessStorage.enabled`配置或将其设置为 **false**。

## 注意事项和限制
<a name="jobs-serverless-storage-limitations"></a>
+ **发布版本** — Amazon EMR 7.12 及更高版本支持无服务器存储。
+ **数据量限制** — 每个作业每次运行最多可以读取和写入 200 GB 的中间数据。超过此限制的任务将失败，并显示一条错误消息，表明已达到无服务器存储限制。
+ **任务执行超时** — 无服务器存储支持执行超时长达 24 小时的作业。为更长的执行超时配置的作业将失败并显示错误消息。
+ **预初始化容量** — 预初始化的容量工作人员不支持无服务器存储。配置预初始化容量时，只有在作业级别明确禁用无服务器存储的作业才会使用该容量。启用无服务器存储的作业将始终按需配置新的工作人员，并且无论应用程序级别的配置如何，都不会使用任何预先初始化的容量。
+ **工作负载类型**-流式处理和交互式作业不支持无服务器存储。
+ **工作器配置** — 使用 1 或 2 v CPUs 的工作器不支持无服务器存储。

## 支持 AWS 区域
<a name="jobs-serverless-storage-regions"></a>

EMR Serverless 支持以下区域的无服务器存储：
+ 美国东部（弗吉尼亚州北部）
+ 美国西部（俄勒冈州）
+ 欧洲地区（爱尔兰）