Databricksのシングルノードクラスター

[Single Node clusters \| Databricks on AWS](https://docs.databricks.com/clusters/single-node.html) [2021/6/16時点]の翻訳です。

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

シングルノードクラスターはApache Sparkのドライバーで構成されるクラスターであり、ワーカーはありません。シングルノードクラスターは[Delta Lake](https://qiita.com/taka_yayoi/items/345f503d5f8177084f24)を含む全てのSparkデータソース、Sparkジョブをサポートしています。スタンダードクラスターでは、Sparkジョブを実行するために最低1台のSparkワーカーが必要となります。

以下のようなケースでシングルノードクラスターは役立ちます。

- データのロード、セーブにSparkを使用するシングルノードの機械学習ワークロード。
- ライトな探索的データ分析。

# シングルノードクラスターの作成

シングルノードクラスターを作成するには、[クラスターを設定](https://qiita.com/taka_yayoi/items/8d951b660cd87c6c5f18#%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%A2%E3%83%BC%E3%83%89)する際に**Cluster Mode**を**Single Node**に設定します。
![](https://docs.databricks.com/_images/single-node.png)

# シングルノードクラスターの特徴

シングルノードクラスターには以下の特徴があります。

- Sparkはローカルで実行されます。
- ワーカーノードがないため、ドライバーがマスターかつワーカーとして動作します。
- 論理的コアに対して1つのエグゼキュータースレッドが起動します。1コアはドライバー分となります。
- すべての`stderr`、`stdout`、`log4j`出力はドライバーログに保存されます。
- シングルノードクラスターをスタンダードクラスターに変更することはできません。スタンダードクラスターを使用するには、スタンダードクラスターを作成し、ノートブックをアタッチしてください。

# 制限

- 大規模なデータ処理は、シングルノードクラスターのリソースを全て使い尽くす場合があります。このようなワークロードに対しては、スタンダードクラスターを使用することをお勧めします。
- シングルノードクラスターは共有を目的としたものではありません。リソース競合を回避するためには、クラスターを共有する際にはスタンダードモードのクラスターを使用することをお勧めします。
- スタンダードクラスターは0個のワーカーにスケールすることはできません。この場合には、シングルノードクラスターを使ってください。
- シングルノードクラスターはプロセス分離との互換性はありません。
- シングルノードクラスターではGPUスケジューリングは有効化されません。
- シングルノードクラスターでは、SparkはUDTカラムを持つParquetファイルを読み込むことができません。以下のようなエラーが発生します。

    ```
The Spark driver has stopped unexpectedly and is restarting. Your notebook will be automatically reattached.
    ```

    この問題を回避するには、ネイティブのParquetリーダーを無効にします。

    ```py:Python
spark.conf.set("spark.databricks.io.parquet.nativeReader.enabled", False)
    ```

# REST API

[シングルノードクラスターを作成](https://docs.databricks.com/dev-tools/api/latest/clusters.html#clusterclusterservicecreatecluster)するためにClusers APIを使用することができます。

# シングルノードクラスターのポリシー

[クラスターポリシー](https://docs.databricks.com/administration-guide/clusters/policies.html)を用いることで、シングルノードクラスターの設定をシンプルにすることができます。

クラスター作成権限を持たないメンバーがいるデータサイエンスチームの例を考えてみます。管理者は[プール](https://qiita.com/taka_yayoi/items/919acd7ef9decf0f61e6)と[クラスターポリシー](https://docs.databricks.com/administration-guide/clusters/policies.html)を用いて、チームメンバーがある最大数のシングルノードクラスターの作成を許可するクラスターポリシーを作成することができます。

1. [プール](https://qiita.com/taka_yayoi/items/919acd7ef9decf0f61e6)を作成します。
    1. **Max capacity**を`10`に設定します。
    1. **Autopilot options**で**autoscaling enabled for local storage**を有効化します。
    1. **Instance type**を**Single Node cluster**に設定します。
    1. Databricksのバージョンを選択します。可能であれば最新のバージョンを使用することをお勧めします。
    1. **Create**をクリックします。

    プールのプロパティページが表示されます。新規に作成したプールのプールIDとインスタンスタイプIDをメモしておきます。
1. [クラスターポリシー](https://docs.databricks.com/administration-guide/clusters/policies.html)を作成します。
    - プールのプロパティから取得したプールIDとインスタンスタイプIDを設定します。
    - 必要に応じて[制約](https://docs.databricks.com/administration-guide/clusters/policies.html)を指定します。
1. チームメンバーにクラスターポリシーへのアクセスを許可します。ユーザー管理をシンプルにするために[ユーザーとグループの管理](https://docs.databricks.com/administration-guide/users-groups/index.html)を活用することができます。

```json:JSON
{
  "spark_conf.spark.databricks.cluster.profile": {
    "type": "fixed",
    "value": "singleNode",
    "hidden": true
  },
  "instance_pool_id": {
    "type": "fixed",
    "value": "singleNodePoolId1",
    "hidden": true
  },
  "spark_version": {
    "type": "fixed",
    "value": "7.3.x-cpu-ml-scala2.12",
    "hidden": true
  },
  "autotermination_minutes": {
    "type": "fixed",
    "value": 120,
    "hidden": true
  },
  "num_workers": {
    "type": "fixed",
    "value": 0,
    "hidden": true
  },
  "docker_image.url": {
    "type": "forbidden",
    "hidden": true
  }
}
```

# シングルノードジョブクラスターのポリシー

ジョブに対するクラスターのポリシーを設定するために、同様のクラスターポリシーを定義することができます。`cluster_type.type`を`fixed`、`cluster_type.value`を`job`に設定します。`auto_termination_minutes`を参照している箇所を全て削除します。

```json:JSON
{
  "cluster_type": {
    "type": "fixed",
    "value": "job"
  },
  "spark_conf.spark.databricks.cluster.profile": {
    "type": "fixed",
    "value": "singleNode",
    "hidden": true
  },
  "instance_pool_id": {
    "type": "fixed",
    "value": "singleNodePoolId1",
    "hidden": true
  },
  "num_workers": {
    "type": "fixed",
    "value": 0,
    "hidden": true
  },
  "spark_version": {
    "type": "fixed",
    "value": "7.3.x-cpu-ml-scala2.12",
    "hidden": true
  },
  "docker_image.url": {
    "type": "forbidden",
    "hidden": true
  }
}
```


### Databricks 無料トライアル

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