Google CloudのプレビューになったBatchを試す
データアナリティクス事業本部、池田です。東京すごく暑いです。
本日、Google Cloudの新サービスとしてBatchがアナウンスされていましたので、動かしてみました。
【 Introducing Batch, a new managed service for scheduling batch jobs at any scale 】
なお、執筆時点(2022/07/14)では プレビュー となります。
用語
前述の公式のブログ記事より。
◆ Job
Jobs can be as simple as a single shell script or more complex multipart computations that can be run either in parallel or sequentially.
◆ Tasks
The computations that make up a job.
たぶん複数の同じ「タスク」を逐次or並列で実行するのが「ジョブ」ということだと理解しました。たぶん。
実行は Compute Engine の
マネージド インスタンス グループ(MIG) で行われるそうです。
コンソールから実行してみる
とりあえずさくっとコンソールから動かしてみます。
(この記事中の操作は全てプロジェクトの「オーナー」のロールを持つアカウントで行っています。)
Create a basic job の内容を参考に実施しています。
APIを有効化します。
BatchのJob list画面から作成を開始します。
ジョブの内容を設定します。↓前半部分。
ジョブの名前は、同じものが同じリージョン内にあるとエラーになりました。
↑では3並列で9個のタスクを処理する設定にしました。
スポットのVM が選べるのは有難いですね。
↓設定後半部分。
コンテナも設定できるようですが、今回は簡単なスクリプトにしました。
echo "########Task ${BATCH_TASK_INDEX} of ${BATCH_TASK_COUNT} START `date '+%Y-%m-%d %H:%M:%S'`########" sleep 10;echo '10 sec slept.' echo "########Task ${BATCH_TASK_INDEX} of ${BATCH_TASK_COUNT} END `date '+%Y-%m-%d %H:%M:%S'`########"
開始時刻出力→10秒スリープ→終了時刻出力、です。
BATCH_TASK_INDEX
と BATCH_TASK_COUNT
は事前に与えられている環境変数のようです。
作成すると↓のようにリストに追加されました。
(最初 Cloud Scheduler のように実行ボタンみたいなのがあるのかと探しましたが、)
作成するとキューに送られ、実行が始まるようです。
↓実行中のジョブの様子。
↓終了したジョブ。
ログを確認してみます。
STDOUT: ########Task 2 of 9 START 2022-07-14 09:52:37######## STDOUT: ########Task 1 of 9 START 2022-07-14 09:52:37######## STDOUT: ########Task 0 of 9 START 2022-07-14 09:52:37######## STDOUT: 10 sec slept. STDOUT: 10 sec slept. STDOUT: 10 sec slept. STDOUT: ########Task 2 of 9 END 2022-07-14 09:52:47######## STDOUT: ########Task 0 of 9 END 2022-07-14 09:52:47######## STDOUT: ########Task 1 of 9 END 2022-07-14 09:52:47######## STDOUT: ########Task 3 of 9 START 2022-07-14 09:53:37######## STDOUT: ########Task 4 of 9 START 2022-07-14 09:53:37######## STDOUT: ########Task 5 of 9 START 2022-07-14 09:53:37######## STDOUT: ########Task 6 of 9 START 2022-07-14 09:53:37######## STDOUT: 10 sec slept. STDOUT: 10 sec slept. STDOUT: 10 sec slept. STDOUT: 10 sec slept. STDOUT: ########Task 5 of 9 END 2022-07-14 09:53:47######## STDOUT: ########Task 3 of 9 END 2022-07-14 09:53:47######## STDOUT: ########Task 4 of 9 END 2022-07-14 09:53:47######## STDOUT: ########Task 6 of 9 END 2022-07-14 09:53:47######## STDOUT: ########Task 7 of 9 START 2022-07-14 09:53:47######## STDOUT: ########Task 8 of 9 START 2022-07-14 09:53:57######## STDOUT: 10 sec slept. STDOUT: ########Task 7 of 9 END 2022-07-14 09:53:57######## STDOUT: 10 sec slept. STDOUT: ########Task 8 of 9 END 2022-07-14 09:54:07########
ログの内容から設定した内容(?)でスクリプトが実行されているのが分かります。
(3並列→4並列→1並列→1並列で動いているように見える理由はよく分かりませんでした…)
何度か同じくらいの規模のジョブ作成しましたが、
私の場合は作成から最初のログが出力されるまでだいたい1分弱でした。
gloudコマンドで実行してみる
JSONファイルを作成して、 Cloud Shell からgcloudコマンド実行してみます。
Create a job that uses a Cloud Storage bucket の内容を参考に、 Cloud Storage のマウントを試してみます。
↓JSONファイルはこんな感じ。
{ "taskGroups": [ { "taskSpec": { "runnables": [ { "script": { "text": "echo \"Task ${BATCH_TASK_INDEX} of ${BATCH_TASK_COUNT} START `date '+%Y-%m-%d %H:%M:%S'`\";ls -la /mnt/share/;gsutil ls gs://<バケット名>" } } ], "volumes": [ { "gcs": { "remotePath": "<バケット名>" }, "mountPath": "/mnt/share" } ] }, "taskCount": 4, "parallelism": 2 } ], "logsPolicy": { "destination": "CLOUD_LOGGING" } }
コンソールの時と同じように、ログエクスプローラでログを見るためには、
logsPolicy
の部分の設定が必要でした。
実行するスクリプトはJSONファイルの text
部分に設定した↓の内容です。
echo "Task ${BATCH_TASK_INDEX} of ${BATCH_TASK_COUNT} START `date '+%Y-%m-%d %H:%M:%S'`" ls -la /mnt/share/ gsutil ls gs://<バケット名>
環境でgsutilコマンドが使えるのかついでに試してみました。
↓実行するgcloudコマンドがこちら。 ジョブの名前は「devio-<UNIXTIME>」にしています。
gcloud beta batch jobs submit devio-`date +%s` \ --location us-central1 \ --config job-gcloud.json
ジョブの作成が成功すると、コンソールからも確認できました。
マウントもgsutilも無事成功していました。
… STDOUT: 2022/07/14 11:58:44.223883 File system has been successfully mounted. STDOUT: Task 0 of 4 START 2022-07-14 11:59:03 STDOUT: total 1 -rwxrwxrwx 1 root root 0 Jul 14 10:46 sapmle1.txt -rwxrwxrwx 1 root root 1 Jul 14 10:46 sapmle2.txt STDOUT: Task 1 of 4 START 2022-07-14 11:59:04 STDOUT: total 1 -rwxrwxrwx 1 root root 0 Jul 14 10:46 sapmle1.txt -rwxrwxrwx 1 root root 1 Jul 14 10:46 sapmle2.txt STDOUT: gs://<バケット名>/sapmle1.txt gs://<バケット名>/sapmle2.txt STDOUT: gs://<バケット名>/sapmle1.txt gs://<バケット名>/sapmle2.txt STDOUT: Task 2 of 4 START 2022-07-14 12:00:03 STDOUT: total 1 -rwxrwxrwx 1 root root 0 Jul 14 10:46 sapmle1.txt -rwxrwxrwx 1 root root 1 Jul 14 10:46 sapmle2.txt STDOUT: Task 3 of 4 START 2022-07-14 12:00:04 STDOUT: total 1 -rwxrwxrwx 1 root root 0 Jul 14 10:46 sapmle1.txt -rwxrwxrwx 1 root root 1 Jul 14 10:46 sapmle2.txt STDOUT: gs://<バケット名>/sapmle1.txt gs://<バケット名>/sapmle2.txt STDOUT: gs://<バケット名>/sapmle1.txt gs://<バケット名>/sapmle2.txt
おわりに
いろいろ使いどころのありそうなサービスでした。
早くGAされることを期待しています!