如何在AWS EMR上获取spark作业的标准输出



我可以使用以下命令在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位置。有两个选项。

  1. 您可以在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
  1. 如果您的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控制台中查看日志,也有几个选项。

  1. 如果您已使用client模式提交作业如果启用了S3日志记录,则可以在EMR集群的Steps选项卡中查看步骤stdout日志。

如果没有启用S3日志,您可以使用托管的应用程序ui。

  1. 集群上的应用UI——当集群运行时,您可以从集群的Applications选项卡中访问Spark UI。这将启动Spark History Server,您可以导航到您的作业,然后是Executors选项卡,然后是驱动程序的Logs列中的stdout链接。

  2. 持久应用程序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

最新更新