我可以使用以下命令在AWS EMR上提交spark任务。如何从Spark作业中获取stdout ?
aws emr add-steps --cluster-id ${CLUSTERID}
--output json
--steps Type=spark,Name=${JOB_NAME},Args=[--deploy-mode,cluster,--master,yarn,--conf,spark.yarn.submit.waitAppCompletion=true,--conf,spark.eventLog.enabled=true,--num-executors,1,--executor-cores,1,--executor-memory,2g,--conf,spark.eventLog.dir=${LOG_DIR},s3://bucket/${FILE_NAME},s3://bucket/${FILE_NAME}],ActionOnFailure=CONTINUE
在EMR上查看Spark作业的标准输出时,您有几个选项。您可以在EMR文档中查看有关在集群主节点或S3上查看日志文件的详细信息。
编程访问
如果您希望在不连接到EMR主节点本身的情况下以编程方式查看输出,则需要确保为您的集群启用了S3日志归档,并且您可以访问该S3位置。有两个选项。
- 您可以在
client
模式下运行Spark应用程序,并在S3中查看同步后的步骤日志。例如,如果您将EMR集群配置为向s3://${S3_BUCKET}/logs/emr
发送日志,则步骤日志将在s3://${S3_BUCKET}/logs/emr/${CLUSTER_ID}/steps/${STEP_ID}/
中。然后你可以复制stdout.gz
到你的系统并gunzip
它。
aws s3 cp s3://${S3_BUCKET}/logs/emr/${CLUSTER_ID}/steps/${STEP_ID}/stdout.gz - | gunzip
- 如果您的Spark应用程序在
cluster
模式下运行,它变得有点困难,因为您必须从步骤日志中找出Yarn应用程序ID,然后查看发送到S3的Yarn容器日志。这仍然是可行的,你只是有几个额外的步骤。这些容器日志也需要稍长的时间才能显示在S3中。
# Parse the step log for the Yarn application ID
YARN_APP_ID=$(aws s3 cp s3://${S3_BUCKET}/logs/emr/${CLUSTER_ID}/steps/${STEP_ID}/stderr.gz - | gunzip | grep "Submitting application application" | grep -oE "application_d+_d+")
# Copy the Yarn application stdout log (once it's available)
aws s3 cp s3://${S3_BUCKET}/logs/emr/${CLUSTER_ID}/containers/application_${YARN_APP_ID}/container_${YARN_APP_ID}_01_000001/stdout.gz - | gunzip
第二个命令假设作业被安排在第一个容器上,并且没有失败或再次重试,因此可能需要调整。
控制台访问如果您想在EMR控制台中查看日志,也有几个选项。
- 如果您已使用
client
模式提交作业和如果启用了S3日志记录,则可以在EMR集群的Steps选项卡中查看步骤stdout
日志。
如果没有启用S3日志,您可以使用托管的应用程序ui。
集群上的应用UI——当集群运行时,您可以从集群的Applications选项卡中访问Spark UI。这将启动Spark History Server,您可以导航到您的作业,然后是Executors选项卡,然后是驱动程序的Logs列中的
stdout
链接。持久应用程序UI -在集群运行期间和终止后30天内,您仍然可以通过选择持久应用程序UI从集群的应用程序选项卡中访问Spark UI选择。
无论您选择的是客户机部署模式还是集群部署模式,最后两个选项都以相同的方式工作。
Amazon EMR CLI Access
多亏了这篇文章,我刚刚对Amazon EMR CLI进行了修改,使得简单的PySpark脚本可以很容易地完成这样的工作。使用新的--show-stdout
标志,您可以像这样在EMR上运行本地PySpark脚本,它将显示stdout
。
emr run
--entry-point entrypoint.py
--cluster-id ${CLUSTER_ID}
--s3-code-uri s3://${S3_BUCKET}/pyspark-code/
--wait --show-stdout