开始使用 Amazon EMR on EKS - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

开始使用 Amazon EMR on EKS

本主题通过在虚拟集群上部署 Spark 应用程序,帮助您开始使用 Amazon EMR on EKS。其中包括设置正确权限和启动作业的步骤。开始之前,请确保您已完成设置 Amazon EMR on EKS中的步骤。这可以帮助您在创建虚拟集群之前获得诸如 Amazon CLI 设置之类的工具。有关其他可以帮助您入门的模板,请参阅我们的 EMR 容器最佳实践指南。 GitHub

您将需要安装步骤中的以下信息:

  • 使用 Amazon EMR 注册的 Amazon EKS 集群 和 Kubernetes 命名空间的虚拟集群 ID

    重要

    创建 EKS 集群时,请使用 m5.xlarge 作为实例类型,或使用具有较高 CPU 和内存的任何其他实例类型。与 m5.xlarge 相比,使用具有较低 CPU 或内存的实例类型可能会由于集群中可用资源不足而导致任务失败。

  • 用于执行任务的 IAM 角色名称

  • Amazon EMR 发行版的发行版标签(例如:emr-6.4.0-latest

  • 用于日志记录和监控的地址目标:

    • Amazon CloudWatch 日志组名称和日志流前缀

    • 用于存储事件和容器日志的 Amazon S3 位置

重要

EKS 任务上的 Amazon EMR 使用亚马逊 CloudWatch 和亚马逊 S3 作为监控和记录的目标目标。您可以通过查看发送到这些地址的任务日志来监控任务进度并排查故障。要想启用日志记录,与执行任务的 IAM 角色关联的 IAM policy 必须具有访问目标资源所需的权限。如果 IAM 策略没有所需的权限,则在运行此示例任务之前更新任务执行角色的信任策略,您必须按照配置任务运行以使用 Amazon S3 日志和将任务运行配置为使用 CloudWatch 日志中概述的步骤操作。

运行 Spark 应用程序

执行以下步骤,即可在 Amazon EMR on EKS 上运行简单的 Spark 应用程序。适用于 Spark Python 应用程序的应用程序 entryPoint 文件位于 s3://REGION.elasticmapreduce/emr-containers/samples/wordcount/scripts/wordcount.pyREGION是您在 EKS 虚拟集群上的 Amazon EMR 所在的区域,例如。us-east-1

  1. 使用所需的权限更新任务执行角色的 IAM policy,如以下策略语句所示:

    { "Version": "2012-10-17", "Statement": [ { "Sid": "ReadFromLoggingAndInputScriptBuckets", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::*.elasticmapreduce", "arn:aws:s3:::*.elasticmapreduce/*", "arn:aws:s3:::amzn-s3-demo-destination-bucket", "arn:aws:s3:::amzn-s3-demo-destination-bucket/*", "arn:aws:s3:::amzn-s3-demo-logging-bucket", "arn:aws:s3:::amzn-s3-demo-logging-bucket/*" ] }, { "Sid": "WriteToLoggingAndOutputDataBuckets", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-destination-bucket/*", "arn:aws:s3:::amzn-s3-demo-logging-bucket/*" ] }, { "Sid": "DescribeAndCreateCloudwatchLogStream", "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:DescribeLogGroups", "logs:DescribeLogStreams" ], "Resource": [ "arn:aws:logs:*:*:*" ] }, { "Sid": "WriteToCloudwatchLogs", "Effect": "Allow", "Action": [ "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:*:*:log-group:my_log_group_name:log-stream:my_log_stream_prefix/*" ] } ] }
    • 本策略的第一个语句ReadFromLoggingAndInputScriptBuckets授予ListBucketGetObjects访问以下 Amazon S3 存储桶:

      • REGION.elasticmapreduce‐应用程序文件所在的存储桶entryPoint

      • amzn-s3-demo-destination-bucket-您为输出数据定义的存储桶。

      • amzn-s3-demo-logging-bucket-您为日志数据定义的存储桶。

    • 本策略的第二个语句 WriteToLoggingAndOutputDataBuckets 授予任务将数据分别写入输出和日志记录存储桶的权限。

    • 第三条语句DescribeAndCreateCloudwatchLogStream授予任务描述和创建 Amazon CloudWatch 日志的权限。

    • 第四条语句WriteToCloudwatchLogs授予将日志写入名为的 CloudWatch 日志流my_log_group_name下名为 Amazon 日志组的权限my_log_stream_prefix

  2. 要运行 Spark Python 应用程序,请使用以下命令。将所有可替换的red italicized值替换为适当的值。REGION是您在 EKS 虚拟集群上的 Amazon EMR 所在的区域,例如。us-east-1

    aws emr-containers start-job-run \ --virtual-cluster-id cluster_id \ --name sample-job-name \ --execution-role-arn execution-role-arn \ --release-label emr-6.4.0-latest \ --job-driver '{ "sparkSubmitJobDriver": { "entryPoint": "s3://REGION.elasticmapreduce/emr-containers/samples/wordcount/scripts/wordcount.py", "entryPointArguments": ["s3://amzn-s3-demo-destination-bucket/wordcount_output"], "sparkSubmitParameters": "--conf spark.executor.instances=2 --conf spark.executor.memory=2G --conf spark.executor.cores=2 --conf spark.driver.cores=1" } }' \ --configuration-overrides '{ "monitoringConfiguration": { "cloudWatchMonitoringConfiguration": { "logGroupName": "my_log_group_name", "logStreamNamePrefix": "my_log_stream_prefix" }, "s3MonitoringConfiguration": { "logUri": "s3://amzn-s3-demo-logging-bucket" } } }'

    此任务的输出数据将出现在s3://amzn-s3-demo-destination-bucket/wordcount_output

    您还可以为任务运行创建具有指定参数的 JSON 文件。然后运行指向 JSON 文件路径的 start-job-run 命令。有关更多信息,请参阅 使用 StartJobRun 提交任务运行。有关配置任务运行参数的更多详细信息,请参阅配置任务运行的选项

  3. 要运行 Spark SQL 应用程序,请使用以下命令。将所有red italicized值替换为适当的值。REGION是您在 EKS 虚拟集群上的 Amazon EMR 所在的区域,例如。us-east-1

    aws emr-containers start-job-run \ --virtual-cluster-id cluster_id \ --name sample-job-name \ --execution-role-arn execution-role-arn \ --release-label emr-6.7.0-latest \ --job-driver '{ "sparkSqlJobDriver": { "entryPoint": "s3://query-file.sql", "sparkSqlParameters": "--conf spark.executor.instances=2 --conf spark.executor.memory=2G --conf spark.executor.cores=2 --conf spark.driver.cores=1" } }' \ --configuration-overrides '{ "monitoringConfiguration": { "cloudWatchMonitoringConfiguration": { "logGroupName": "my_log_group_name", "logStreamNamePrefix": "my_log_stream_prefix" }, "s3MonitoringConfiguration": { "logUri": "s3://amzn-s3-demo-logging-bucket" } } }'

    下面显示了一个示例 SQL 查询文件。您必须有一个外部文件存储,例如 S3,其中存储表的数据。

    CREATE DATABASE demo; CREATE EXTERNAL TABLE IF NOT EXISTS demo.amazonreview( marketplace string, customer_id string, review_id string, product_id string, product_parent string, product_title string, star_rating integer, helpful_votes integer, total_votes integer, vine string, verified_purchase string, review_headline string, review_body string, review_date date, year integer) STORED AS PARQUET LOCATION 's3://URI to parquet files'; SELECT count(*) FROM demo.amazonreview; SELECT count(*) FROM demo.amazonreview WHERE star_rating = 3;

    此任务的输出将在 S3 或驱动程序的 stdout 日志中可用 CloudWatch,具体取决于所配置monitoringConfiguration的。

  4. 您还可以为任务运行创建具有指定参数的 JSON 文件。然后运行指向 JSON 文件路径的 start-job-run 命令。有关更多信息,请参阅“提交任务运行”。有关配置任务运行参数的更多详细信息,请参阅“配置任务运行的选项”。

    要监控任务进度或调试故障,您可以检查上传到 Amazon S3 的 CloudWatch 日志、日志或两者。请参阅 Amazon S3 中的日志路径配置任务运行以使用 S3 日志,有关配置任务运行以使用日志的 Cloudwatch CloudWatch 日志。要在日志中查看 CloudWatch 日志,请按照以下说明进行操作。

    • 打开 CloudWatch 控制台,网址为https://console.aws.amazon.com/cloudwatch/

    • 导航窗格中,选择 Logs (日志)。然后选择 Log groups (日志组)

    • 选择 Amazon EMR on EKS 日志组,然后查看已上载的录入事件。

    使用 CloudWatch 日志进行监控
重要

作业配置了默认的重试策略。有关如何修改或禁用配置的信息,请参阅使用作业重试策略