Google CloudのプレビューになったBatchを試す

Google Cloudの新サービスのBatchをコンソールとgcloudコマンドから実行する。
2022.07.14

この記事は公開されてから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_INDEXBATCH_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されることを期待しています!

関連情報/参考にさせていただいたページ