【AWS Glue】スイッチロール先のSparkジョブのメトリクス・ログをSparkUIで見れるようにする

公式ドキュメントだけでは分からない、スイッチロール先のSparkジョブをSparkUIで見れるようにする方法をまとめた

SparkUIサーバーの起動方法

起動方法は2種類(公式ドキュメントより)

ここでは、後者のDockerコンテナをローカル環境に立ち上げる方法を用いる。

スイッチロールしている場合、公式ドキュメントでは分からない

AWS GlueでSparkジョブを作っていてそれらのメトリクス・ログをSparkUIで見れるようにしたい場合、公式のドキュメントの手順に従うだけで実現可能です。

docs.aws.amazon.com

ただし、スイッチロール先の環境でSparkジョブを作っている場合、

  • アクセスキー
  • シークレットキー
  • セッショントーク

を取得しなければ、Dockerコンテナを起動することはできない

スクリプトを作成した

run_sparkui.sh

# 引数をロード
if [ $# = 0 ]; then
  echo "第1引数にprofile名を設定してください"
  exit 1
fi
PROFILE_NAME=$1

# 既存のコンテナがあれば停止・削除
docker stop sparkui
docker rm sparkui

# アクセスキーとセッショントークンを取得
ROLE_ARN=`aws configure get role_arn --profile ${PROFILE_NAME}`
LOG_DIR=`aws configure get sparkui_log_dir --profile ${PROFILE_NAME}`

if [ -z ${LOG_DIR} ]; then
  echo "'~/.aws/config' に 'sparkui_log_dir' が設定されていない可能性があります"
  exit 1
fi

AWS_STS_CREDENTIALS=`aws sts assume-role \
  --profile ${PROFILE_NAME} \
  --role-arn ${ROLE_ARN} \
  --role-session-name ${PROFILE_NAME}`

AWS_ACCESS_KEY_ID=`echo "${AWS_STS_CREDENTIALS}" | jq -r '.Credentials.AccessKeyId'`
AWS_SECRET_ACCESS_KEY=`echo "${AWS_STS_CREDENTIALS}" | jq -r '.Credentials.SecretAccessKey'`
SESSION_TOKEN=`echo "${AWS_STS_CREDENTIALS}" | jq -r '.Credentials.SessionToken'`

# コンテナ起動
docker run -itd \
  -e SPARK_HISTORY_OPTS="$SPARK_HISTORY_OPTS \
    -Dspark.history.fs.logDirectory=$LOG_DIR \
    -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 \
  --name sparkui \
  glue/sparkui:latest \
  "/opt/spark/bin/spark-class org.apache.spark.deploy.history.HistoryServer"

実行手順

0. 前提条件

~/.aws/config にスイッチロール先のプロファイルを作成していること

[default]
region = ap-northeast-1
output = json

[profile production]
role_arn = arn:aws:iam::123456789012:role/ProductionAccessRole
source_profile = default

1. Dockerイメージをビルドする

公式ドキュメントに従う

コードサンプルAWS Glueから Dockerfile と pom.xml をダウンロードします。

docker build -t glue/sparkui:latest .

2. イベントログが出力されるS3パスを追加する

~/.aws/config にS3パスを追加する

[default]
region = ap-northeast-1
output = json

[profile production]
role_arn = arn:aws:iam::123456789012:role/ProductionAccessRole
+ sparkui_log_dir = s3a://aws-glue-production-spark-event-logs/
source_profile = default

3. スクリプトを実行

実行権限を与える

chmod + x run_sparkui.sh

第一引数にスイッチロール先のプロファイル名を指定して、実行する

./run_sparkui.sh production

4. SparkUIにアクセス

http://localhost:18080

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/spark-ui1.pnghttps://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/spark-ui1.pngdocs.aws.amazon.com

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/spark-ui1.pnghttps://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/spark-ui1.pngdocs.aws.amazon.com

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/spark-ui3.pnghttps://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/spark-ui3.pngdocs.aws.amazon.com