あまり注目を集めないGoogle Cloud Dataflowですが、簡単に実行環境をローカル/リモート切り替えできるのでかなり便利です。しかもスタンダードライブラリしか使えないと思っていたらpipのリストからインストールしたり、独自インストールもできるとのこと。
じゃあどのライブラリがプリインストールされているのか、Documentをざっと検索しても出てこないので調べてみました。
準備
まずはオプションの設定、この辺は@orfeonさんの丸パクリです・・
import apache_beam as beam
import apache_beam.transforms.window as window
options = beam.utils.pipeline_options.PipelineOptions()
google_cloud_options = options.view_as(beam.utils.pipeline_options.GoogleCloudOptions)
google_cloud_options.project = '{PROJECTID}'
google_cloud_options.job_name = 'test'
google_cloud_options.staging_location = 'gs://{BUCKET_NAME}/binaries'
google_cloud_options.temp_location = 'gs://{BUCKET_NAME}/temp'
worker_options = options.view_as(beam.utils.pipeline_options.WorkerOptions)
worker_options.max_num_workers = 1
# options.view_as(beam.utils.pipeline_options.StandardOptions).runner = 'DirectRunner'
options.view_as(beam.utils.pipeline_options.StandardOptions).runner = 'DataflowRunner'
p = beam.Pipeline(options=options)
pip freezeを実行してPythonパッケージリストをログ出力します。
def inspect_df(dat):
import subprocess
import logging
process = subprocess.Popen('pip freeze', shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
for line in process.stdout:
logging.info(line)
Dataflow上で実行します。hello worldは要らないかも・・
(p | 'init' >> beam.Create(['hello', 'world'])
| 'inspect' >> beam.Map(inspect_df))
p.run()
これでパイプラインの実行が完了すると、パッケージリストがログに出力されるので、Cloud Consoleで確認してみます。
ログ確認
DataflowのDocumentだと、DataflowのJob詳細画面からログを確認するとなっていますが、2017年3月4日現在だとStackdriver->Loggingの方に移っています。
こんな感じにログ出力されます。
パッケージ一覧
上記ログに吐かれたパッケージの一覧です。2017年3月4日現在
| Package | Version |
|---|---|
| avro | 1.8.1 |
| beautifulsoup4 | 4.5.1 |
| bs4 | 0.0.1 |
| crcmod | 1.7 |
| Cython | 0.25.2 |
| dataflow-worker | 0.5.5 |
| dill | 0.2.5 |
| enum34 | 1.1.6 |
| funcsigs | 1.0.2 |
| futures | 3.0.5 |
| google-api-python-client | 1.6.2 |
| google-apitools | 0.5.7 |
| google-cloud-dataflow | 0.5.5 |
| google-python-cloud-debugger | 1.9 |
| googledatastore | 6.4.1 |
| grpcio | 1.1.0 |
| guppy | 0.1.10 |
| httplib2 | 0.9.2 |
| mock | 2.0.0 |
| nltk | 3.2.1 |
| nose | 1.3.7 |
| numpy | 1.12.0 |
| oauth2client | 2.2.0 |
| pandas | 0.18.1 |
| pbr | 1.10.0 |
| Pillow | 3.4.1 |
| proto-google-datastore-v1 | 1.3.1 |
| protobuf | 3.0.0 |
| protorpc | 0.11.1 |
| pyasn1 | 0.2.2 |
| pyasn1-modules | 0.0.8 |
| python-dateutil | 2.6.0 |
| python-gflags | 3.0.6 |
| python-snappy | 0.5 |
| pytz | 2016.10 |
| PyYAML | 3.11 |
| requests | 2.10.0 |
| rsa | 3.4.2 |
| scikit-learn | 0.17.1 |
| scipy | 0.17.1 |
| six | 1.10.0 |
| tensorflow | 1.0.0 |
| tensorflow-transform | 0.1.4 |
| uritemplate | 3.0.0 |
tf.transformが来たからでしょうか?Cloud MLではTensorFlow verは0.12ですが (EDIT: 最新のVerはこちらで確認できます) Dataflowでは1.0.0ですね。scikit-learnはちょっと古いようです。
ややstagingは遅いものの、Jupyter Notebook上から簡単にローカル/リモート切り替えて、勝手にインスタンスの立ち上げから立ち下げまでフルマネージドで行ってくれるDataflowはデータ解析や機械学習などの用途でも強力なツールとなりそうです。