この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
データアナリティクス事業本部、池田です。東京すごく暑いです。
本日、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ファイルはこんな感じ。
job-gcloud.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されることを期待しています!