- 藤田春佳
- 約 2,900 文字
- 8,400 View
目次
はじめに
こんにちは。TIGの藤田です。
Python連載 の8日目として、PySparkを使用したGlueジョブ開発のお話をします。
ETLツールとして使用されるAWS Glueですが、業務バッチで行うような複雑な処理も実行できます。また、処理はGlueジョブとして、Apache Spark分散・並列処理のジョブフローに簡単に乗せることができます!
特に複雑な処理は、やや割高な開発エンドポイントは使用せず、ローカル端末で、しっかり開発・テストを行いたいですよね。そのためのローカル開発Tipsをご紹介します。
内容
Glueジョブの開発と実行概要
ローカル開発の前に、AWS Glueでのジョブ実行方法を簡単にお話します。複雑な処理をSparkジョブで実行するには、以下4ステップでOKです。
1)ジョブズクリプトを作成、S3に配置
2)ジョブ実行定義
3)「ワークフロー」によるジョブフロー定義
4)AWS Athenaを使った実行結果確認。
3)のジョブフロー定義については、規模や構成によって他の方法を検討する余地が大きいですが、Glueの「ワークフロー」でも、以下のような機能は用意されています。
・画面GUIでのジョブフロー定義
・ジョブの並列実行、分岐、待合せ
・オンディマンド、スケジュール、EventBridgeイベントによるトリガ実行
・画面からの実行状態、結果、エラー確認、リトライ実行。
4)について、Athenaは、標準的なSQLを使用してS3のデータを直接分析できるサービスです。Athenaのクエリ実行には、AWS Glueデータカタログ(DatabaseやTable)の登録が必要ですが、これはAthenaのクエリエディタにDDLを実行すると簡単に行えます(Glueのデータカタログ定義はTerraform等でも行えるので運用上は他の方法でもよいと思います)。
Tip1: ローカル環境構築
AWS公式にGlueコンテナが配布されて、docker-composeによる環境構築が容易になりました。ローカル環境構築の詳細は、AWS Glueの開発環境の構築(2021)を参照ください。
Tip2: PySpark, SparkSQL開発
Glueでは、3つのジョブタイプ、Python shell, Spark streaming, Spark script (Python, Scala)が選択できますが、今回はSpark script(PySpark, SparkSQL)を採用しました。PySparkは、Apache SparkをPythonで呼出すライブラリです。SparkSQLは、Apache Sparkのモジュールの1つで、SQLとDataFrameによる構造化データの処理を可能にします。
複雑な業務処理の実装にも以下のメリットがありました。
- 構造化データ(Table)をメモリ上のDataFrameに取込み効率的に加工できる。
- データカタログ(Table定義)があれば、プログラム上データ取込用のモデル定義を別につくる必要がない。
- SparkSQLにより、複数ファイル(Table)の結合を含む、標準的なSQLによる操作が可能。
- SQL関数に含まれないPythonの関数やライブラリを使いたい場合にも、ユーザー定義関数 (UDF)を使えば、DataFrameの構造を維持したまま、特定のカラムに対してのみ処理を実行できる。
以下、2ファイル(2 Tables)を結合してユーザー定義関数処理をするスクリプト例です。
import sys |
Tip3: 単体テスト(pytest)
ローカル環境での、PySparkスクリプトの単体テストはpytestで可能です。方法はAWS Glueの単体テスト環境の構築手順を参照ください。実行結果のアサーションをファイル単位で行う場合は、DataFrameを比較できるツール(chispaなど)を利用すると便利です。
Tip4: データカタログどうする問題
データカタログは、データのファイルシステムをDatabaseとTableのように定義して管理するHiveメタストア同様の機能を担っています。
データカタログは、上記Glueコンテナのデフォルト設定では呼出すことができず、CSVファイルを読込む際にデータ型定義ができない課題がありました。
CSVファイルをDataFrameに読込む際に、schema定義をかいてやることはできますが、ローカル環境でしか使わないコードを、対象データのカラムすべてに対して書くのは嬉しくありません。AWS環境のGlueデータカタログの定義と二重管理にもなります。そこで、2パターンの解決策をご紹介します。
- Tip4-1. AWS環境に接続してGlueデータカタログを使用する
- Tip4-2. CSVではなく、Parquetファイルを使う
Tip4-1. AWS環境に接続してGlueデータカタログを使用する
AWSアカウントの使える状態であれば、AWS環境のS3からGlueデータカタログを使用してファイルを読込むのが楽です。ローカル環境のGlueコンテナ内から、以下のようなコードが実行できます。
from pyspark.context import SparkContext |
このスクリプト実行のためには、DatabaseとTable定義を予めGlueデータカタログに登録しておく必要があります。Athenaから登録するには以下のようなDDLを使用します。読込みファイルがCSVの場合です。
CREATE DATABASE sampledb |
おまけですが、出力結果をAthenaから確認するためには、出力ディレクトリのTable定義を登録します。今回出力ファイルはParquetなので、DDLは以下のようになります。
CREATE EXTERNAL TABLE IF NOT EXISTS sampledb.departuredelays_out ( |
Tip4-2. CSVではなく、Parquetファイルを使う
AWS環境の使えない状態でも、ファイルをParquetフォーマットで作成できれば、型の保存された状態で読込ができます。Parquetは、CSVよりも保存性や読書き性能の面で有利です(Apache Parquetについて)。
Parquetファイルは直接開いて中が確認できないですが、上記のようにAthenaで確認できますし、ローカル環境でも、Jupyter Notebook上でDataFrameに読込んでschema表示・データ表示できます。
まとめ
AWS Glueで複雑な処理を開発するときのTipsをご紹介しました。複雑なロジック開発とテストにAWS Glue環境を用いるのは費用面で不利なので、ぜひローカル環境を活用したいところです。特にファイルI/Oについては、ローカル環境とAWS環境で同じコードで処理できるようにするのがポイントだと思います。Glueジョブ開発の一助になれば幸いです。
参考
- AWS Glue Data CatalogでCSVを扱う - フューチャー技術ブログ
- AWS環境で、Glueデータカタログを使ってCSVファイルを扱う方法が紹介されています。