- 玉木竜二
- 約 2,400 文字
- 5,500 View
はじめに
昨年の記事1でもAWSの公式のDockerイメージを使って環境構築をする内容の記事があるのですが、Glue3.0の公式のDockerイメージがリリースされていたので、そちらを使って再度Glueのローカルでの開発環境構築の記事を書いてみようと思います。
せっかくなので昨年の記事と少しコードを変えようと思い、AWSの公式ドキュメント2に書かれたコードを基に解説します。公式ドキュメントとは、
- docker-compose
- LocalStack
を使用している点が異なるので、その点でも本記事は参考になると思います。
本記事で紹介するコードは以下のリポジトリに載せてあります。
https://github.com/RyujiTamaki/glue-dev-sample
ディレクトリ構成は以下のようになっています。
tree |
docker-compose.yml
本記事ではDockerFileを特に作らず、GlueとLocalStackのDockerイメージをそのまま使用します。
以下docker-compose.ymlになります。
version: '3.5' |
以前の記事1では jupyter_start.sh をDockerFileでコピーしていましたが、本記事では最初からDockerイメージにある jupyter_start.sh を実行しています。
また、Glue3.0の公式のDockerイメージにはバグがあり、暗号化を無効にすることで解決することが報告されています3。そのため spark.conf を用いて /home/glue_user/spark/conf/spark-defaults.confを上書きしています。
上書きに使用している spark.confは以下になります。元からある /home/glue_user/spark/conf/spark-defaults.conf の spark.io.encryption.enabled を falseに書き換えています。
spark.driver.extraClassPath /home/glue_user/spark/jars/*:/home/glue_user/aws-glue-libs/jars/* |
Glueジョブのサンプルコードとテストコード
AWSの公式ドキュメント2に書かれているサンプルコードを用います。
サンプルコードは以下です。
import sys |
S3に置かれたJSONファイルをDynamicFrameに読み込む処理をしています。
こちらのサンプルに対するテストコードが以下となります。
|
公式のドキュメントのコードとは以下の設定を加えている箇所が異なります。
sc = SparkSession.builder.getOrCreate() |
以前のAWS Glueの単体テスト環境の構築手順4でも紹介されている設定に加えて、change.detectionを無効にする設定もしています。これはサードパーティのS3実装に対してはS3の変更の検知がうまくできないためです5。ローカルでのテストにはLocalStackを用いるため、change.detectionを無効にしています。
動作確認
以下コマンドでDockerを起動します。
docker compose up --build |
Glue用のコンテナとLocalStack用のコンテナが立ち上がります。http://127.0.0.1:8888 にブラウザでアクセスすると、JupyterLabが起動していることが確認できます。
次にテストを実行してみましょう。
Dockerが起動していれば、以下コマンドでglue.devコンテナに入れます。
docker exec -it glue.dev bash |
/home/glue_user/workspace/jupyter_workspace にマウントしたファイルがあることが確認できます。
テストに使用するJSONファイル s3://awsglue-datasets/examples/us-legislators/all/persons.json をローカルにコピーします。
Dockerコンテナ内で以下コマンドを実行し、LocalStackのS3に格納します。
aws s3 mb s3://awsglue-datasets --endpoint-url http://glue.dev.s3.local:4566 |
jupyter_workspace配下で以下のコマンドを実行することにより、pytestが実行できます。
pytest tests/ |
以下実行結果です。
DeprecationWarning: Deprecated in 3.0.0. Use SparkSession.builder.getOrCreate() instead. |
上記Warningが出ていますが、テストがパスできたことを確認できました。
テスト実行中に http://127.0.0.1:4040/ にブラウザでアクセスすると、Spark UIを確認できます。
Jobの調査に便利です。ただ、自分が使ってみたところ少し不安定なところもありました。今後の改善に期待です。
以上で開発環境構築の紹介を終わります。以降はsrc/以下にGlueジョブのスクリプトを作成、tests/以下にGlueジョブのテストを追加、としていくといいと思います。
注意点
dockerを再起動すると以下のようなエラーが出ます。
glue.dev | PermissionError: [Errno 13] Permission denied: '/home/glue_user/.jupyter/migrated' |
根本解決になっていなくて恐縮ですが、一度 docker compose rm で停止済みのコンテナを削除すると次の docker compose upでは上記のエラーが出ずにJupyter Labが立ち上がるようになります。
まとめ
本記事では最新のGlue3.0のDockerイメージを使って、ローカルでの環境構築を紹介しました。
Sparkの設定を変える箇所がハマりどころだと思うので、参考になれば幸いです。
- 1.https://future-architect.github.io/articles/20210521a/ ↩
- 2.https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-libraries.html ↩
- 3.https://github.com/awslabs/aws-glue-libs/issues/128 ↩
- 4.https://future-architect.github.io/articles/20191206/ ↩
- 5.https://hadoop.apache.org/docs/r3.3.1/hadoop-aws/tools/hadoop-aws/index.html#Handling_Read-During-Overwrite ↩