Databricksクラスターの予期しない停止への対応方法

[Unexpected cluster termination \- Databricks](https://kb.databricks.com/clusters/termination-reasons.html) [2022/3/4時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

[手動による停止](https://qiita.com/taka_yayoi/items/991aae376c089df58504#%E6%89%8B%E5%8B%95%E5%81%9C%E6%AD%A2)や設定された[自動停止](https://qiita.com/taka_yayoi/items/991aae376c089df58504#%E8%87%AA%E5%8B%95%E5%81%9C%E6%AD%A2)によるものではなく、予期せずクラスターが停止されることがあります。さまざまな理由によってクラスターが停止されることがあります。ある停止処理はDatabricksによって行われ、他のものはクラウドプロバイダーによって行われます。本書では、停止の理由と対応ステップを説明します。

# Databricksによるリクエスト制限超過による停止

APIの濫用を防ぎ、サービスの品質を担保し、皆様が誤って大量のクラスターを作成することを防ぐために、Databricksではクラスターの作成、起動、リサイズを含む全てのクラスターのサイズを増加させるリクエストのスロットリングを行っています。スロットリングでは、特定サイズのリクエストのバーストを許容しつつも、皆様のDatabricksデプロイメントにおいて定義された間隔で皆様が起動できるノードの総数を制限するために[トークンバケットアルゴリズム](https://en.wikipedia.org/wiki/Token_bucket)を採用しています。ウェブUIとAPIの両方からのリクエストはレート制限の対象となります。クラスターのリクエストがレート制限を超えると、制限を超えたリクエストは`REQUEST_LIMIT_EXCEEDED`エラーで失敗します。

## 解決策

正当なワークフローにおいて制限に到達した場合は、以下のことを行うことを推奨しています。

- 数分後にリクエストをリトライします。
- 計画された時間フレームで繰り返されるワークフローを均等に分散します。例えば、1時間ごとに全ての[ジョブ](https://qiita.com/taka_yayoi/items/b3275a1983c51a8bbe1a)をスケジュールするのではなく、1時間で異なる間隔にジョブを分散します。
- クラスターをより大きな[ノードタイプ](https://qiita.com/taka_yayoi/items/8d951b660cd87c6c5f18#%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%8E%E3%83%BC%E3%83%89%E3%82%BF%E3%82%A4%E3%83%97)にし、ノード数を削減することを検討します。
- [オートスケーリング](https://qiita.com/taka_yayoi/items/8d951b660cd87c6c5f18#%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%AA%E3%83%BC%E3%83%88%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0)クラスターを使用します。

これらの選択肢がうまく行かない場合、コア数に対する制限増加をリクエストするためにDatabricksサポートにコンタクトしてください。

Databricksによる他の停止理由に関しては、[Termination Code](https://docs.databricks.com/dev-tools/api/latest/clusters.html#terminationcode)をご覧ください。

# クラウドプロバイダーによる停止

本セクションでは、クラウドプロバイダーに関連する停止理由と多王ステップを説明します。

## プロバイダーの制限(AWS)

Databricksでは、皆様のクラウドアカウントに代わってリソースをリクエストすることでクラスターを起動します。時には、これらのリクエストはお使いのクラウドプロバイダーのリソース制限を上回ることで失敗します。AWSにおいては、一般的なエラーには以下のようなものがあります。

### InstanceLimitExceeded

AWSではノードタイプごとに稼働できるインスタンスの数を制限しています。解決策には以下のようなものがあります。

- ノード数を減らしてクラスターを起動します。
- 別のノードタイプでクラスターを起動します。
- AWSのサポートに[インスタンス制限の増加](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html)をリクエストします。

### Client.VolumeLimitExceeded

クラスター作成リクエストで[EBSボリューム](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AmazonEBS.html)の制限を上回りました。AWSでは2種類のボリューム制限があります: EBSボリュームの総数に対する制限とEBSボリュームのトータルストレージ容量の制限です。対応法には以下のようなものがあります。

- ノード数を減らしてクラスターを起動します。
- 上述の2つの制限を超えていないかを確認します。([AWS trusted advisor](https://aws.amazon.com/premiumsupport/technology/trusted-advisor/)は無料でサービス制限を表示します)。リクエストがEBSボリュームの総数を超えているのであれば、ノードあたりのボリューム数を削減することを検討してください。トータルサイズを超えているのであれば、EBSのストレージサイズ、あるいは総数を削減することを検討してください。
- AWSのサポートに[EBSボリューム制限の増加](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html)をリクエストします。

### RequestLimitExceeded

AWSではアカウントにおける[APIリクエストのレートに制限](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/query-api-troubleshooting.html)を課しています。リクエストを再トライする前にしばらくお待ちください。

## プロバイダーによるシャットダウン(AWS)

Sparkドライバーは全てのクラスターの状態を保持するので、単一障害点となります。ドライバーノードをホスティングしているインスタンスがシャットダウンされると、Databricksはクラスターを停止します。AWSでは、一般的なエラーコードは以下のようなものとなります。

### Client.UserInitiatedShutdown

DatabricksではなくAWSに対する直接のリクエストによってインスタンスが停止されました。詳細はAWS管理者にお問い合わせください。

### Server.InsufficientInstanceCapacity

AWSでインスタンスのリクエストを充当することができませんでした。しばらく待ってからリクエストを試行してください。問題が継続する場合にはAWSサポートにお問い合わせください。

### Server.SpotInstanceTermination

現在のスポット価格が当該インスタンスの最大ビッド費用を上回ったので、AWSによってインスタンスが停止されました。ドライバーではオンデマンドインスタンスを使用し、別のアベイラビリティゾーンを選択するか、より高いスポットビッド価格を指定してください。

そのほかのシャットダウンに関するエラーコードについては、[AWS docs](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_StateReason.html)をご覧ください。

## 起動の失敗

### AWS

AWSでの一般的なエラーコードは以下のようなものとなります。

#### UnauthorizedOperation

リクエストされたインスタンスを起動する権限がDatabricksに許可されていません。可能性のある理由には以下のようなものがあります。

- あなたの組織のAWS管理者がインスタンスを起動するために使用されるAWSアクセスキーやIAMロールを無効化しました。
- Databricksが使用できる権限を持たないIAMロールを用いてクラスターを起動しようとしました。IAMロールをセットアップしたAWS管理者にお問い合わせください。詳細については、[Databricksにおけるインスタンスプロファイルを用いたS3バケットへのセキュアなアクセス](https://qiita.com/taka_yayoi/items/446c7971be354f88c679)をご覧ください。

#### Unsupported with message “EBS-optimized instances are not supported for your requested configuration”

選択されたインスタンスタイプは、指定されているアベイラビリティゾーン(AZ)で利用できません。EBS最適化が有効化されたとしても、実際のところできることはありません。対策としては、別のインスタンスタイプかAZを選択してください。

#### AuthFailure.ServiceLinkedRoleCreationNotPermitted

指定された資格情報には、EC2スポットインスタンスに対するサービスリンクのロールを作成する権限がありません。Databricksの管理者はお使いのアカウントでインスタンスを起動するために使用される資格情報をアップデートする必要があります。手順や更新されたポリシーについては、[AWS Account](https://docs.databricks.com/administration-guide/account-settings/aws-accounts.html)をご覧ください。

AWSエラーコードの完全なリストについては、[Error Codes](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/errors-overview.html)をご覧ください。

### Azure

こちらの停止理由は、Azure Databricksがバーチャルマシンの取得に失敗した際に発生します。APIのエラーコードとメッセージは、問題のトラブルシュートに役立ちます。

#### OperationNotAllowed

お使いのサブスクリプションで起動できるコア数などのクォータ制限に到達しました。Azureポータルから制限増加のリクエストをしてください。[Azure subscription and service limits, quotas, and constraints](https://docs.microsoft.com/azure/azure-subscription-service-limits)をご覧ください。

#### PublicIPCountLimitReached

稼働させることのできるパブリックIP数の制限に到達しました。Azureポータルから制限増加のリクエストをしてください。

#### SkuNotAvailable

選択した(VMサイズなどの)リソースSKUは選択しているロケーションで利用できません。解決するには、[Resolve errors for SKU not available](https://docs.microsoft.com/azure/azure-resource-manager/resource-manager-sku-not-available-errors)をご覧ください。

#### ReadOnlyDisabledSubscription

お使いのサブスクリプションが無効化されました。サブスクリプションを再アクティベートするには、[Why is my Azure subscription disabled and how do I reactivate it?](https://docs.microsoft.com/azure/billing/billing-subscription-become-disable)のステップに従ってください。

#### ResourceGroupBeingDeleted

誰かがAzureポータルでAzure Databricksワークスペースをキャンセルし、同時にクラスターを作成しようとした際に発生することがあります。リソースグループが削除されたためクラスターは失敗します。

#### SubscriptionRequestsThrottled

お使いのサブスクリプションは、Azureリソースマネージャのリクエスト制限に到達しました([Throttling Resource Manager requests](https://docs.microsoft.com/azure/azure-resource-manager/resource-manager-request-limits)をご覧ください)。典型的な原因は、Azure Databricks外の別のシステムがAzureに対して大量のAPI呼び出しを行なっているというものです。このシステムを特定するためにAzureサポートにコンタクトし、API呼び出し数を削減してください。

## 通信のロスト

Databricksはクラスターを起動できていましたが、Sparkドライバーをホスティングするインスタンスへの接続を失いました。

### AWS

適切なネットワーク設定(Databricksワーカーのセキュリティグループの設定変更など)あるいは一過的なAWSネットワークの問題によって引き起こされます。

### Azure

ドライバーのバーチャルマシンの停止やネットワーク問題によって引き起こされます。
 
### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)