SparkのWeb UIでJobのStageとExecutorによるTask分散、SQLのplanを確認する

sparkaws

SparkのWeb UIはJobやExecutorをモニタリングするためのツール。

aws-glue-samplesから maven:3.6-amazoncorretto-8 ベースでSparkを動かすDockerfileを持ってきて、 History Server起動する。Glueで出力されたEventLogのパスと認証情報を渡している。

EventLogの出力設定

$ git clone https://github.com/aws-samples/aws-glue-samples.git
$ cd aws-glue-samples/utilities/Spark_UI/glue-3_0/
$ docker build -t glue/sparkui:latest .
$ 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" 
-p 18080:18080 glue/sparkui:latest "/opt/spark/bin/spark-class org.apache.spark.deploy.history.HistoryServer"

これで http://localhost:18080 にアクセスしApplicationを選択するとJob実行やExecutor追加のタイムラインが表示される。

Job実行やExecutor起動のタイムライン

各Jobをクリックすると次のようにStageとDAG(Directed Acyclic Graph)が表示される。 WholeStageCodeGenは高速化のため処理ごとではなくStage単位でCode Generationする処理。 ただ生成されるコードが大きいとJVMがJITコンパイルしなくなるのでかえって遅くなることもあるそうだ。

Stageはコストが大きいシャッフルを必要としない実行単位なので少ない方が良い。 Joinのためにかさんでいるのであれば、パラメータを調整するなどしてシャッフルしないBroadcast Hash Joinにできないか検討する。

Apache SparkのRDD, DataFrame, DataSetとAction, Transformation - sambaiz-net

StageごとのDAG

さらにStageをクリックすると各ExecutorごとのTaskのタイムラインが表示される。 ほとんどの時間をComputing Timeに割けていて、Taskの実行時間やExecutorへのInput Recordsの統計も概ね均一で、うまく分散できているように見える。

Executorが実行しているTaskのタイムライン

SQLのタブを見るとOptimizerによって最適化されたクエリのLogical planや、 実際に実行されるPhysical plan、そのどこにどれくらい時間がかかっているかを確認できる。

SQLのPhysical plan

参考

Apache Sparkコミッターが教える、Spark SQLの詳しい仕組みとパフォーマンスチューニング Part2 - ログミーTech