[AWS Glue] ETL Job(PySpark)で標準出力されたデータを確認したい

2023.05.24

こんにちは、CX事業本部 Delivery部の若槻です。

大量データの結合処理を実装するために AWS Glue を久し振りに触っているのですが、ETL Job(PySpark)の実行は時間が掛かるため、実装中などに作成したスクリプトで期待通りにデータフレームを処理をできているかの確認には手間が掛かります。また最終出力だけではなく、処理途中のデータフレームをデバッグ出力したい場合も出てきます。

そこで今回は、AWS Glue Job(PySpark)で標準出力されたデータを確認する方法を確認してみました。

確認してみた

標準出力を確認する

次のようなスクリプトを用意しました。show() によるデータフレームの出力と、print() によるデータの出力をしています。

job.py

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session

df = spark.createDataFrame(
  [
    ('7d4215d0-ab05-4372-9681-b41f925e3458', 0, 1608976046746),
    ('e36b7dfa-5327-4e33-a6cf-a34d6ce2027d', 1, 1608976059078),
    ('3ff9c44a-2a66-49df-bb70-0df07a749a61', 1, 1608976150001)
  ],
  ['device_id', 'state', 'timestamp']
)
df.show() # データフレームを出力
print(1234567890) # データを出力

job = Job(glueContext)
job.init(args['JOB_NAME'], args)
job.commit()

スクリプトを設定したらジョブを実行します。

View details を開きます。

Run details > Cloudwatch logsOutput logs を開きます。

すると Run ID でフィルターされた状態で、CloudWatch Logs の /aws-glue/jobs/output というロググループが開きます。ここで開くべきはサフィックスの付いていないログストリームです。

ログイベントで出力された内容が確認できました。

その他のログ

せっかくなので、その他のログについても確認してみます。

Continuous logging

Continuous logging では、ジョブ実行のドライバーログ、エグゼキュターログ、および Apache Spark ジョブの進行状況バー(プログレスバー)をリアルタイムで表示できます。

ここで、「ドライバー」はスケジューリング側、「エグゼキューター」はタスク実行側の要素となります。ドライバーは Spark アプリケーションの main() 関数を実行し、SparkContext を作成するプロセスです。SparkContext は各ワーカーノード上に起動したエグゼキューターにタスクを送信して実行させます。 Cluster Mode Overview より

Continuous logging の実体は CloudWatch Logs の /aws-glue/jobs/logs-v2 に格納されています。All logs または Driver and executor log streams から開くことができます。

イベントログよりドライバーログ、エグゼキュターログ、およびプログレスバーログを確認できます。

また Continuous logging については DevelelopersIO の記事だとこちらにも詳しいので合わせてご覧ください。

エラーログ

次にエラーログを確認してみます。スクリプトで次の処理を記述してエラーが raise されジョブ実行が失敗するようにします。

raise ValueError("error!")

ジョブを実行すると失敗し、Run details には raise された例外クラスとメッセージが表示されています。また Cloudwatch logs から Error logs を開きます。

すると Run ID でフィルターされた状態で、CloudWatch Logs の /aws-glue/jobs/error というロググループが開きます。ログストリームが1つ記録されているので開きます。

イベントログよりエラースタックが確認できました。

おわりに

AWS Glue Job(PySpark)で標準出力されたデータを確認する方法を確認してみました。

今回実際の AWS Glue 上でデバッグをする体で確認してみましたが、スクリプトのロジックの確認だけなら Jupyter Notebook を使用したり、また Glue Job をローカルテストしたりする方法もあるにはあります。うまく使い分けをしましょう。

参考

以上