Amazon Web Services ブログ

Apache Spark UIからGlueのジョブ結果を確認する

(アップデート)2019年11月26日、Dockerでのローカルアクセスに関する内容を追加しました。

2019年9月、Glueのジョブ結果を監視・トラブルシューティングできるApache Spark UI(以下、Spark UI)が利用できるようになりました。Spark UIは、Glue ETL ジョブ実行のさまざまなステージを表す Directed Acyclic Graph (DAG(有向非循環グラフ)) をウェブインターフェイスによって可視化することができます。また、Spark SQL クエリプランを分析し、実行中や終了した Spark executor のイベントタイムラインを確認します。Spark UIはGlue ETL ジョブおよび Glue 開発エンドポイントの両方で利用可能です。

Spark UIを利用することで、イベントタイムラインによるジョブのパフォーマンスボトルネックの特定やデバッグを行うことができます。
本ブログでは、Glueのデータカタログ登録・ジョブ実行からSparkの履歴サーバーを起動、Spark UIでの確認までをご紹介します。

チュートリアル

手順

0.データのダウンロード

サンプルデータのダウンロードを行います。(サンプルデータのURL内にある2019年6月の“Green Taxi Trip Records(CSV)”を利用します。)

1.データカタログの登録

1-1.AWSマネジメントコンソールにログインして、サービス一覧から“S3”を選択します。

1-2.[バケットを作成する]ボタンをクリックし、“バケット名”に任意の名前(※世界で一意)を入力、リージョンが“アジアパシフィック(東京)”になっていることを確認し、[作成]ボタンをクリックします。

  • バケット名:任意の名前(※世界で一意)
  • リージョン:“アジアパシフィック(東京)”

1-3.バケットが作成されたら、“フォルダ作成”のボタンをクリックします。

その後、“datasource”、“script”、“tmp”、“eventlog”、“output”という名前でそれぞれフォルダを作成します。

1-4.“datasource”フォルダに手順“0”でダウンロードしたCSVファイルをアップロードします。

1-5.サービス一覧から“Glue”を選択します。

1-6.左の一覧から“クローラー”を選択し、“クローラーの追加”を選択します。

1-7.“クローラに関する情報の追加”にて、クローラの名前に任意の値を入れて、“次へ”をクリックします。

1-8.“Specify crawler source type”にて、クローラーのソースタイプを“Data stores”に指定し、“次へ”をクリックします。

1-9.下記を設定し、“次へ”をクリックします。

  • データストアの選択:S3
  • クロールする場所:自分のアカウントで指定されたパス
  • インクルードパス:s3://[YOUR BUCKET NAME]/datasource (手順1-3で作成した“datasource”フォルダのS3パス)

1-10.“別のデータストアの追加”は“いいえ”を選択します。

1-11.“IAMロールの選択”にて、“IAMロールを作成する”を選択し、ロール名に任意の値を入力、“次へ”をクリックします。

1-12.“頻度”を“オンデマンドで実行”を選択し、“次へ”をクリックします。

1-13.“データベースの追加”をクリックし、データベース名に“green-tripdata”と入力し、“次へ”をクリックします。

1-14.入力内容を確認したら、“完了”をクリックし、クローラーを“今すぐ実行”します。

2.ジョブの実行

2-1.サービス一覧から“IAM”を選択します。

2-2.1-11で作成したIAMロールを選択し、Attach Policiesにて、”AmazonS3FullAccess”を追加で権限付与します。

2-3.サービス一覧から“Glue”を選択し、左の一覧から“ジョブ”を選択し、“ジョブの追加”を選択します。

2-4.下記を入力し、“次へ”をクリックします。(下記にかかれていないものは何も入力しない、またはデフォルト値)

  • 名前:任意の名前
  • IAMロール:手順1-11で作成したIAMロール (手順2-2で追加権限付与したIAMロール)
  • Glue Version:Spark2.4, Python 3(Glue Version 1.0)
  • このジョブ実行:AWS Glueが生成する提案されたスクリプト
  • スクリプトが保存されているS3パス:s3://[YOUR BUCKET NAME]/script (手順1-3で作成した“script”フォルダのS3パス)
  • 一時ディレクトリ:s3://[YOUR BUCKET NAME]/tmp (手順1-3で作成した“tmp”フォルダのS3パス)
  • モニタリングオプション(下記のチェックボックスにチェック)
    • ジョブメトリクス
    • Continuous logging:Standard filter
    • Spark UI:s3://[YOUR BUCKET NAME]/eventlog (手順1-3で作成した“eventlog”フォルダのS3パス)

2-5.データソース の選択にて、手順1-14で作成したデータソース を指定し、“次へ”をクリックします。

2-6.変換タイプはデフォルト値のまま、“次へ”をクリックします。

2-7.データターゲットの選択にて、“データターゲットでテーブルを作成する”を選択、下記入力を行い、“次へ”をクリックします。

  • データストア:Amazon S3
  • 形式:Parquet
  • ターゲットパス:s3://[YOUR BUCKET NAME]/output (手順1-3で作成した“output”フォルダのS3パス)

2-8.マッピングはデフォルト値のまま、“ジョブを保存してスクリプトを編集する”をクリックします。

2-9.何も変更することなく、“ジョブの実行”をクリックします。

2-10.ジョブの成功とS3に“output”フォルダにparquetのファイル、“eventlog”フォルダにファイルができていることを確認します。

3.Spark 履歴サーバーの起動

3-1.下記URLにアクセスし、対象リージョンのCloudFormationの“Launch Stack”を選択します。※このブログではAsia Pacific(Tokyo)を選択します。ViewからYAMLファイルをダウンロードしても問題ありません。

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/monitor-spark-ui-history.html

3-2.URLで作成した場合、CloudFormationの画面が表示されますが、“次へ”を選択します。

3-3.下記を入力し、“次へ”を選択します。入力項目の詳細は上記のURLにも記述されています。

  • スタック名:任意の値
  • Spark UI Configuration:0.0.0.0/0
  • HistoryServerPort:18080(デフォルト値)
  • EventLogDir:s3a://[YOUR BUCKET NAME]/eventlog (手順2-8で作成されたEventlogのS3パス)
  • SparkPackageLocation:デフォルト値
  • KeystorePath:None(何も入力しない)
  • KeystorePassword:任意の値
  • InstanceType:t3.small (デフォルト値)
  • LastAmiId:デフォルト値
  • VpcId:任意のVPC ※今回は自分で作成したVPCを利用します
  • SubnetId:上記VpcIdが所属するSubnet。

※今回はパブリックサブネットに配置し、Spark履歴サーバーにパブリックアクセスします。また、Subnetの設定にて、Auto-assign public IPv4 addressが有効でないと、CloudFormationのOutputsでPublic DNSが付与されないので、注意してください。

3-4.CloudFormationがIAMを作成することを許可するにチェックを入れ、CloudFormationを実行します。

4.Spark 履歴サーバーのログイン

4-1.CloudFormationのアウトプットに記述されたSparkUiPublicUrlに書かれているURLにアクセスします。
※URLにアクセスした際、警告が出た場合はそのまま実行します。

4-2.Spark UIが起動されるので、いろいろアクセスしてみます。

以上で終了です。

Dockerを使用して、ローカル環境からSpark UIを表示する

EC2インスタンスを起動せず、ローカルの環境からDockerを起動し、Spark UIを表示することができます。

前提条件

Docker for MacなどラップトップにDockerをインストールする方法は、Docker Engine Communityをご確認ください。

1.Dockerコマンド実行に必要な情報をメモ

Dockerをrunする際に必要な下記の情報をテキストエディタなどにメモしておきます。

  • Amazon S3にて、Spark UIを表示するためのs3a eventlogのパス(例:s3a://path_to_eventlog)
  • 必要な権限を付与したAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY

2.Githubからローカル表示に必要なファイルをダウンロード

Githubにアクセスし、サンプルコードからDockerfileとpom.xmlファイルをダウンロードします。

3.ローカルのコマンドラインツールからコマンドを実行

下記コマンドの“s3a://path_to_eventlog”、“AWS_ACCESS_KEY_ID”、”AWS_SECRET_ACCESS_KEY”は、手順1でメモした内容をそれぞれ記述します。

$ docker build -t glue/sparkui:latest . 
$ 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" -p 18080:18080 glue/sparkui:latest "/opt/spark/bin/spark-class org.apache.spark.deploy.history.HistoryServer"

4.ブラウザで http://localhost:18080 にアクセスし、Spark UIが表示されるか確認

以上で終了です。

まとめ

Glueのジョブ実行からのSpark UIの手順を紹介しました。Spark UIが使えることになったことにより、ジョブの内容を細かいレベルで見れるようになりました。日々の運用に利用することができますので、ぜひご利用ください。

 

著者について

倉光 怜(Satoshi Kuramitsu)はAWSのソリューションアーキテクトです。好きなAWSサービスはAWS Glue、Amazon Kinesis、Amazon S3です。