GlueのPython Shell Jobでwheelファイルを参照してみた

GlueのPythonシェルがまた少し便利になりました
2019.10.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

概要

先日、GlueのPythonシェルジョブでwheelファイルを参照できるようになったので、早速試してみました。
blog

参考にしたのはこちらです。
(最終的にやっていることは全然違いますが...)
単純に手順だけを確認したい方はGitにも同じ内容について上げてあるので、こちらをご覧ください。

目次

1.やること

wheelファイルを使って「gensim」というPythonのパッケージを利用してみます。
あまり複雑な処理はせず、「GlueJobでwheelファイルを利用する」手順の流れを確認することが目的です。

具体的にはこちらの処理の一部分を実行し、その結果をS3に出力する、という処理をやってみました。  

2.やってみた

やっている内容についてはGitにも上げてあるので、こちらの内容について少しだけ言及します。

大まかな流れとしては下記の通りです。

  • 1.ローカルで「wheelファイル」、「GlueJobで実行するスクリプト」を作成
  • 2.上記2ファイルをS3にアップロード
  • 3.上記2ファイルを利用したGlueJobを作成

2-1.wheelファイルの作成

「setup.py」ファイルに諸々必要なことを記述した後に、下記のコマンドを実行すればwheelファイルは作成できます。
本当は「setup.py」、「setup.cfg」とかの綺麗な書き方まで整理してからやった方がいいのかとも思いましたが、今回は「GlueのPythonシェルJobでwheelファイルを参照する流れの確認」をメインとしたかったので、妥協してしまいました。

$ python3 setup.py bdist_wheel

「setup.py」の中身はこんな感じです。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from setuptools import setup, find_packages

# Package meta-data.
NAME = 'yoshim_test_wheel'
DESCRIPTION = 'for test'
REQUIRES_PYTHON = '~=3.6.0'
VERSION = '0.1.0'

# What packages are required for this module to be executed?
REQUIRED = [
    'gensim~=3.8.0',
]

setup(
    name=NAME,
    version=VERSION,
    description=DESCRIPTION,
    python_requires=REQUIRES_PYTHON,
    packages=find_packages(),
    install_requires=REQUIRED,
    include_package_data=True,
)

wheelファイル自体にパッケージが格納されているわけではないので、wheelファイル作成自体は時間もかかりません。
GlueJobを実行する際に、wheelファイルの内容に基づいて必要なライブラリがインストールされる形になります。

また、wheelファイルでは「PyPI」に登録されている全てのパッケージが使えるわけではない点にご注意ください。
例えばこちらを見ると、PyPIからよくダウンロードされているパッケージのうち一部は、まだ対応が間に合っていないことがわかります(公式サイトではないのであくまでも参考ですが)。

2-2.GlueJobで実行するスクリプトをローカルで作成

「src」フォルダ直下に格納したPythonスクリプトを呼び出し、処理結果をS3に出力するスクリプトを作成しました。

from src import my_func # wheelファイル内に存在する
import json
import boto3


# parameter
bucket_name = '<your-bucket>'
s3_dir = 'glue/blog_whl/output/my_output.json'

# 結果を取得
result = my_func.get_dictionary()

# S3に結果を保存する
s3 = boto3.resource('s3')
obj = s3.Object(bucket_name, s3_dir)
result = obj.put(Body=json.dumps(result))

2-3.上記2ファイルをS3にアップロード

「wheelファイル」と「GlueJobで実行するスクリプト」をS3にアップロードします。
GlueJobを作成する際には上記の2点がS3にアップロードされている必要があるためです。

$ aws s3 cp ./dist/yoshim_test_wheel-0.1.0-py3-none-any.whl \
s3://<your-bucket>/glue/blog_whl/whl_file/ \
--profile <your-profile>
$ aws s3 cp ./glue_script/glue_script.py \
s3://<your-bucket>/glue/blog_whl/script/ \
--profile <your-profile>

2-4.GlueJobの作成

上記の2ファイルを利用したGlueJobを作成します。
今回はPython3系で試しています。
このCLIの詳細についてはこちらをご参照ください。

$ aws glue create-job --name cm_yoshim_test \
--role <GlueJobに適応するIAMロールのARN> \
--command '{"Name" :  "pythonshell", "ScriptLocation" : "s3://<your-bucket>/glue/blog_whl/script/glue_script.py", "PythonVersion": "3"}' \
--default-arguments '{"--extra-py-files" : "s3://<your-bucket>/glue/blog_whl/whl_file/yoshim_test_wheel-0.1.0-py3-none-any.whl"}' \
--glue-version '1.0' \
--max-capacity 1 \
--profile <your-profile>

2-5.GlueJobの挙動確認

最後に、実際に上記のJOBを実行して求めているOutputがS3に出力されていることを確認します。

$ aws glue start-job-run \
--job-name cm_yoshim_test \
--profile <your-profile>

Jobが成功して、

ファイルが出力されており、

ファイルの内容も問題なさそうです!!!

まとめ

Glueでwheelファイルが使えると便利になるシーンも増える気がするので早速試してみたのですが、結構手軽にできてよかったです。
興味がある方の参考になれば幸いです。

参考