使用 Amazon CLI 管理任务运行 - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

使用 Amazon CLI 管理任务运行

本主题介绍了如何使用 Amazon Command Line Interface(Amazon CLI)来管理任务运行。

提交任务运行

使用具有指定参数的 JSON 文件来提交任务运行

  1. 创建 start-job-run-request.json 文件并指定任务运行所需的参数,如下面的 JSON 文件所示。有关这些参数的更多信息,请参阅 配置任务运行的选项

    { "name": "myjob", "virtualClusterId": "123456", "executionRoleArn": "iam_role_name_for_job_execution", "releaseLabel": "emr-6.2.0-latest", "jobDriver": { "sparkSubmitJobDriver": { "entryPoint": "entryPoint_location", "entryPointArguments": ["argument1", "argument2", ...], "sparkSubmitParameters": "--class <main_class> --conf spark.executor.instances=2 --conf spark.executor.memory=2G --conf spark.executor.cores=2 --conf spark.driver.cores=1" } }, "configurationOverrides": { "applicationConfiguration": [ { "classification": "spark-defaults", "properties": { "spark.driver.memory":"2G" } } ], "monitoringConfiguration": { "persistentAppUI": "ENABLED", "cloudWatchMonitoringConfiguration": { "logGroupName": "my_log_group", "logStreamNamePrefix": "log_stream_prefix" }, "s3MonitoringConfiguration": { "logUri": "s3://my_s3_log_location" } } } }
  2. 使用 start-job-run 命令和存储在本地或 Amazon S3 上的 start-job-run-request.json 文件路径。

    aws emr-containers start-job-run \ --cli-input-json file://./start-job-run-request.json

使用 start-job-run 命令来开启任务运行。

  • 使用 StartJobRun 命令提供所有指定的参数,如以下示例所示。

    aws emr-containers start-job-run \ --virtual-cluster-id 123456 \ --name myjob \ --execution-role-arn execution-role-arn \ --release-label emr-6.2.0-latest \ --job-driver '{"sparkSubmitJobDriver": {"entryPoint": "entryPoint_location", "entryPointArguments": ["argument1", "argument2", ...], "sparkSubmitParameters": "--class <main_class> --conf spark.executor.instances=2 --conf spark.executor.memory=2G --conf spark.executor.cores=2 --conf spark.driver.cores=1"}}' \ --configuration-overrides '{"applicationConfiguration": [{"classification": "spark-defaults", "properties": {"spark.driver.memory": "2G"}}], "monitoringConfiguration": {"cloudWatchMonitoringConfiguration": {"logGroupName": "log_group_name", "logStreamNamePrefix": "log_stream_prefix"}, "persistentAppUI":"ENABLED", "s3MonitoringConfiguration": {"logUri": "s3://my_s3_log_location" }}}'

配置任务运行的选项

使用以下选项配置任务运行参数:

  • --execution-role-arn:您必须提供用于运行任务的 IAM 角色。有关更多信息,请参阅 将任务执行角色与 Amazon EMR on EKS 结合使用

  • --release-label:您可以使用 Amazon EMR 5.32.0 和 6.2.0 及更高版本部署 Amazon EMR on EKS。以前的 Amazon EMR 版本不支持 Amazon EMR on EKS。有关更多信息,请参阅 Amazon EMR on EKS 发行版

  • --job-driver:任务驱动程序用于为主要任务提供输入。这是一个联合类型字段,您只能传递要运行的任务类型值之一。支持的任务类型包括:

    • Spark 提交任务 - 用于通过 Spark 提交运行命令。您可以使用此任务类型,通过 Spark 提交运行 Scala、PySpark、SparkR、SparkSQL 和任何其他受支持的任务。此任务类型具有以下参数:

      • Entrypoint - 这是 HCFS(兼容 Hadoop 的文件系统)对要运行的主 jar/py 文件的引用。

      • EntryPointArguments - 这是您想要传递给主 jar /py 文件的参数数组。您应该使用 Entrypoint 代码来处理读取这些参数。该数组中的每个参数都应该用逗号分隔。

      • SparkSubmitParameters - 这些是您希望向任务发送的更多 Spark 参数。使用此参数可覆盖默认的 Spark 属性,例如驱动程序内存、—conf 或 —class 等执行程序的数量。有关更多信息,请参阅使用 spark-submit 启动应用程序

  • --configuration-overrides:您可以为应用程序提供配置对象以覆盖默认配置。您可以使用简写语法提供配置,或可引用 JSON 文件中的配置对象。配置对象包含分类、属性和可选的嵌套配置。属性由您希望在该文件中覆盖的设置组成。您可以在一个 JSON 对象中为多个应用程序指定多个分类。可用的配置分类因 Amazon EMR 发行版而异。有关 Amazon EMR 每个发行版可用的配置分类列表,请参阅Amazon EMR on EKS 发行版

    如果在应用程序覆盖和 Spark 提交参数中传递相同的配置,则 Spark 提交参数优先。完整的配置优先级列表如下,按最高优先级到最低优先级的顺序排列。

    • 创建 SparkSession 时提供的配置。

    • 使用 —conf 作为 sparkSubmitParameters 的一部分提供的配置。

    • 作为应用程序覆盖的一部分提供的配置。

    • Amazon EMR 为发行版选择的优化配置。

    • 应用程序的默认开源配置。

    要使用 Amazon CloudWatch 或 Amazon S3 监控任务运行,您必须提供 CloudWatch 的配置详细信息。有关更多信息,请参阅配置任务运行以使用 S3 日志配置任务运行以使用 Amazon CloudWatch Logs。如果 S3 存储桶或 CloudWatch 日志组不存在,则 Amazon EMR 会先创建二者中的一个,然后再将日志上载到存储桶。

  • 有关 Kubernetes 配置选项的其它列表,请参阅 Kubernetes 中的 Spark 属性

    不支持以下 Spark 配置。

    • spark.kubernetes.authenticate.driver.serviceAccountName

    • spark.kubernetes.authenticate.executor.serviceAccountName

    • spark.kubernetes.container.image

    • spark.kubernetes.namespace

    • spark.kubernetes.driver.pod.name

    • spark.kubernetes.container.image.pullPolicy

配置任务运行以使用 S3 日志

为了能够监控任务进度并排查故障,您必须配置任务以将日志信息发送到 Amazon S3、Amazon CloudWatch Logs 或两者。本主题可提供入门知识,帮助您将通过 Amazon EMR on EKS 启动的任务的应用程序日志发布到 Amazon S3。

S3 日志 IAM 策略

任务执行角色的权限策略中必须包含以下权限,然后才能将日志数据发送到 Amazon S3。请将 DOC-EXAMPLE-BUCKET-LOGGING 替换为您的日志记录存储桶名称。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET-LOGGING", "arn:aws:s3:::DOC-EXAMPLE-BUCKET-LOGGING/*", ] } ] }
注意

Amazon EMR on EKS 也可以创建 Amazon S3 存储桶。如果 Amazon S3 存储桶不可用,则 IAM 策略应包含 “s3:CreateBucket” 权限。

在您授予执行角色将日志发送到 Amazon S3 的合适权限后,只要 s3MonitoringConfiguration 通过 monitoringConfiguration 请求的 start-job-run 部分,您的日志数据将发送到以下 Amazon S3 位置,如 使用 Amazon CLI 管理任务运行 所示。

  • 控制器日志 - /logUri/virtual-cluster-id/jobs/job-id/containers/pod-name/(stderr.gz/stdout.gz)

  • 驱动程序日志 - /logUri/virtual-cluster-id/jobs/job-id/containers/spark-application-id/spark-job-id-driver/(stderr.gz/stdout.gz)

  • 执行程序日志 - /logUri/virtual-cluster-id/jobs/job-id/containers/spark-application-id/executor-pod-name/(stderr.gz/stdout.gz)

配置任务运行以使用 Amazon CloudWatch Logs

要监控任务进度并排查故障,您必须配置任务,将日志信息发送到 Amazon S3、Amazon CloudWatch Logs 或两者。本主题可帮助您在通过 Amazon EMR on EKS 启动的任务中开始使用 CloudWatch Logs。有关 CloudWatch Logs 的更多信息,请参阅《Amazon CloudWatch 用户指南》中的监控日志文件

CloudWatch Logs IAM 策略

要完成将日志数据发送到 CloudWatch Logs 的任务,任务执行角色的权限策略中必须包含以下权限。以 my_log_group_namemy_log_stream_prefix 分别替换 CloudWatch 日志组名称和日志流名称。如果日志组和日志流式传输不存在,只要执行角色 ARN 具有适当的权限,则 Amazon EMR on EKS 将创建这些日志组和日志流式传输。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:DescribeLogGroups", "logs:DescribeLogStreams" ], "Resource": [ "arn:aws:logs:*:*:*" ] }, { "Effect": "Allow", "Action": [ "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:*:*:log-group:my_log_group_name:log-stream:my_log_stream_prefix/*" ] } ] }
注意

Amazon EMR on EKS 还可以创建日志流。如果日志流不存在,IAM 策略应包含 "logs:CreateLogGroup" 权限。

在您为执行角色指定了合适的权限后,只要 cloudWatchMonitoringConfiguration 通过 start-job-run 请求的 monitoringConfiguration 部分,您的应用程序应将其日志数据发送到 CloudWatch Logs,如 使用 Amazon CLI 管理任务运行 所示。

StartJobRun API 中,log_group_name 是 CloudWatch 的日志组名称,log_stream_prefix 则是 CloudWatch 日志流式传输的名称前缀。您可以在Amazon Web Services Management Console中查看和搜索这些日志。

  • 控制器日志 - logGroup/logStreamPrefix/virtual-cluster-id/jobs/job-id/containers/pod-name/(stderr/stdout)

  • 驱动程序日志 - logGroup/logStreamPrefix/virtual-cluster-id/jobs/job-id/containers/spark-application-id/spark-job-id-driver/(stderrstdout)

  • 执行程序日志 - logGroup/logStreamPrefix/virtual-cluster-id/jobs/job-id/containers/spark-application-id/executor-pod-name/(stderr/stdout)

列出任务运行

您可以运行 list-job-run 以显示任务运行的状态,如以下示例所示。

aws emr-containers list-job-runs --virtual-cluster-id <cluster-id>

描述任务运行

您可以运行 describe-job-run 来获取有关任务的更多详细信息,如任务状态、状态详细信息和任务名称,如以下示例所示。

aws emr-containers describe-job-run --virtual-cluster-id cluster-id --id job-run-id

取消任务运行

您可以运行 cancel-job-run 以取消正在运行的任务,如以下示例所示。

aws emr-containers cancel-job-run --virtual-cluster-id cluster-id --id job-run-id