Databricksクラスターの設定

[Configure clusters \| Databricks on AWS](https://docs.databricks.com/clusters/configure.html) [2022/10/11時点]の翻訳です。

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

> [Databricksクイックスタートガイド](https://qiita.com/taka_yayoi/items/125231c126a602693610)のコンテンツです。

:::note info
**注意**
これらの手順はレガシーなクラスター作成UI向けのであり、正確な履歴を保つためだけのものです。すべての顧客は更新された[クラスター作成UI](https://docs.databricks.com/clusters/create-cluster.html)を使用すべきです。
:::

本書では、Databricksクラスターを作成、変更する際に利用可能な設定オプションを説明します。UIを用いたクラスターの作成、変更にフォーカスしています。他の方法に関しては、[Clusters CLI](https://docs.databricks.com/dev-tools/cli/clusters-cli.html)、[Clusters API](https://docs.databricks.com/dev-tools/api/latest/clusters.html)、[Databricks Terraform provider](https://docs.databricks.com/dev-tools/terraform/index.html)を参照ください。

ご自身の要件に最も適した設定オプションをどの様に決めたら良いのかに関しては、[Databricksクラスター設定のベストプラクティス](https://qiita.com/taka_yayoi/items/ef3dc37143e7b77b50ad)を参照ください。
![](https://docs.databricks.com/_images/create-dialog-aws.png)

# クラスターポリシー

[クラスターポリシー](https://docs.databricks.com/administration-guide/clusters/policies.html)を用いることで、一連のルールに基づきクラスターの設定を制限することができます。ポリシーのルールは、クラスター作成時に指定できる属性、属性の値に制限をかけます。クラスターポリシーには使用できるユーザー、グループを制限できるACLがあるので、クラスターを作成する際に選択できるポリシーを制限することができます。

クラスターポリシーを設定するには、**Policy**ドロップダウンからクラスターポリシーを選択します。
![](https://docs.databricks.com/_images/policy.png)

:::note
**注意**
[ワークスペースでクラスタポリシーが作成](https://docs.databricks.com/administration-guide/clusters/policies.html#create-a-cluster-policy)されていない場合には、**Policy**ドロップダウンは表示されません。
:::

- あなたが[クラスター作成権限](https://docs.databricks.com/administration-guide/access-control/cluster-acl.html#cluster-create-permission)を持っている場合には、**Unrestricted**ポリシーを選択することで、任意の設定でクラスターを作成することができます。**Unrestricted**ポリシーはクラスターの属性、属性の値にいかなる制限を適用しません。
- クラスター作成権限およびクラスターポリシーへのアクセス権がある場合には、**Unrestricted**ポリシーあるいはアクセスできるポリシーを選択できます。
- クラスターポリシーへのアクセス権のみがある場合には、アクセスできるポリシーを選択できます。

# クラスターモード

:::note
**注意**
本書ではレガシーなクラスターUIを説明しています。プレビューのUIの詳細に関しては、[Create a cluster](https://docs.databricks.com/clusters/create-cluster.html)をご覧ください。これには、クラスターアクセスタイプとモードの用語の変更が含まれています。新規のクラスタータイプとレガシークラスタータイプの比較に関しては、[Clusters UI changes and cluster access modes](https://docs.databricks.com/clusters/cluster-ui-preview.html)をご覧ください。プレビューUIにおいては、

- *スタンダードモードクラスター*は今では*分離なし共有アクセスモードクラスター*と呼ばれます。
- *テーブルACLを使うハイコンカレンシークラスター*は今では*共有アクセスモードクラスター*と呼ばれます。
:::

Databricksでは、Standard、High Concurrency、[Single Node](https://docs.databricks.com/clusters/single-node.html)の3つのクラスターモードをサポートしています。デフォルトはStandardとなっています。

:::note warn
**重要！**
- お使いのワークスペースが[Unity Catalog](https://docs.databricks.com/data-governance/unity-catalog/index.html)のメタストアに割り当てられている場合、ハイコンカレンシークラスターを使用することはできません。代わりに、アクセスコントロールの一貫性を保証し、強力な分離保証を強制するためには[アクセスモード](https://docs.databricks.com/data-governance/unity-catalog/compute.html#access-mode)を使ってください。また、[Create a cluster that can access Unity Catalog](https://docs.databricks.com/data-governance/unity-catalog/compute.html#create-cluster)もご覧ください。
- クラスターを作成した後にクラスターモードを変更することはできません。異なるクラスターモードを使いたい場合には、新規クラスターを作成する必要があります。
:::

クラスターの設定には、クラスターモードに応じた[自動停止](https://qiita.com/taka_yayoi/items/991aae376c089df58504#%E8%87%AA%E5%8B%95%E5%81%9C%E6%AD%A2)設定のデフォルト値が存在します。

- StandardおよびSingle Nodeクラスターはデフォルトで120分後に自動で停止します。
- High Concurrencyクラスターはデフォルトでは自動停止しません。

## Standardクラスター

:::note alert
**警告！**
スタンダードモードのクラスター(分離なし共有クラスター)は複数のユーザーで共有することができますが、ユーザー間のアイソレーションはありません。*テーブルACLやクレディンシャルパススルーの様な追加のセキュリティ設定を伴わない*ハイコンカレンシークラスターを使用している際にはスタンダードモードクラスターと同じ設定が使用されます。アカウント管理者はこれらのタイプのクラスターにおいて[Databricksワークスペース管理者の内部認証情報の自動生成を抑止](https://qiita.com/taka_yayoi/items/a838aca446bd957ec8f0)することができます。よりセキュアな選択肢として、テーブルACLを使用するハイコンカレンシークラスターの様な代替案を使用することをお勧めします。
:::

シングルユーザーのみの場合においては、Standardが推奨となります。Standardクラスターではあらゆる言語(Python、SQL、R、Scala)での開発を行えます。

## High Concurrencyクラスター

High Concurrencyはマネージドのクラウドリソースとなります。High Concurrencyの大きなメリットは、リソースの使用率を最大化しつつもクエリーのレーテンシーを最小化するためのきめ細かいリソース共有機構です。

High ConcurrencyクラスターではSQL、Python、Rを用いた開発が可能です。High Concurrencyのパフォーマンスとセキュリティは、異なるプロセスでユーザーコードを実行することで実現され、Scalaではこれは不可能となります。

さらに、High Concurrencyクラスターのみ、[テーブルアクセスコントロール](https://qiita.com/taka_yayoi/items/f0b999e69b9fef5065d8)をサポートしています。

High Concurrencyクラスターを作成するには、**Cluster Mode**で**High Concurrency**を選択します。
![](https://docs.databricks.com/_images/high-concurrency.png)

Cluster APIを用いてHigh Concurrencyクラスターを作成する方法に関しては、[High Concurrency cluster example](https://docs.databricks.com/dev-tools/api/latest/examples.html#high-concurrency-example)を参照ください。

## Single Nodeクラスター

Single Nodeクラスターにはワーカーがないため、Sparkジョブはドライバーノードで実行されます。

一方、Standardクラスターにおいては、Sparkジョブを実行するためにドライバーノードに加えて、少なくとも1台のSparkワーカーノードが必要となります。

Single Nodeクラスターを作成するには、**Cluster Mode**で**Single Node**を選択します。
![](https://docs.databricks.com/_images/single-node.png)

Single Nodeクラスターについて詳細を知りたい場合には、[Single Node clusters](https://docs.databricks.com/clusters/single-node.html)を参照ください。

# データリネージュ

:::note
**プレビュー**
データリネージュは[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。
:::

データリネージュをキャプチャするクラスターを作成するには、クラスター設定ページに移動し、以下のステップを実行します。

:::note
**注意**
ジョブクラスターを用いたジョブ実行の一部としてリネージュをキャプチャするには、ジョブクラスターに以下の設定をすることを確認してください。
:::

1. **Access mode**で、**Single user**か**Shared**を選択します。
    - **Single user**: 複数言語をサポートしますが、割り当てられた単一のユーザーのみが使用できます。
    - **Shared**: 複数ユーザーで共有できるクラスターです。SQLやPythonワークロードのみがサポートされています。
1. **Databricks runtime version**でDatabricksランタイム11.1以降を選択します。
1. **Advanced Options**トグルをクリックします。
1. **Spark**タブをクリックします。
1. **Spark config**テキストボックスに以下の設定を入力します。

    ```ini:ini
    spark.databricks.dataLineage.enabled true
    ```

1. **Create Cluster**をクリックします。

# プール

クラスターの起動時間を削減するために、ドライバーノード、ワーカーノード向けにアイドル状態のインスタンスの事前定義済みの[プール](https://qiita.com/taka_yayoi/items/919acd7ef9decf0f61e6)にクラスターをアタッチすることができます。プール内のインスタンスを用いてクラスターが作成されます。リクエストされたドライバー、ワーカーノードを作成するのに必要なアイドル状態のインスタンスが十分に無い場合には、プールはインスタンスプロバイダーから新たなインスタンスを割り当ててプールを拡張します。アタッチされたクラスターが停止されると、使用されたインスタンスはプールに返却され、異なるクラスターで再利用することができます。

ドライバーノードではなくワーカーノードにプールを選択した場合、ドライバーノードはワーカーノードの設定からプールを継承します。

:::note warn
**重要！**
ワーカーノードではなくドライバーノードにプールを選択しようとした場合、エラーが発生しクラスターは作成されません。この要件により、ドライバーノードがワーカーノードの作成を待たなくてはいけない、あるいは逆の状況を防ぐことができます。
:::

Databricksにおけるプールの詳細については、[プール](https://qiita.com/taka_yayoi/items/919acd7ef9decf0f61e6)を参照ください。

# Databricksランタイム

Databricksランタイムは、お使いの[クラスター](https://docs.databricks.com/clusters/index.html)上で稼働する一連のコアコンポーネントです。すべてのDatabricksランタイムにはApache Sparkが含まれており、ユーザビリティ、パフォーマンス、セキュリティを改善するためのコンポーネント、アップデートが追加されています。

Databricksはいくつかの種類、バージョンのランタイムを提供しており、クラスターを作成、変更する際に**Databricks Runtime Version**ドロップダウンから選択します。
![](https://docs.databricks.com/_images/runtime-version.png)

## Photonアクセラレーション

[Photon](https://docs.databricks.com/runtime/photon.html)はDatabricksランタイム 9.1LTS以降で利用できます。

Photonアクセラレーションを有効化するには、**Use Photon Acceleration**チェックボックスを選択します。

必要に応じてワーカータイプとドライバータイプのインスタンスタイプを指定することができます。

[Spark UI](https://docs.databricks.com/clusters/clusters-manage.html#spark-ui)でPhotonのアクションを参照できます。以下のスクリーンショットではクエリー詳細のDAGを表示しています。DAGからPhotonに関する二つの示唆が得られます。まず、Photonのオペレーターは、例えば、`PhotonGroupingAgg`のような「Photon」の文字列でスタートします。2つ目として、DAGにおいては、Photonオペレーターとステージは桃色で描画され、非Photonのオペレーターは青色となります。
![](https://docs.databricks.com/_images/photon-dag.png)

## Dockerイメージ

いくつかのDatabricksランタイムバージョンにおいては、クラスター作成時にDockerイメージを指定することができます。例となるユースケースには、ライブラリのカスタマイズ、変更がないゴールデン環境、DockerのCI/CDインテグレーションが含まれます。

GPUデバイスを持つクラスターによるディープラーニングのカスタム環境を作成するためにDockerイメージを使用することもできます。

使い方に関しては、[Customize containers with Databricks Container Services](https://docs.databricks.com/clusters/custom-containers.html)と[Databricks Container Services on GPU clusters](https://docs.databricks.com/clusters/gpu.html#databricks-container-services-on-gpu)を参照ください。

# クラスターノードタイプ

クラスターは1台のドライバーノード、0台以上のワーカーノードから構成されます。

ドライバーノードとワーカーノードに別々のインスタンスタイプを指定することができますが、デフォルトではドライバーノードはワーカーノードと同じインスタンスタイプを使用します。異なるインスタンスタイプファミリーは、メモリーを消費するワークロードや計算資源を消費するワークロードなど異なるユースケースにフィットします。

- [ドライバーノード](#ドライバーノード)
- [ワーカーノード](#ワーカーノード)
- [GPUインスタンスタイプ](#gpuインスタンスタイプ)
- [AWS Gravitonインスタンスタイプ]

## ドライバーノード

ドライバーノードはクラスターにアタッチされている全てのノートブックの状態に関する情報を維持します。また、ドライバーノードはSparkContextを維持し、クラスター上のノートブックやライブラリから実行される全てのコマンドを解釈し、Sparkエグゼキューターと連携しす量にApache Sparkのマスターを実行します。

ドライバーノードタイプのデフォルトは、ワーカーノードと同じものが選択されます。ノートブック上で大量のデータをワーカーノードから取り出し分析を行うために、`collect()`を実行しようとする際には、より多くのメモリーを搭載したドライバーノードを選択することができます。

:::note
**ティップス**
ドライバーノードはアタッチされているノートブックの全ての状態に関する情報を保持するので、使用されていないノートブックはドライバーノードからデタッチする様にしてください。
:::

## ワーカーノード

Databricksのワーカーノードは、Sparkエグゼキューターやクラスターが適切に動作するために必要なサービスを実行します。ワークロードをSparkに分散させた場合、全ての分散処理はワーカーノードで実行されます。Databricksにおいては、1台のワーカーノードで1つのエグゼキューターを実行します。このため、Databricksのアーキテクチャの文脈においては、*エグゼキューター*と*ワーカー*は同じ意味で使用されます。

:::note
**ティップス**
Sparkジョブを実行する際には、少なくとも1つのワーカーノードが必要となります。クラスターにワーカーがない場合、ドライバーノードで非Sparkのコマンドを実行することはできますが、Sparkコマンドは失敗します。
:::

:::note
**注意**
Databricksがワーカーノードを起動する際、2つのプライベートIPアドレスを割り当てます。ノードのプライマリプライベートIPアドレスは、Databricks内部トラフィックをホストするために使用されます。セカンダリのプライベートIPアドレスはクラスター間通信のためのSparkコンテナによって使用されます。このモデルによって、Databricksは同じワークスペースにおける複数のクラスターの分離を実現します。
:::

## GPUインスタンスタイプ

ディープラーニングの様に高いパフォーマンスが求められる様なチャレンジングなタスクに対しては、Databricksではグラフィックプロセッシングユニット(GPU)を用いたクラスターをサポートしています。このサポートはベータバージョンです。詳細に関しては、[GPU\-enabled clusters](https://docs.databricks.com/clusters/gpu.html#gpu-clusters)を参照ください。

## AWS Gravitonインスタンスタイプ

:::note
**プレビュー**
この機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。
:::

DatabricksではAWS Gravitonプロセッサーを使用したクラスターをサポートしています。ArmベースのAWS GravitonインスタンスはAWSによってデザインされており、同等の現世代のx86ベースのインスタンスよりも優れたコストパフォーマンスを提供します。[AWS Graviton\-enabled clusters](https://docs.databricks.com/clusters/graviton.html)をご覧ください。

# クラスターサイズ、オートスケーリング

Databricksクラスターを作成する際、クラスターにおけるワーカーの固定値、あるいは最小数、最大数を指定することができます。

固定サイズのクラスターを指定した場合、Databricksは指定された数のワーカーを保証します。ワーカーの数をレンジで指定した場合には、あなたのジョブを実行するのに必要なワーカーの最適な数を選択します。これは*オートスケーリング*と呼ばれるものです。

オートスケーリングを用いることで、Databricksはあなたのジョブの特性を考慮して動的にワーカーを再配置します。あなたのパイプラインの特定の部分では、他と比べてより多くの計算資源を必要とするかもしれません。この際、Databricksはジョブの実行過程で自動で追加のワーカーを追加します(そして、不要になればこれらを削除します)。

オートスケーリングを用いることで、ワークロードに適したクラスターを配備する必要がなくなるので、高いクラスターの利用率を実現することが容易になります。時間によってワークロードの要件が変化するケース(1日間のデータセットの探索など)でより効果を発揮しますが、クラスター配備要件が未知の短期間の一回限りのワークロードにも適用することができます。オートスケーリングは2つのメリットをもたらします。

- 固定サイズ、かつリソースが欠如しているクラスターと比較して、ワークロードが高速になります。
- 固定サイズのクラスターと比較して、オートスケーリングのクラスターは全体的なコストを削減できます。

クラスターとワークロードの固定サイズに依存しますが、オートスケーリングはこれら両方のメリットを同時に提供します。クラウドプロバイダーがインスタンスを停止した場合、選択されたワーカーの最小値よりもクラスターが小さくなる場合があります。この場合、Databricksはワーカーの最小値を維持する様に、継続的にインスタンスの再配備をリトライします。

:::note
**注意**
オートスケーリングは`spark-submit`ジョブでは使用できません。
:::

## オートスケーリングの挙動

- 最小値から最大値にスケールアップするまでに2つのステップを踏みます。
- シャッフルファイルの状態を見ることで、クラスターがアイドル状態でなくても、スケールダウンすることがあります。
- 現在のノードのパーセンテージに応じてスケールダウンします。
- ジョブクラスターにおいては、過去40秒間の利用率が低かった場合にスケールダウンします。
- all-purposeクラスターにおいては、過去150秒間の利用率が低かった場合にスケールダウンします。
- Spark設定プロパティ`spark.databricks.aggressiveWindowDownS`でどの程度の周期でクラスターのスケールダウンの決定を行うのかを、秒で指定できます。値を増加させることで、クラスターのスケールダウンがゆっくりとなります。最大値は600です。

## オートスケーリングの有効化、設定

Databricksが自動でクラスターのサイズを調整できる様にするには、クラスターのオートスケーリングを有効化し、ワーカーの最小値、最大値を指定します。

1. オートスケーリングを有効化します。
    - All-purposeクラスター: Create Clusterページで、**Autopilot Options**ボックスの**Enable autoscaling**チェックボックスを選択します。
![](https://docs.databricks.com/_images/autopilot-aws.png)
    - ジョブクラスター: Configure Clusterページで、**Autopilot Options**ボックスで**Enable autoscaling**を選択します。 <br>
![](https://docs.databricks.com/_images/autopilot-job-aws.png)

1. ワーカーの最小数、最大数を設定します。
![](https://docs.databricks.com/_images/workers-aws.png)

クラスターを実行している際、クラスター詳細ページには割り当てられたワーカーの数が表示されます。割り当てられたワーカーの数とワーカー設定を比較することで、必要に応じて調整を行うことができます。

:::note warn
**重要!**
[インスタンスプール](https://docs.databricks.com/clusters/instance-pools/cluster-instance-pool.html#cluster-instance-pool)を使っているのであれば：

- プールにおける[アイドルインスタンスの最小数](https://docs.databricks.com/clusters/instance-pools/configure.html#pool-min)以下のクラスターサイズになっていることを確認してください。これよりも大きい場合、クラスターの起動時間はプールを使用しないクラスターと同じものになります。
- クラスターの最大サイズはプールの[最大キャパシティ](https://docs.databricks.com/clusters/instance-pools/configure.html#pool-max)以下になる様にしてください。
:::

## オートスケーリングの例

静的なクラスターをオートスケーリングクラスターに再設定した場合、Databricksは即時にクラスターを最小、最大の境界に収まるようにリサイズし、オートスケーリングをスタートします。例として、以下のテーブルでは特定の初期サイズのクラスターに対して、5ノード、10ノードの間にオートスケールさせるように再設定した際に何が起きるのかを示しています。

| 初期サイズ | 再設定後のサイズ |
|:--|:--|
|6   |6   |
|12   |10   |
|3  |5   |

# ローカルディスクの暗号化

:::note
**プレビュー**
この機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。
:::

クラスターを実行する際に使用するいくつかのインスタンスタイプでは、ローカルにアタッチされたディスクが存在します。Databricksは、シャッフルデータや短期データをこれらのローカルにアタッチされたディスクに保存します。クラスターのローカルディスクに一時的に保存されるシャッフルデータを含む、全てのストレージタイプにおいて保存されている全てのデータが暗号化される様に、ローカルディスクの暗号化を有効化することができます。

:::note warn
**重要!**
ローカルボリュームとの暗号化データの読み書きによるパフォーマンスのインパクトによって、ワークロードが遅くなる可能性があります。
:::

ローカルディスクの暗号化が有効化されると、Databricksはローカルにそれぞれのクラスターノードに固有の暗号化キーを生成し、ローカルディスクに保存される全てのデータの暗号化にキーを使用します。キーのスコープはそれぞれのクラスターノード固有で、クラスターノードとともに破棄されます。このライフタイムの期間において、暗号化、複合化のためにキーはメモリー上に保持され、ディスク上に暗号化された状態で格納されます。

ローカルディスクの暗号化を有効化するには、[Clusters API](https://docs.databricks.com/dev-tools/api/latest/clusters.html)を使用する必要があります。クラスターの作成、編集の際に以下を設定します。

```json:JSON
{
  "enable_local_disk_encryption": true
}
```

これらのAPIの呼び出し方の例含めたCluster APIのリファレンスに関しては、[Create](https://docs.databricks.com/dev-tools/api/latest/clusters.html#clusterclusterservicecreatecluster)、[Edit](https://docs.databricks.com/dev-tools/api/latest/clusters.html#clusterclusterserviceeditcluster)を参照ください。

以下がローカルディスク暗号化を有効化したcluster createの呼び出し例です。

```json:JSON
{
  "cluster_name": "my-cluster",
  "spark_version": "7.3.x-scala2.12",
  "node_type_id": "r3.xlarge",
  "enable_local_disk_encryption": true,
  "spark_conf": {
    "spark.speculation": true
  },
  "num_workers": 25
}
```

# セキュリティモード

ワークスペースが[Unity Catalog](https://docs.databricks.com/data-governance/unity-catalog/index.html)に割り当てられている場合、アクセスコントロールの一貫性を保証し、強力なアイソレーション保証を強制するためには、[ハイコンカレンシークラスターモード](#クラスターモード)ではなくセキュリティモードを使用します。

**Advanced options**で、以下のクラスターセキュリティモードを選択します。

- **None**: アイソレーションはありません。ワークスペースローカルのテーブルアクセスコントロールやクレディンシャルパススルーを強制しません。Unity Catalogデータにアクセスすることはできません。
- **Single User**: 単一のユーザーだけが使用できます(デフォルトではクラスターの作成者となります)。他のユーザーはクラスターにアタッチすることはできません。**Single User**セキュリティモードのクラスターからビューにアクセスする際には、ビューはユーザーの権限で実行されます。シングルユーザークラスターは、Python、Scala、Rを用いたワークロードをサポートしています。シングルユーザークラスターではinitスクリプト、ライブラリのインストール、DBFSマウントがサポートされています。自動化ジョブではシングルユーザークラスターを使う必要があります。
- **User Isolation**: 複数のユーザーで共有できます。SQLワークロードのみがサポートされています。クラスターユーザー間における厳密な分離を強制するために、ライブラリのインストール、initスクリプト、DBFSマウントは無効化されています。
- **Table ACL only (Legacy)**: ワークスペースレベルのテーブルアクセスコントロールを強制しますが、Unity Catalogのデータにはアクセスすることはできません。
- **Passthrough only (Legacy)**: ワークスペースレベルのクレディンシャルパススルーを強制しますが、Unity Catalogのデータにアクセスすることはできません。

Unity Catalogワークロードをサポートしているセキュリティモードは**Single User**と**User Isolation**のみとなります。

詳細に関しては、[What is cluster access mode?](https://docs.databricks.com/data-governance/unity-catalog/compute.html#access-mode)をご覧ください。

# AWSの設定

クラスターのAWSインスタンスを設定する際、アベイラビリティゾーン、最大のスポット価格、EBSボリュームタイプおよびサイズ、インスタンスプロファイルを選択することができます。これらの設定を行うには以下の手順を踏みます。

1. クラスター設定ページで、**Advanced Options**トグルをクリックします。
1. ページの下部で、**Instance**タブをクリックします。
![](https://docs.databricks.com/_images/instances-aws.png)

## アベイラビリティゾーン

クラスターに対して特定のアベイラビリティゾーン(AZ)を選択することは、お客様の組織で特定のアベイラビリティゾーンでリザーブドインスタンスを購入している場合には特に有用となります。詳細に関しては[AWS availability zones](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html)を参照ください。

### 自動アベイラビリティゾーン(Auto-AZ)

ワークスペースのサブネットで利用できるIPアドレスに基づいて、クラスターが自動でアベイラビリティゾーンを選択する様に設定することができます、これは「Auto-AZ」と呼ばれる機能となります。Auto-AZを有効化するには[Clusters API](https://docs.databricks.com/dev-tools/api/latest/clusters.html#clusterawsattributes)を使用し、`awsattributes.zone_id = "auto"`を設定する必要があります。Auto-AZは、AWSがキャパシティ不足エラーを返した際に他のAZでリトライします。

## スポットインスタンス

スポットインスタンスを使用し、オンデマンドインスタンスの価格に対するパーセンテージとしてスポットインスタンスを起動する際に使用するスポットインスタンスの最高価格を指定することができます。デフォルトでは、オンデマンド価格の100%が最高価格となります。詳細は[AWS spot pricing](https://aws.amazon.com/ec2/spot/)を確認ください。

## EBSボリューム

ここでは、ワーカーノードのデフォルトEBSボリューム設定、シャッフルボリュームの追加方法、Databtricksが自動でEBSボリュームを配置する様に設定する方法を説明します。

EBSボリュームを設定するには、クラスター設定の**Instances**タブをクリックし、**EBS Volume Type**ドロップダウンリストからオプションを選択します。

### デフォルトEBSボリューム

Databricksはすべてのワーカーノードに対して以下のEBSボリュームを配備します。

- ホストのオペレーティングシステムとDatabricksの内部サービスでのみ使用される30GBの暗号化EBSインスタンスルートボリューム。
- Sparkワーカーで使用される150GBの暗号化EBSコンテナルートボリューム。ここでSparkサービスとログがホストされます。
- (HIPAAのみ)Databricks内部サービス向けのログを格納する75GBの暗号化EBSワーカーログボリューム。

### EBSシャッフルボリュームの追加

シャッフルボリュームを追加するには、EBSボリュームタイプドロップダウンリストで**General Purpose SSD**を選択します。
![](https://docs.databricks.com/_images/add-ebs.png)

デフォルトでは、Sparkのシャッフルはインスタンスのローカルディスクに出力されます。ローカルディスクを持たないインスタンスタイプにおいて、あるいは、Sparkのシャッフルストレージスペースを拡張したい場合には、追加のEBSボリュームを指定することができます。これは特に、Sparkジョブが大容量のシャッフルアウトプットを生成する際に、ディスクスペースエラーを防ぐために有効です。

Databricksはオンデマンド、スポットインスタンスの両方でEBSボリュームを暗号化します。詳細は、[AWS EBS volumes](https://aws.amazon.com/ebs/features/)を参照ください。

### 顧客管理キーによるDatabricks EBSボリュームの暗号化(オプション)

オプションで、クラスターのEBSボリュームを顧客管理キーで暗号化することができます。

[Customer\-managed keys for workspace storage](https://docs.databricks.com/security/keys/customer-managed-keys-storage-aws.html)を参照ください。

### AWS EBSのリミット

全てのクラスターにおける全てのワーカーに対するランタイムの要件を十分に満足できる様にAWS EBSのリミットが十分に高いものであることを確認してください。デフォルトのEBSリミットに関する情報、および、リミットの変更方法に関しては、[Amazon Elastic Block Store \(EBS\) Limits](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_ebs)を参照ください。

### AWS EBS SSDボリュームタイプ

AWS EBS SSDのボリュームタイプに対してgp2あるいはgp3を選択することができます。これを行うためには、[Manage SSD storage](https://docs.databricks.com/administration-guide/clusters/manage-ssd.html)を参照ください。gp2に比べてコストを削減できるのでgp3に切り替えることをお勧めします。gp2、gp3に関する技術情報については、[Amazon EBS volume types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html)を参照ください。

### ローカルストレージのオートスケーリング

クラスター作成時に固定数のEBSボリュームを割り当てたくない場合には、ローカルストレージのオートスケーリングを使用してください。ローカルストレージをオートスケーリングを活用することで、Databricksはお使いのクラスターのSparkワーカーにおけるディスク領域の空き容量をモニターします。ワーカーのディスクの空き容量が少なくなってくると、ディスク容量が枯渇する前に、Databricksは自動で新規EBSボリュームをアタッチします。EBSボリュームはインスタンスに対して最大5TB(インスタンスのローカルストレージを含む)までアタッチすることができます。

オートスケーリングのストレージを設定するには、Autopilot Optionボックスで**Enable autoscaling local storage**を選択します。
![](https://docs.databricks.com/_images/autoscaling-local-storage.png)

インスタンスにアタッチされたEBSボリュームは、AWSにインスタンスが返却される際にのみデタッチされます。すなわち、クラスターが稼働し続ける限りEBSボリュームはインスタンスから決してデタッチされません。EBS使用量を削減するには、[GPUインスタンスタイプ](#gpuインスタンスタイプ)や[自動停止](https://qiita.com/taka_yayoi/items/991aae376c089df58504#%E8%87%AA%E5%8B%95%E5%81%9C%E6%AD%A2)が設定されたクラスターで本機能を使うことをお勧めします。

:::note
**注意**
Databricksは、インスタンスのローカルストレージを拡張する際にはスループット最適化HDD(st1)を使用します。これらのボリュームの[デフォルトのAWSキャパシティリミット](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_ebs)は20TBです。リミットを超過しないようにするには、使用量の要件に基づき、管理者はリミットを増加させるためのリクエストをする必要があります。
:::

:::note
**注意**
Databricksアカウントをバージョン2.44以前(2017/4/27以前)に作成し、ローカルストレージのオートスケーリングを有効化したい場合(デフォルトでは[High Concurrencyクラスター](#high-concurrencyクラスター)でのみ有効になっています)には、IAMロールあるいはアカウントを作成時に使用したキーに対して、ボリュームのアクセス権を追加する必要があります。特に、`ec2:AttachVolume`、`ec2:CreateVolume`、`ec2:DeleteVolume`、`ec2:DescribeVolumes`を追加しなくてはなりません。既存のIAMロール、キーをアップデートする方法については、[Create a cross\-account IAM role](https://docs.databricks.com/administration-guide/account-api/iam-role.html)を参照ください。
:::

## インスタンスプロファイル

AWSキーを使わずにセキュアにAWSのリソースにアクセスするためには、Databricksクラスターにインスタンスプロファイルを追加して起動します。どのようにインスタンスプロファイルを作成し設定するのかに関しては、[Databricksにおけるインスタンスプロファイルを用いたS3バケットへのセキュアなアクセス](https://qiita.com/taka_yayoi/items/446c7971be354f88c679)を参照ください。インスタンスプロファイルを作成した後で、インスタンスプロファイルのドロップダウンリストから選択することができます。
![](https://docs.databricks.com/_images/create-cluster-with-instance-profile.png)

:::note
**注意**
インスタンスプロファイルを追加してクラスターを起動すると、このクラスターに対するアタッチ権限を持つユーザーは誰でも、このロールを用いて背後のリソースにアクセスすることができます。望まれないアクセスを防御するには、クラスターへのアクセス権を制限するために[クラスターアクセスコントロール](https://docs.databricks.com/security/access-control/cluster-acl.html)を使用してください。
:::

# Sparkの設定

Sparkジョブをファインチューニングするには、クラスター設定で[Spark configuration properties](https://spark.apache.org/docs/latest/configuration.html)をカスタマイズします。

1. クラスター設定ページで**Advanced Options**トグルをクリックします。
1. **Spark**タブをクリックします。
![](https://docs.databricks.com/_images/spark-config-aws.png)
**Spark config**で、一行ごとにキーバリューのペアとして設定プロパティを入力します。

[Clusters API](https://docs.databricks.com/dev-tools/api/latest/clusters.html)を用いてクラスターを設定する際には、[Create cluster request](https://docs.databricks.com/dev-tools/api/latest/clusters.html#clustercreatecluster)あるいは[Edit cluster request](https://docs.databricks.com/dev-tools/api/latest/clusters.html#clustereditcluster)における`spark_conf`フィールドにSparkプロパティを設定します。

全てのクラスターに対してSparkプロパティを設定するには、[グローバルinitスクリプト](#https://docs.databricks.com/clusters/init-scripts.html#global-init-script)を使用します。

```scala:Scala
dbutils.fs.put("dbfs:/databricks/init/set_spark_params.sh","""
  |#!/bin/bash
  |
  |cat << 'EOF' > /databricks/driver/conf/00-custom-spark-driver-defaults.conf
  |[driver] {
  |  "spark.sql.sources.partitionOverwriteMode" = "DYNAMIC"
  |}
  |EOF
  """.stripMargin, true)
```

# シークレットからSpark設定プロパティを取得する

パスワードの様なセンシティブな情報は平文ではなく[シークレット](https://docs.databricks.com/security/secrets/secrets.html)に保存することをお勧めします。Spark設定でシークレットを参照するには、以下の構文を使用します。

```ini:ini
spark.<property-name> {{secrets/<scope-name>/<secret-name>}}
```

例えば、`secrets/acme_app/password`のシークレットに保存されている値を、`password`というSpark設定プロパティに設定するには以下の設定を行います。

```ini:ini
spark.password {{secrets/acme-app/password}}
```

詳細については、[Syntax for referencing secrets in a Spark configuration property or environment variable](https://docs.databricks.com/security/secrets/secrets.html#path-value)をご覧ください。

# 環境変数

クラスターで動作する[initスクリプト](https://docs.databricks.com/clusters/init-scripts.html)からアクセスできる環境変数を設定することができます。また、Databricksではinitスクリプトで使用できる定義済み[環境変数](https://docs.databricks.com/clusters/init-scripts.html#env-var)を提供しています。定義済み環境変数を上書きすることはできません。

1. クラスター設定ページで、**Advanced Options**トグルをクリックします。
1. **Spark**タブをクリックします。
1. **Environment Variables**フィールドに環境変数を設定します。
![](https://docs.databricks.com/_images/environment-variables.png)

Clusters APIエンドポイントの[Create cluster request](https://docs.databricks.com/dev-tools/api/latest/clusters.html#clustercreatecluster)や[Edit cluster request](https://docs.databricks.com/dev-tools/api/latest/clusters.html#clustereditcluster)の`spark_env_vars`フィールドを使って環境変数を設定することもできます。

# クラスタータグ

クラスタータグを用いることで、企業内の様々なグループにおいて使用されるクラウドリソースのコストを容易にモニタリングできる様になります。クラスターを作成する際にキーバリューのペアでタグを指定でき、DatabricksはVMやディスクボリューム、[DBU使用量レポート](https://docs.databricks.com/administration-guide/account-settings/usage.html)にタグを適用します。

プールから起動されるクラスターに関しては、DBU使用量レポートのみに適用されるカスタムクラスタータグのみが適用され、クラウドリソースには伝播しません。プールとクラスタータグのタイプがどの様に動作するかに関しては、[Monitor usage using cluster and pool tags](https://docs.databricks.com/administration-guide/account-settings/usage-detail-tags-aws.html)　を参照ください。

Databricksはデフォルトで4つのタグ、`Vendor`、`Creator`、`ClusterName`、`ClusterId`を適用します。

さらに、ジョブクラスターでは、Databricksは`RunName`と`JobId`の2つのデフォルトタグを適用します。Databricks SQLで使用されるリソースに関しては、Databricksは`SqlEndpointId`のデフォルトタグを適用します。

:::note warn
**警告！**
キーが`Name`であるカスタムタグをクラスターに割り当てないでください。全てのクラウsターには、Databricksによって設定される`Name`タグが存在します。キー`Name`を持つ値を変更すると、Databricksによってクラスターが追跡されなくなります。結果として、クラスターがアイドル状態になった後でも停止されず、使用量が発生し続けることになります。
:::

クラスター作成時にカスタムタグを追加することができます。クラスタータグを設定するには以下の手順を踏みます。

1. クラスター設定ページで、**Advanced Options**トグルをクリックします。
1. ページ下部で**Tag**タブをクリックします。
![](https://docs.databricks.com/_images/tags.png)
1. それぞれのカスタムタグごとにキーバリューペアを追加します。カスタムタグは45個まで追加できます。

詳細については、[Monitor usage using cluster and pool tags](https://docs.databricks.com/administration-guide/account-settings/usage-detail-tags-aws.html)をご覧ください。

## 必須タグの強制

クラスター作成時に常に特定のタグが追加される様にするために、お使いのアカウントのプライマリーIAMロール(アカウントセットアップに使用したもの。アクセスが必要な場合にはご自身のAWS管理者にコンタクトしてください)に特定のIAMポリシーを適用することができます。IAMポリシーには、必須のタグのキーおよびオプションの値に対する明示的な[Deny文](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#AccessPolicyLanguage_Interplay)を含める必要があります。許可された必須タグが指定されていない場合、*クラスターの作成は失敗*します。

例えば、`Department`、`Project`タグを強制したいケースで、前者では特定の値、後者ではフリーフォームで何かしらの入力を強制する場合、以下の様なIAMポリシーを適用することができます。

```json:JSON
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "MandateLaunchWithTag1",
      "Effect": "Deny",
      "Action": [
        "ec2:RunInstances",
        "ec2:CreateTags"
      ],
      "Resource": "arn:aws:ec2:region:accountId:instance/*",
      "Condition": {
        "StringNotEqualsIgnoreCase": {
          "aws:RequestTag/Department": [
              "Deptt1", "Deptt2", "Deptt3"
          ]
        }
      }
    },
    {
      "Sid": "MandateLaunchWithTag2",
      "Effect": "Deny",
      "Action": [
        "ec2:RunInstances",
        "ec2:CreateTags"
      ],
      "Resource": "arn:aws:ec2:region:accountId:instance/*",
      "Condition": {
        "StringNotLike": {
          "aws:RequestTag/Project": "?*"
        }
      }
    }
  ]
}
```

それぞれのタグが、オンデマンドインスタンスのみのクラスター、スポットインスタンスのみのクラスター、両方から構成されるクラスターがある際のシナリオに対して`ec2:RunInstances`と`ec2:CreateTags`アクションの両方が必要となります。

:::note
**ティップス**
タグごとに別のポリシー文を追加することをお勧めします。全体的なポリシーは若干読みにくいものになりますが、デバッグしやすいものとなります。ポリシーで使用できるオペレーターのリストについては、[IAM Policy Condition Operators Reference](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html)を参照ください。
:::

:::note
**注意**
IAMポリシーのために、クラスター作成エラーが`エンコードされたエラーメッセージ`となります。

```
Cloud Provider Launch Failure: A cloud provider error was encountered while setting up the cluster.
```

アクションをリクエストしたユーザーが見るべきではない権限管理された情報から構成される認証ステータスの詳細である場合があるため、エンコードされたメッセージとなります。この様なメッセージをどの様にデコードするかについては、[DecodeAuthorizationMessage API](https://docs.aws.amazon.com/STS/latest/APIReference/API_DecodeAuthorizationMessage.html)(あるいは[CLI](https://docs.aws.amazon.com/cli/latest/reference/sts/decode-authorization-message.html))を参照ください。
:::

# クラスターへのSSH接続

:::note
**注意**
セキュアクラスター接続が有効化されるクラスターにはSSHでログインすることができません。
:::

[SSH](https://en.wikipedia.org/wiki/Secure_Shell)を用いることで、高度なトラブルシュートやカスタムソフトウェアをインストールするために、リモートからApache Sparkクラスターにログインすることができます。

関連する機能に関しては、[Web terminal](https://docs.databricks.com/clusters/web-terminal.html)を参照ください。

ここでは、お使いの公開鍵を用いてどのようにAWSアカウントでイングレスアクセスを有効化するのか、どのようにクラスターノードに対してSSH接続をオープンするのかを説明します。

## セキュリティグループの設定

SSH接続を行うIPアドレスからのイングレスアクセスを許可するために、お使いのAWSアカウントでDatabircksのセキュリティグループをアップデートする必要があります。ここでは、単一のIPアドレスあるいはオフィス全体のIPアドレスを表現するレンジを指定することができます。

1. AWSコンソールで、Databricksのセキュリティグループを見つけます。`<databricks-instance>-worker-unmanaged`といったラベルとなっています。(例：`dbc-fb3asdddd3-worker-unmanaged`)
1. セキュリティグループを編集し、ワーカーマシンに対するポート`2200`を許可するインバウンドTCPルールを追加します。単一のIPアドレス、あるいはレンジを指定できます。
![](https://docs.databricks.com/_images/ssh-security-group.png)
1. お使いのコンピューターとオフィスが、ポート`2200`に対してTCPトラフィックを送信できることを確認します。

## SSHキーペアの作成

ターミナルセッションで以下のコマンドを実行しSSHのキーペアを作成します。

```bash:Bash
ssh-keygen -t rsa -b 4096 -C "email@example.com"
```

公開鍵、秘密鍵を保存するためのディレクトリへのパスを指定する必要があります。公開鍵は拡張子`.pub`で保存されます。

## 公開鍵を用いた新規クラスターの設定

1. 公開鍵ファイルの全てのコンテンツをコピーします。
1. クラスター設定ページで、**Advanced Options**トグルをクリックします。
1. ページ下部で、**SSH**タブをクリックします。
1. コピーした鍵を**SSH Public Key**フィールドに貼り付けます。
![](https://docs.databricks.com/_images/ssh-input-aws.png)

## 公開鍵を用いた既存クラスターの設定

クラスターがすでにあり、クラスター作成時に公開鍵を指定しなかった場合には、クラスターにアタッチされたノートブックで以下のコードを実行することで、公開鍵を注入することができます。

```scala:Scala
val publicKey = " put your public key here "

def addAuthorizedPublicKey(key: String): Unit = {
  val fw = new java.io.FileWriter("/home/ubuntu/.ssh/authorized_keys", /* append */ true)
  fw.write("\n" + key)
  fw.close()
}

val numExecutors = sc.getExecutorMemoryStatus.keys.size
sc.parallelize(0 until numExecutors, numExecutors).foreach { i =>
  addAuthorizedPublicKey(publicKey)
}
addAuthorizedPublicKey(publicKey)
```

## SparkドライバーノードへのSSH接続

1. クラスター設定ページで、**Advanced Options**トグルをクリックします。
1. **SSH**タブをクリックします。ドライバーノードのホスト名をコピーします。
1. 以下のコマンドを実行します。ホスト名と秘密鍵のファイルパスは置換してください。

    ```bash:Bash
    ssh ubuntu@<hostname> -p 2200 -i <private-key-file-path>
    ```

## SparkワーカーノードへのSSH接続

ドライバーノードへのSSH接続と同じ方法でワーカーノードに接続することができます。

1. クラスター詳細ページで、**Spark Cluster UI - Master**タブをクリックします。
1. Workers Tableで、SSH接続したいワーカーをクリックします。ホスト名フィールドをコピーします。
![](https://docs.databricks.com/_images/hostname.png)

# クラスターログデリバリー

クラスターを作成する際、Sparkドライバーノード、ワーカーノード、イベントに対するログを配信する場所を指定することができます。指定された場所に5分間隔でログが配信されます。クラスターが停止されると、Databricksはクラスターが停止されるまでに生成された全てのログが配信されることを保証します。

ログの格納場所はクラスターIDに依存します。指定された場所が`dbfs:/cluster-log-delivery`の場合、`0630-191345-leap375`に対するクラスターログは`dbfs:/cluster-log-delivery/0630-191345-leap375`に配信されます。

クラスターログ配信の場所を設定するには、以下の手順を踏みます。

1. クラスター設定ページで、**Advanced Options**トグルをクリックします。
1. **Logging**タブをクリックします。
![](https://docs.databricks.com/_images/log-delivery-aws.png)
1. destinationのタイプを選択します。
1. クラスターログのパスを入力します。

## S3バケットの格納場所

S3を格納場所に選択した際には、バケットにアクセスできる様に設定されたインスタンスプロファイルをクラスターに設定する必要があります。このインスタンスプロファイルには`PutObject`と`PutObjectAcl`の両方が必要となります。サンプルのインスタンスプロファイルを以下に示します。どのようにインスタンスプロファイルを設定するのかについては、[Databricksにおけるインスタンスプロファイルを用いたS3バケットへのセキュアなアクセス](https://qiita.com/taka_yayoi/items/446c7971be354f88c679)を参照ください。

```json:JSON
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::<my-s3-bucket>"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:GetObject",
        "s3:DeleteObject"
      ],
      "Resource": [
        "arn:aws:s3:::<my-s3-bucket>/*"
      ]
    }
  ]
}
```

:::note
**注意**
この機能はREST APIでも使用できます。[Clusters API](https://docs.databricks.com/dev-tools/api/latest/clusters.html)と[Cluster log delivery examples](https://docs.databricks.com/dev-tools/api/latest/examples.html#cluster-log-example)を参照ください。
:::

# initスクリプト

クラスターノードの初期化、あるいはinitスクリプトはSparkドライバー、ワーカーのJVMがスタートする*前*にそれぞれのクラスターノードのスタートアップ時に実行されるシェルスクリプトです。Databricksランタイムに含まれていないパッケージ、ライブラリをインストールしたり、JVMのシステムclasspathを変更したり、JVMで使用されるシステムプロパティ、環境変数を設定したり、Spark設定パラメータなどを変更するのにinitスクリプトを使用することができます。

**Advanced Options**セクションを展開し、**Init Scripts**タブをクリックすることで、initスクリプトをアタッチすることができます。

詳細に関しては、[Databricksクラスターノード初期化スクリプト](https://qiita.com/taka_yayoi/items/88cb46be00a175085f87)を参照ください。

### Databricks 無料トライアル

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