如何排查查看 AWS Glue ETL 作业的 Spark UI 时遇到的问题?

上次更新时间:2020 年 5 月 21 日

为什么我无法查看 AWS Glue ETL 作业的 Apache Spark UI?

解决方法

选择以下解决方案之一,具体取决于您是使用 AWS CloudFormation 堆栈还是使用 Docker 访问 Spark UI。

AWS CloudFormation 堆栈

当您使用 AWS CloudFormation 堆栈查看 Spark UI 时,Amazon Elastic Compute Cloud (Amazon EC2) 实例将作出 HTTPS 请求,以确认 Spark UI 正常运行。如果该请求失败,您将收到错误“WaitCondition timed out.Received 0 conditions when expecting 1”,且 AWS CloudFormation 堆栈将回滚。

检查以下各项以解决此问题:

  • 子网:确认子网可以达到 Amazon Simple Storage Service (Amazon S3) API 终端节点。例如,如果您使用私有子网,确认该子网拥有 VPC 终端节点或 NAT 网关。
  • 历史服务器端口:确认您可以通过 Spark 历史服务器端口访问子网。例如,防火墙可以阻止该端口。
  • 事件日志目录:确认您已为事件日志目录输入了有效的 Amazon S3 路径。您必须将 s3a:// 用于事件日志路径方案。如果您指定的 Amazon S3 路径中有事件日志文件,则路径有效。

如果您仍然收到错误,则检查 Amazon CloudWatch Logs 中的以下日志组:

  • /aws-glue/sparkui_cfn/cfn-init.log
  • /aws-glue/sparkui_cfn/spark_history_server.log

注意:历史服务器 EC2 实例将在 CloudFormation 堆栈回滚时终止。要防止实例被终止,请为堆栈启用终止保护

Docker

如果您使用 Docker 查看 Spark UI 且无法从 Web 浏览器连接到 Spark 历史服务器,则检查以下各项:

  • 确认 AWS 凭证(访问密钥和密钥)有效。如果您想要使用临时凭证,您必须在命令中使用 spark.hadoop.fs.s3a.session.token。示例:
$ docker run -itd -e SPARK_HISTORY_OPTS="$SPARK_HISTORY_OPTS \
-Dspark.history.fs.logDirectory=s3a://path_to_eventlog \
-Dspark.hadoop.fs.s3a.access.key=AWS_ACCESS_KEY_ID
-Dspark.hadoop.fs.s3a.secret.key=AWS_SECRET_ACCESS_KEY \
-Dspark.hadoop.fs.s3a.session.token=SESSION_TOKEN \
-Dspark.hadoop.fs.s3a.aws.credentials.provider=org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider" \
-p 18080:18080 glue/sparkui:latest "/opt/spark/bin/spark-class org.apache.spark.deploy.history.HistoryServer"
  • 确认您为事件日志历史输入了有效的 Amazon S3 路径。您必须将 s3a:// 用于事件日志路径方案。如果您指定的 Amazon S3 路径中有事件日志文件,则路径有效。
  • 确认您在浏览器中输入了正确的端口号。默认情况下,端口号为 18080(例如,http://localhost:18080)。要更改端口号,请更改命令中的 -p 参数和 Dockerfile 中的 spark.history.ui.port 参数。

如果您仍然无法查看 Spark UI,则检查日志。要获取 Docker 容器的 stdout 和 stderr 日志,请使用 -it 参数而不是 -itd 参数运行 docker run。示例:

$ docker run -it -e SPARK_HISTORY_OPTS="$SPARK_HISTORY_OPTS \
-Dspark.history.fs.logDirectory=s3a://path_to_eventlog \
-Dspark.hadoop.fs.s3a.access.key=AWS_ACCESS_KEY_ID
-Dspark.hadoop.fs.s3a.secret.key=AWS_SECRET_ACCESS_KEY \
-Dspark.hadoop.fs.s3a.session.token=SESSION_TOKEN \
-Dspark.hadoop.fs.s3a.aws.credentials.provider=org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider" \
-p 18080:18080 glue/sparkui:latest "/opt/spark/bin/spark-class org.apache.spark.deploy.history.HistoryServer"