Glue Docker Imageを利用したGlue Jobローカル開発をためしてみた
こんにちは、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でした。