GCP DataProcのスペックを自由、楽に変更しながら運営

GMOアドマーケティングのT.Cです。

DataProcのCloudクライアントライブラリ、GCEやApp EngineのCron serviceなどを利用して定期的にDataProcでデータを加工・分析する場合、データサイズ・処理量・費用などの理由でバッチごとに適切なDataProcのスペック、バッチのオプションを指定しておく必要があります。

しかし、1日ごとにデータを加工・保存していたバッチが何かしらの理由で失敗して、3日ぐらい放置されたと仮定しましょう。1日分のデータを処理する目的で指定したDataProcのスペックでは3日分のデータの処理は難しいでしょう。

復旧のためには、指定しておいたDataProcのスペック、バッチのオプションを一時的に変更し、再実行するなどの手間が発生します。

そこで、今回はCurlを利用してDataProcのスペックやバッチのオプションを自由、楽に更新しながらjobを実行する方法をご紹介いたします。

構成

DataProcのCloudクライアントライブラリを利用し、DataProcで定期的にデータを処理する方法は多いと思われますが、今回の説明に使う構成は以下の通りです。

  1. AppEngineのCron SerivceでApp Engineの方に定期的にDataProcの処理を命令します。
  2. AppEngineは命令されたJobに該当するDataProcのスペック・バッチのオプションをGCSから取得します。(AppEngine内部にDataProcのスペックなどを定義する方法もあると思いますが、新しいバッチの追加やDataProcのスペックを更新する場合にGAEをデプロイし直す必要があるので、GCSを利用します)
  3. GCSから取得した情報を元にDataProc用のクライアントライブラリでクラスターの生成とJobの実行を行います。

↑の構成にCurlでDataProcのスペックを自由、楽に変更するための仕組みを加えてみましょう。

  1. Curlで実行するjobを選択、更新するクラスター・バッチのオプションの情報も一緒にGAEに転送します。
  2. AppEngineは命令されたJobに該当するDataProcのスペック・バッチのオプションをGCSから取得します。
  3. Curlで送ったデータをGCSから取得したデータに上書きします。
  4. 上書きした情報を元にDataProc用のクライアントライブラリでクラスターの生成とJobの実行を行います。

詳細

・GCS: gs://dataproc_setting_test/cluster.json(バッチごとにDataProcの生成に必要な情報を記入)

GAE(framework: responder)

・main.py

・Config.py(GCPのproject_idやdataproc用のservice_account指定など)

・DataprocSetting.py(gs://dataproc_setting_test/cluster.jsonの情報をロード)

・cluster.py(cluster.jsonの情報を利用し、クラスターの生成・削除を行う)

・job.py(cluster.jsonにあるjobの情報を利用し、jobを実行)

cron service

・cron.yaml

ここまで、構築・実装を行うと普段は以下のようにCron serviceで定期的にGAEにバッチの実行を命令することになり、何か問題があればCurlを利用しDataProcのスペックやバッチのオプションを調整しながら実行させることが可能となります。

確認

・Cron service

・実行されるDataProcのスペック確認(cluster.jsonのcluster_nameと一致)

・クラスター構成(master: 1, slave:2)

・master情報(n1-standard-1でcluster.jsonと一致)

・slave情報(n1-standard-1でcluster.jsonと一致)

・Jobの実行履歴確認(cron serviceに登録されている通りに10分ごとに実行されている)

Curlで実行

・クラスター確認(slaveノード数が3にちゃんとなっております)

・バッチのオプションもcurltestに変えたのでjobのログを確認

これで通常は、cluster.jsonに指定したスペックで処理を行い、何か問題があった時はCurlでDataprocのスペックやバッチのオプションを自由、楽に変更しながら運営できるようになります。

終わりに

なるべく簡略して実装してCurlのことも例ではlocalで実行していますが、firewallを設定して特定環境のみ実行できるように制御した方がいいと思います。
時間があれば、試しに実装してみたり、応用してコマンド1つで複数のクラスターを立ち上げてみたりしてください!