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

jv4diomz  于 2023-04-12  发布在  Apache
关注(0)|答案(1)|浏览(132)

我可以使用以下命令在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
7y4bm7vi

7y4bm7vi1#

在EMR上查看Spark作业的stdout时,您有几个选项。您可以在集群主节点或S3上的viewing log files上的EMR文档中查看详细信息。

编程访问

如果要以编程方式查看输出,而不连接到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模式下,它会变得有点困难,因为你必须从Step日志中找出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集群的步骤选项卡中查看步骤stdout日志。
如果您尚未启用S3日志记录,则可以使用托管应用UI。
1.集群上的应用程序UI-当集群运行时,您可以从集群的应用程序选项卡访问Spark UI。这将启动Spark历史服务器,您可以导航到您的作业,然后是Executors选项卡,然后是驱动程序的Logs列中的stdout链接。
1.持久化应用UI-无论是在集群运行期间,还是在集群终止后的30天内,您都可以通过选择持久化应用UI选项,从集群的应用选项卡访问Spark UI。

  • 无论您选择的是客户端还是群集部署模式,最后两个选项的工作方式相同。*

Amazon EMR CLI访问

感谢这篇文章,我刚刚对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

相关问题