Treasure Data - Support Engineering Team blog

トレジャーデータのサポートエンジニアリングチームのブログです。

Custom Script開発準備

こんにちは。Arm Treasure Data サポートチームの大村です。今回は最近使用される方が増えてきたように感じるCustom Scriptの開発準備についてご紹介していきたいと思います。

Custom Scriptとは

Treasure Workflowから呼びだすことのできるpythonスクリプトです。このpythonスクリプトはDockerコンテナ上で動作し、Workflowの他のタスクから独立して実行されます。

このCustom Scriptは大変便利なもので以下のような用途で使うことを想定しています。

  • Treasure Dataでまだ用意できていない外部サービスとの連携
  • 複雑なデータ処理を伴うタスクの実行

その他にもpythonプログラムを動作させることでさまざまなことが実現可能となっています。

Custom Script開発で面倒な点

さて、こんな便利そうなCustom Scriptですが単純に開発を行おうとすると非常に面倒です。

一般にCustom Scriptを開発する際には以下のような流れで開発することになります。

  1. ローカルPCのお気に入りのエディタでdigファイルを作成する
  2. ローカルPCのお気に入りのエディタでpythonコードを作成する
  3. td側にtd-toolbeltを使用してアップロード
  4. td側で実行
  5. 1 or 2 に戻る

(TDコンソールでdigファイルおよびpythonプログラムを作成するというのはtoy exampleは別として現実的ではないので省いています。)

この1-4までの試行の待ち時間が非常に長いという点がCustom Scriptの開発を面倒にしています。

折角、pythonというちょっと書いて試すというのに向いているスクリプト言語を使用しているのに、この状況ではストレスが溜ってしまうことになります。

Custom Script開発を楽にするには

このストレスフルな状況を脱する方法は2つあります。 いずれもローカルPCにTreasure Data側と同一の実行環境を作って、pythonプログラム単体で実行確認を行うというものです。これによりアップロード&workflow実行というステップを飛ばすことが可能となります。

pythonプログラムの単体実行は単純にworkflowから呼び出していた関数をpythonスクリプト内で呼び出すだけですので問題ないとして、Treasure Data側と同一の実行環境を作成するやり方は2通りあります。

  1. Dockerを使用したローカル環境構築
  2. pipを使用したローカル環境構築

それぞれ、長所/短所があるので内容を確認しながら説明していきたいと思います。

1. Dockerを使用したローカル環境構築

手順としては2ステップのみです。Dockerをインストールして、TD Custom Scriptで使用可能なDocker Imageを指定して起動するだけとなります。 Dockerのインストールに関しましてはDockerのページを参照して頂くとして、TD Custom Scriptで使用可能なImage一覧は以下のものになります。(2021年5月18日時点)

なおdigdag-python:3.7は提供終了を予定しておりますのでdigdag-python:3.9をご利用ください。 移行手順についてはこちらのドキュメントをご参照ください。

Migration Guide for Rootless Docker Images - Product Documentation - Treasure Data Product Documentation

Dockerをインストールし、上記イメージを使用するだけでCustom Scriptの実行環境とほぼ同じものが使用可能となります。

長所としては上記の通り、"簡単に構築ができる"、"Custom Scriptの実行環境とほぼ同じものができる"という形になるでしょうか。 短所としてはDocker自体がそこそこ重いアプリケーションのため、"実行が重い"、ローカルPC環境<->Dockerでのファイルのやりとりに工夫がいるといったところでしょうか。 Docker上は別のOSが起動しているため、ホスト側のPCで作成したpythonスクリプトをDocker側に渡すやりかたは様々なものがありますので自分の開発スタイルにあったやり方を見つけるのがいいでしょう。

2. pipを使用したローカル環境構築

こちらは手順としては3stepとなるのですが、このまま実施してしまうと自分のpython環境がすべてTD Custom Scriptと同一の環境になってしまうのでvenv等と組み合わせるのが良いと思います。

  1. pythonのインストール
  2. pipのインストール
  3. pip+requirements.txtによる環境構築

    pip install -r requirements.txt

pythonのインストールやpipのインストールはWeb上にたくさんの情報がありますのでそちらに任せるとして、ポイントとなるのは3ステップ目となります。 Digdag-python:3.7のrequirements.txt(インストール済みのpythonパッケージ群)を使ってDigdag-python:3.7のDockerイメージと同様のpythonパッケージ環境を構築します。こちらですとDockerと違って普通にpython開発しているのと全くかわらない使用感になりますので、python開発になれている方は楽かもしれません。 短所としてはCustom Scriptの実際の実行環境と同一なのはpythonのパッケージ群だけということになります。OSなどが異なるという点は注意が必要になります。

Digdag-python:3.7のrequirements.txtを以下に載せておきます。

attrs==19.1.0
boto3==1.9.185
botocore==1.12.185
certifi==2019.6.16
chardet==3.0.4
Click==7.0
convertdate==2.1.3
cycler==0.10.0
Cython==0.29.12
decorator==4.4.0
docutils==0.14
ephem==3.7.6.0
fbprophet==0.5
holidays==0.9.10
idna==2.8
ipython-genutils==0.2.0
jmespath==0.9.4
joblib==0.13.2
jsonschema==3.0.1
jupyter-core==4.5.0
kiwisolver==1.1.0
lightgbm==2.2.3
lunardate==0.2.0
matplotlib==3.1.1
msgpack==0.6.1
nbformat==4.4.0
numpy==1.16.4
pandas==0.24.2
plotly==3.10.0
presto-python-client==0.7.0
py4j==0.10.7
pyarrow==0.14.0
pyparsing==2.4.0
pyrsistent==0.15.3
pyspark==2.4.3
pystan==2.19.0.0
pytd==0.5.0
python-dateutil==2.8.0
pytz==2019.1
requests==2.22.0
retrying==1.3.3
s3transfer==0.2.1
scikit-learn==0.21.2
scipy==1.3.0
seaborn==0.9.0
setuptools-git==1.2
six==1.12.0
td-client==0.13.0
td-pyspark==20.2.0
traitlets==4.3.2
urllib3==1.24.3

Digdag-python:3.9のrequirements.txtについても以下に載せておきます。

alembic==1.5.8
attrs==20.3.0
boto3==1.15.18
botocore==1.18.18
certifi==2020.12.5
chardet==4.0.0
click==7.1.2
cliff==3.5.0
cloudpickle==1.6.0
cmaes==0.8.2
cmd2==1.5.0
cmdstanpy==0.9.5
colorama==0.4.4
colorlog==4.8.0
convertdate==2.2.0
cycler==0.10.0
Cython==0.29.22
decorator==4.4.2
ephem==3.7.7.1
fbprophet==0.7.1
future==0.18.2
futures==3.1.1
greenlet==1.0.0
holidays==0.10.4
hyperopt==0.2.5
idna==2.10
iniconfig==1.1.1
jmespath==0.10.0
joblib==1.0.1
kiwisolver==1.3.1
korean-lunar-calendar==0.2.1
lightgbm==3.2.0
LunarCalendar==0.0.9
Mako==1.1.4
MarkupSafe==1.1.1
matplotlib==3.4.1
memory-profiler==0.58.0
msgpack==1.0.2
networkx==2.5.1
nltk==3.5
numpy==1.20.2
optuna==2.7.0
packaging==20.9
pandas==1.2.3
pbr==5.5.1
Pillow==8.2.0
plotly==4.14.3
pluggy==0.13.1
presto-python-client==0.7.0
prettytable==0.7.2
psutil==5.8.0
py==1.10.0
py4j==0.10.9
pyarrow==3.0.0
PyMeeus==0.5.11
pyparsing==2.4.7
pyperclip==1.8.2
pyspark==3.1.1
pystan==2.19.1.1
pytd==1.4.0
pytest==6.2.3
python-dateutil==2.8.1
python-editor==1.0.4
pytz==2019.3
PyYAML==5.4.1
regex==2021.4.4
requests==2.25.1
retrying==1.3.3
s3transfer==0.3.6
scikit-learn==0.24.1
scipy==1.6.2
seaborn==0.11.1
setuptools-git==1.2
simplejson==3.17.2
six==1.15.0
SQLAlchemy==1.4.5
stevedore==3.3.0
td-client==1.2.1
td-pyspark==21.3.0
td-pyspark-ea==20.12.0
threadpoolctl==2.1.0
toml==0.10.2
tqdm==4.60.0
urllib3==1.24.3
wcwidth==0.2.5

まとめ

Custom Scriptの実行環境とローカルの実行環境をあわせておくことにより、Custom Scriptの動作確認およびデバッグが非常に楽にできるようになります。 ローカルの実行環境でpython側の動作を確認した後、TD側でworkflowを含めた動作確認すると非常に効率の良い開発ができると思います。

ぜひお試しください。

Custom Scriptに関するドキュメント https://docs.treasuredata.com/display/public/PD/Introduction+to+Custom+Scripts