こんにちは。
GMO NIKKOのT.Cです。
今回は、Dataflowで、特定のゾーンにあるリソースが一時的な不足(= ZONE_RESOURCE_POOL_EXHAUSTED)により、間欠的にJobが失敗した内容について話したいと思います。
※ 本ブログで発信される情報は、個人の見解でドキュメントで直接言及されてない内容も含まれているため、実際とは異なる可能性もあるので、参考までにしてください
1日何回も、Cloud FunctionでDataflow(batch・dataflow shuffle)を動かしてGCSにあるログを処理していますが、ゾーンのリソース不足により、Jobが失敗する現象が数日にわたって間欠的に発生していました。
Startup of the worker pool in zone us-central1-a failed to bring up any of the desired x workers…(略)
ZONE_RESOURCE_POOL_EXHAUSTED_WITH_DETAILS: Instance ‘xxx’ creation failed: The zone ‘projects/xxx/zones/us-central1-b’ does not have enough resources available to fulfill the request. ‘(resource type:compute)
エラーの内容をみると、ゾーンのリソース不足でワーカーのプールのスタートアップに失敗していることがわかります。この問題は一時的に発生することで、待機してJobを再作成などの方法があり、ログは以下の箇所で確認できます。
- Cloud Logging
- Dataflow Console(Dataflow -> Job -> 特定Job選択 -> Jobログ)
- Dataflow API(projects.jobs.messages.list)
以下は成功と失敗したJobのログとなります。
- 成功したJobのログ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
{ "jobMessages": [ ..(略) { ..(略) // パイプラインを処理するためのワーカープールのセットアップ開始 "messageText": "Starting worker pool setup.", "messageImportance": "JOB_MESSAGE_DEBUG" }, { ..(略) "messageText": "Starting x workers in us-central1...", "messageImportance": "JOB_MESSAGE_BASIC" }, ..(略) { ..(略) // 全てのワーカーのスタートアッププロセスが完了(リソースの割り当てOK) "messageText": "All workers have finished the startup processes and began to receive work requests.", "messageImportance": "JOB_MESSAGE_BASIC" }, ..(略) { ..(略) "messageText": "Tearing down pending resources...", "messageImportance": "JOB_MESSAGE_DEBUG" } ], "autoscalingEvents": [ { "targetNumWorkers": "x", "eventType": "TARGET_NUM_WORKERS_CHANGED", "description": { "messageText": "Starting a pool of x workers.", "messageKey": "POOL_STARTUP_INITIATED", ..(略) }, ..(略) }, ..(略) { "currentNumWorkers": "x", "eventType": "CURRENT_NUM_WORKERS_CHANGED", "description": { // ワーカープールのスタートアップ完了(POOL_STARTUP_COMPLETED) "messageText": "Worker pool started.", "messageKey": "POOL_STARTUP_COMPLETED" }, ..(略) }, ..(略) { "currentNumWorkers": "x", "eventType": "CURRENT_NUM_WORKERS_CHANGED", "description": { // auto scalingの場合 "messageText": "Autoscaling: Raised the number of workers to x based on the rate of progress in the currently running stage(s).", "messageKey": "THROUGHPUT_BASED_STAGES_UP", ..(略) }, ..(略) }, ..(略) { "eventType": "CURRENT_NUM_WORKERS_CHANGED", "description": { "messageText": "Worker pool stopped.", "messageKey": "POOL_SHUTDOWN_COMPLETED" }, ..(略) } ] } |
- ZONE_RESOURCE_POOL_EXHAUSTEDで失敗したJob
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
{ "jobMessages": [ ..(略) { ..(略) // パイプラインを処理するためのワーカープールのセットアップ開始 "messageText": "Starting worker pool setup.", "messageImportance": "JOB_MESSAGE_DEBUG" }, { ..(略) "messageText": "Starting x workers in us-central1...", "messageImportance": "JOB_MESSAGE_BASIC" }, ..(略) { ..(略) // ゾーンリソースの不足により、ワーカープールのスタートアップに失敗 "messageText": "Startup of the worker pool in zone us-central1-a failed to bring up any of the desired x workers..(略)ZONE_RESOURCE_POOL_EXHAUSTED_WITH_DETAILS: Instance 'xxx' creation failed: The zone 'projects/xxx/zones/us-central1-b' does not have enough resources available to fulfill the request. '(resource type:compute)'.", "messageImportance": "JOB_MESSAGE_ERROR" }, { ..(略) "messageText": "Workflow failed.", "messageImportance": "JOB_MESSAGE_ERROR" }, ..(略) { ..(略) "messageText": "Tearing down pending resources...", "messageImportance": "JOB_MESSAGE_DEBUG" } ], "autoscalingEvents": [ { "targetNumWorkers": "x", "eventType": "TARGET_NUM_WORKERS_CHANGED", "description": { "messageText": "Starting a pool of x workers.", "messageKey": "POOL_STARTUP_INITIATED", "parameters": [ { "key": "num_workers", "value": x } ] }, ..(略) }, // POOL_STARTUP_COMPLETED(X) ..(略) { "eventType": "CURRENT_NUM_WORKERS_CHANGED", "description": { "messageText": "Stopping worker pool.", "messageKey": "POOL_SHUTDOWN_INITIATED" }, ..(略) } ] } |
Jobを調べた結果、今回発生したリソース不足のエラーは、全て上記と同じようにパイプラインを処理するために、最初にワーカープールを用意するところで発生(POOL_STARTUP_COMPLETEDの前)していました。
普段、Jobの失敗時にはエラー内容を確認して必要に応じて整備、Jobを再作成することで運用していて今回もゾーンに関してはDataflowで管理してくれるため、同じくJobを再作成することで対応していましたが、数日にわたって間欠的にエラーが発生して人的リソースも消費したため、まずは最初ワーカープールを用意する時にリソース不足が発生した場合のみ自動でJobを再作成することにしました。
実際には、この問題の対応中にリソース不足問題が解決されて間欠的にJobが失敗しなくなりましたが、今後再発することを考えてリソースの不足でJobがFailedしたのを検知できるまで行っておき、再発した際に自動でJobを再作成する処理を入れてみる予定です。
参考資料
GCP Document: Regional Placement, ZONE_RESOURCE_POOL_EXHAUSTED
Dataflow API: List Job Message Response