开始使用 Amazon EMR on EKS
本主题通过在虚拟集群上部署 Spark 应用程序,帮助您开始使用 Amazon EMR on EKS。其中包括设置正确权限和启动作业的步骤。开始之前,请确保您已完成设置 Amazon EMR on EKS中的步骤。这有助于您在创建虚拟集群之前设置 AWS CLI 等工具。有关可以帮助您入门的其他模板,请参阅 GitHub 上的 EMR Containers Best Practices Guide
您将需要安装步骤中的以下信息:
-
使用 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 位置
-
重要
Amazon EMR on EKS 任务将 Amazon CloudWatch 和 Amazon S3 用作监控和日志记录的地址目标。您可以通过查看发送到这些地址的任务日志来监控任务进度并排查故障。要想启用日志记录,与执行任务的 IAM 角色关联的 IAM policy 必须具有访问目标资源所需的权限。如果 IAM policy 不具备所需的权限,则必须遵循更新任务执行角色的信任策略中所述的步骤,配置任务运行至使用 Amazon S3 日志,并且在运行此类示例任务之前,配置任务运行至使用 CloudWatch Logs。
运行 Spark 应用程序
执行以下步骤,即可在 Amazon EMR on EKS 上运行简单的 Spark 应用程序。适用于 Spark Python 应用程序的应用程序 entryPoint
文件位于 s3://
。此类REGION
.elasticmapreduce/emr-containers/samples/wordcount/scripts/wordcount.py区域
是 Amazon EMR on EKS 虚拟集群所在区域,例如 us-east-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
授予ListBucket
和GetObjects
访问以下 Amazon S3 存储桶:-
‐应用程序文件所在的存储桶REGION
.elasticmapreduceentryPoint
。 -
amzn-s3-demo-destination-bucket
:为输出数据定义的存储桶。 -
amzn-s3-demo-logging-bucket
:为日志记录数据定义的存储桶。
-
-
本策略的第二个语句
WriteToLoggingAndOutputDataBuckets
授予任务将数据分别写入输出和日志记录存储桶的权限。 -
第三个语句
DescribeAndCreateCloudwatchLogStream
授予任务描述和创建 Amazon CloudWatch Logs 的权限。 -
第四个语句
WriteToCloudwatchLogs
授予将日志写入
日志流中my_log_group_name
称为 Amazon CloudWatch 日志组的权限。my_log_stream_prefix
-
-
要运行 Spark Python 应用程序,请使用以下命令。以恰当值替换所有可替换的
红色斜体
值。此类区域
是 Amazon EMR on EKS 虚拟集群所在区域,例如us-east-1
。aws emr-containers start-job-run \ --virtual-cluster-id
cluster_id
\ --namesample-job-name
\ --execution-role-arnexecution-role-arn
\ --release-labelemr-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 提交任务运行。有关配置任务运行参数的更多详细信息,请参阅配置任务运行的选项。 -
要运行 Spark SQL 应用程序,请使用以下命令。以恰当值替换所有
红色斜体
值。此类区域
是 Amazon EMR on EKS 虚拟集群所在区域,例如us-east-1
。aws emr-containers start-job-run \ --virtual-cluster-id
cluster_id
\ --namesample-job-name
\ --execution-role-arnexecution-role-arn
\ --release-labelemr-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 或 CloudWatch 中驱动程序的 stdout 日志内找到,具体取决于已配置的
monitoringConfiguration
。 -
您还可以为任务运行创建具有指定参数的 JSON 文件。然后运行指向 JSON 文件路径的 start-job-run 命令。有关更多信息,请参阅“提交任务运行”。有关配置任务运行参数的更多详细信息,请参阅“配置任务运行的选项”。
要监控任务的进度或调试故障,您可以检查上传到 Amazon S3、CloudWatch Logs 或两者的日志。请参阅 Amazon S3 日志路径关于配置任务运行至使用 S3 日志,以及 Cloudwatch 日志关于配置任务运行至使用 CloudWatch Logs。要在 CloudWatch Logs 中查阅日志,请按照以下说明操作。
-
通过以下网址打开 CloudWatch 控制台:https://console.aws.amazon.com/cloudwatch/
。 -
在导航窗格中,选择 Logs (日志)。然后选择 Log groups (日志组)。
-
选择 Amazon EMR on EKS 日志组,然后查看已上载的录入事件。
-
重要
作业配置了默认的重试策略。有关如何修改或禁用配置的信息,请参阅使用作业重试策略。