Glue Docker Imageを利用したGlue Jobローカル開発をためしてみた

AWS Glue JobをローカルのDockerコンテナで実行してみたブログです。
2022.01.31

こんにちは、nkhrです。今回は、GlueのDocker Imageを利用してローカルでGlue jobを実行してみました。

Glue Jobの色々な開発方法

AWS Glue Jobを作成する方法は以下のように様々です。今回はローカルで、Glue実行用のDockerコンテナを立ち上げてみます。

コンソールからJobを直接編集

  • Glueコンソール>ETL/Job>Jobを選択して「Edit Script」により編集

AWS Glue Studioによる開発

  • Glue Studio>Job選択>「Script」タブより編集
    • 一度Scriptタブでコードを修正すると、Visual表示ができなくなる場合があるため、Visual(テンプレート)で開発を進めている場合は注意

Glue開発エンドポイント利用した開発

  • Glue開発エンドポイント+SageMaker Notebook

  • Glue開発エンドポイント+EC2(Apache Zeppelin Notebookインストール)

  • Glue開発エンドポイント+ローカルPC(Apache Zeppelin Notebookインストール)
  • Glue開発エンドポイント+ローカルIDE(PyCharm※他のIDEでもおそらく出来るはず)

ローカル開発(Glue開発エンドポイント利用なし)

  • Glue ETLライブラリ
    • 以下のブログではS3, DynamoDBをLocalStack(AWSエミュレートコンテナ)利用

  • Glue Dockerコンテナを利用 ←今回試す対象
    • S3は通常のAWSサービスを利用(LocalStackを使えばすべてローカル開発可能)
    • AWS公式ブログを参考に実施
    • 公式ブログの手順は、「Glue 1.0 Docker Image」で行っているため、今回検証する「Glue 3.0 Docker Image」と少し設定が異なります。

Glue Docker image検証環境

検証環境は以下の通りです。

対象 バージョン
OS Microsoft Windows Pro 10
PowerShell 7.1.4
Docker Desktop(会社規模によっては有料) 4.4.4 (73704)
Glue Docker Image tag glue_libs_3.0.0_image_01

Dockerコンテナを取得

Windowsコンテナを利用している場合は、Linuxコンテナにスイッチします。Dockerのアイコンを右クリックすると「Switch to Linux containers...」が表示されている場合はクリックする。「Switch to Windows containers...」と表示されている場合は、何もしなくてよいです。

DockerHubから、AWS Web Service提供イメージ「amazon/aws-glue-libs」を取得します。イメージは数GBの容量が必要なので、ローカルPCの容量と相談してください。

> docker pull amazon/aws-glue-libs:glue_libs_3.0.0_image_01
❯ docker image ls
REPOSITORY             TAG                        IMAGE ID       CREATED       SIZE
amazon/aws-glue-libs   glue_libs_3.0.0_image_01   7f0508fffbe4   5 weeks ago   6.27GB

Glue Dockerイメージを利用した開発

今回は以下の3パターンでGlueコンテナを利用してみます。コンテナ作成時に、ホスト側のフォルダ「~/docker-share」をコンテナと共有します。

  • Jupyter Notebook
    • NotebookのPortは8888
    • SparkUIのPortは4040
  • Zeppeline Notebook
    • NotebookのPortは8080
  • Visual Studio Code (IDE)

Jupyter Notebook開発

Jupyter Notebookの起動 (Container port: 8888)

起動コマンドは以下の通りです。実行後、ブラウザで「localhost:8888/」にアクセスするとJupyter Labの画面が表示できます。

> docker run -itd -p 8888:8888 -p 4040:4040 -v /c/Users/<username>/docker-share:/home/glue_user/share -e DISABLE_SSL="true" --name glue-j amazon/aws-glue-libs:glue_libs_3.0.0_image_01 /home/glue_user/jupyter/jupyter_start.sh

※<username>の部分は環境に合わせて修正してください。
  • -itdから「d」を除くとメッセージが標準出力に表示されます。(バックグラウンド実行をしない場合)
  • デフォルトは、DISABLE_SSL="false"のため、DISABLE_SSL="true"に変更しています。(Jupyter LabへはHTTP接続)

コンテナの操作

## コンテナ内にアクセス
> docker exec -it glue-j bash
[glue_user@500940af8c5b workspace]$ cd ..
[glue_user@500940af8c5b ~]$ ls
aws-glue-libs  jupyter  livy  share  spark  workspace  zeppelin

## コンテナの停止
> docker stop glue-j

## コンテナの起動
> docker start glue-j

## コンテナの削除
> docker stop glue-j
> docker rm glue-j
> docker ps -a

AWS KEY設定

> docker exec -it glue-j bash
[glue_user@ workspace]$ aws configure
AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]: ap-northeast-1
Default output format [None]: json

サンプルコードの実行

Glue DataCatalogへのアクセス

Spark SQLからData Catalogへの接続は、Lake Formation経由で実行されているようです。そのため、Lake Formationの設定をデフォルトから変更(IAMアクセス権限のみによるData Catalog利用を拒否)している場合、「Insufficient Lake Formation permission(s) on default」のようなエラーが発生することがあります。

Lake Formationの設定をデフォルトに戻すか、または、Lake Formationでカタログへの接続許可を行う必要があります。

エンドポイントが存在しない場合は、「default」という名前のデータベースが作成されます。以下は、Data Catalogに「test-db」という名前のデータベースを作成してアクセスした結果です。

Zeppeline Notebook開発

実行後、ブラウザで「localhost:8080/」にアクセスするとZeppeline Notebookの画面が表示されます。

> docker run -itd -p 8080:8080 -p 4040:4040 -v /c/Users/<username>/docker-share:/home/glue_user/share -e DISABLE_SSL="true" --name glue-z amazon/aws-glue-libs:glue_libs_3.0.0_image_01 /home/glue_user/zeppelin/bin/zeppelin.sh

(開発方法はJupyter Notebookと似ているため省略)

Visual Studio Code開発

Docker extensionのインストール

Visual Studio CodeのextensionでDockerをインストールし、GlueのDockerコンテナを利用します。

Dockerコンテナの作成

> docker run -itd -v /c/Users/<username>/docker-share:/home/glue_user/share -e DISABLE_SSL="true" --name glue-vs amazon/aws-glue-libs:glue_libs_3.0.0_image_01
> docker stop glue-vs

※起動コマンドは、Jupyter NotebookやZeppeline Notebook起動コマンドでもよい。

左メニューでDockerアイコンをクリックすると、全てのDockerコンテナが表示されます。作成したコンテナを右クリックし「Start」を選択するとDockerコンテナを起動しコンテナ内のファイルを確認できます。

起動したコンテナを右クリックすると「Attach Visual Studio Code」や「Attach Shell」が表示されます。-

  • 「Attach Visual Studio Code」をクリックするとコンテナ内の任意のフォルダをWorkspaceとして利用できます。
  • 「Attach Shell」をクリックするとコンテナにアクセスするTERMINALが開きます。「Attach Visual Studio Code」で開いたウィンドウで、メニュー「TERMINAL」から「New Terminal」をクリックすると、開発ウィンドウと実行ターミナルを1つのウィンドウで表示できます。

TERMINALで「glue-spark-submit .py [arguments]」を実行することでGlueジョブを実行できます。

[glue_user@e86a541dbe35 ~]$ glue-spark-submit share/test.py --JOB-NAME test

まとめ

今回は、ローカルでのGlue開発方法を試してみました。はじめはGlue Studioのテンプレートを活用して処理を作り、テンプレートから作られた処理(Script code)を読むことでも理解が含まるかなと思いました。

以上、nkhrでした。