本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
为 Amazon EMR 无服务器使用无服务器存储
在 Amazon EMR 7.12 及更高版本中,在运行 Apache Spark 任务时使用无服务器存储,以消除本地磁盘预置并降低数据处理成本,并防止因磁盘容量限制而导致任务失败。无服务器存储可自动处理任务的随机排序、磁盘溢出和磁盘缓存操作,无需容量配置,并且免费存储中间数据。Amazon EMR Serverless 将中间数据存储在完全托管的无服务器存储中,该存储可根据工作负载需求自动扩展,并使 Spark 能够在空闲时立即释放计算工作人员,从而降低计算成本。
主要优势
适用于 EMR 无服务器的无服务器存储具有以下优点。
-
Zero-configuration 存储 — 无服务器存储无需为每个应用程序或作业配置本地磁盘类型和大小。EMR Serverless 无需容量规划即可自动管理中间数据操作。
-
通过自动扩展防止作业失败 -存储容量根据工作负载需求自动扩展,防止因磁盘容量不足而导致作业失败。
-
降低数据处理成本 — 无服务器存储通过两种机制降低了处理成本。首先,中间数据存储是免费提供的,您只需为计算和内存资源付费。其次,使用Spark的动态资源分配解耦存储使Spark能够在空闲时立即释放工作人员,而不是将其保留在本地磁盘上以保留中间数据。这样可以加快每个 Spark 阶段的横向扩展和缩容,从而降低后期阶段所需工作人员少于初始阶段的任务的计算成本。
-
具有作业级隔离的加密存储 — 所有中间数据在传输过程中都经过加密,静态数据采用严格的作业级隔离。
-
Fine-grained 访问控制支持 — 无服务器存储通过 AWS Lake Formation 集成支持细粒度的访问控制。
开始使用
请参阅以下步骤,在 Spark 工作流程中为 EMR 无服务器使用无服务器存储。
-
创建 EMR 无服务器应用程序
通过在 spark-defaults 分类中将 spark 属性
spark.aws.serverlessStorage.enabled设置为 true,创建启用无服务器存储的 EMR 无服务器版本 7.12(或更高版本)应用程序。aws emr-serverless create-application \ --type "SPARK" \ --namemy-application\ --release-label emr-7.12.0 \ --runtime-configuration '[{ "classification": "spark-defaults", "properties": { "spark.aws.serverlessStorage.enabled": "true" } }]' \ --region<AWS_REGION> -
启动 Spark 作业
开始在您的应用程序上运行作业。EMR 无服务器存储服务器会自动处理中间数据操作,例如为您的任务进行洗牌。
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 。
注意事项和限制
-
发布版本 — 亚马逊 EMR 7.12 及更高版本支持无服务器存储。
-
数据量限制 — 使用 emr-7.12、emr-7.13 和 emr-spark-8.0,每个作业每次运行最多可以读取和写入 200 GB 的中间数据。对于 emr-7.14 及更高版本,包括 emr-spark-8.1,此限制将增加到 1 TB,但下文 “支持” 中注明的 200 GB 限制的区域除外。 AWS 区域 超过适用限制的作业将失败,并显示一条错误消息,表明已达到无服务器存储限制。
-
任务执行超时 — 无服务器存储支持执行超时长达 24 小时的作业。配置为更长执行超时的作业将失败并显示错误消息。
-
Pre-initialized 容量 — Pre-initialized 容量工作人员不支持无服务器存储。配置预初始化容量时,只有在作业级别明确禁用无服务器存储的作业才会使用该容量。无论应用程序级别的配置如何,启用了无服务器存储的作业都将始终按需配置新的工作线程,并且不会使用任何预初始化的容量。
-
工作负载类型 — 流媒体和交互式任务不支持无服务器存储。
-
工作器配置 — 拥有 1 或 2 个 vCPU 的工作器不支持无服务器存储。
支持 AWS 区域
EMR 无服务器支持以下区域的无服务器存储:
-
美国东部(弗吉尼亚州北部)
-
美国东部(俄亥俄州)
-
美国西部(北加利福尼亚)
-
美国西部(俄勒冈州)
-
亚太地区(香港)
-
亚太地区(雅加达)
-
亚太地区(孟买)
-
亚太地区(大阪)
-
亚太地区(首尔)
-
亚太地区(新加坡)
-
亚太地区(悉尼)
-
亚太地区(东京)
-
加拿大(中部)
-
欧洲地区(法兰克福)
-
欧洲地区(爱尔兰)
-
欧洲(西班牙)
-
欧洲地区(斯德哥尔摩)
-
南美洲(圣保罗)
-
非洲(开普敦)— 200 GB 限制
-
亚太地区(墨尔本)— 200 GB 限制
-
加拿大西部(卡尔加里)— 200 GB 限制
-
欧洲(伦敦)— 200 GB 限制
-
欧洲(米兰)— 200 GB 限制
-
欧洲(巴黎)— 200 GB 限制
-
欧洲(苏黎世)— 200 GB 限制