🏗️

Databricksクラスターをterraformで管理

2023/01/24に公開

はじめに

Databricksのクラスターは各用途や各自の利用ごとなどで構築する。そのため多種多様なクラスターが構築されることになる。Databricksのクラスターは起動していると課金されるため、使わなくなったものは停止する。ピン留めをすれば停止後も保持されるが、ピン留め(上限100個)しなければ停止クラスターは30日で消される[1]
ピン留めしてクラスターを保持する手もあるが、クラスター管理の視認性やイミュータブルにクラスターを構築できるようにする。そこで、クラスターをterraformを用いて管理できるようにする。

terraform化

構築したリポジトリ

https://github.com/tjtjtjtj54/terraform-databricks

構築ポイント

  • 管理対象はクラスターのみとする。
  • クラスターはsingle node、multi node(fixed sizeとautoscale)の3パターンterraformモジュールとして用意する。(resource定義の構成がこの3パターンで変わるため。)
  • 実際の作成環境は、environmentsフォルダ配下にクラスター単位に作成する構成とする。
  • spark_versionやnode_type_idはdata resourceで取得した最新バージョンと最小構成をデフォルト値とし、任意の値を設定できるようにする。
  • databricks providerは下記のとおり、すべてのモジュールで定義をする。

https://kb.databricks.com/en_US/terraform/terraform-registry-does-not-have-a-provider-error

  • クラスターのpypiやmavenなどはリストで複数指定可能な状態にする。resoure定義において、pypiなどの定義は1ライブラリ単位にlibraryブロックが必要となる。そのため、dynamicブロックを用いて生成する。なお、libraryは任意指定となるため、dynamicブロックにて3項演算子により未指定(null)判定を行う。(下記2リンク参考)

https://community.databricks.com/s/question/0D53f00001GHVgZCAX/how-to-attach-multiple-libraries-to-a-cluster-terraform-in-databricks

https://stackoverflow.com/questions/65357827/how-to-handle-optional-dynamic-blocks-in-terraform

  • terraformレジストリ上にはgithubの最新が反映されていない可能性もあり注意が必要である。現時点だとレジストリ上だと最新がv1.5であったが、github上では、v1.9であった。

https://registry.terraform.io/providers/databrickslabs/databricks/latest/docs/resources/cluster
https://github.com/databricks/terraform-provider-databricks/releases

  • 上記のバージョン違いではまったところとして、v1.8からlocal_disk_min_sizeのパラメータが追加された。当初v1.5で構築しており、Standard_DS3_v2を指定したかったが、coreとmemoryの指定ではStandard_D4as_v5になってしまった。調査したところ、v1.8で追加されたlocal_disk_min_sizeでディスクサイズの指定も含め行わないとStandard_DS3_v2が指定できない。
  • 下記のStandard_DS3_v2とStandard_D4as_v5のjsonファイルを見るとわかるが、前者はlocal_disksがあるが、後者はない。そのため、coreとmemoryの指定だけでは後者のほうが最小と捉えられて選出された。(クラスターのnode_typeは指定したcoreなどのリソースから最初のタイプを選定するようになっている。)
    https://github.com/databricks/terraform-provider-databricks/pull/1856
Standard_DS3_v2
{
    "node_type_id": "Standard_DS3_v2",
    "memory_mb": 14336,
    "num_cores": 4,
    "description": "Standard_DS3_v2",
    "instance_type_id": "Standard_DS3_v2",
    "is_deprecated": false,
    "category": "General Purpose",
    "support_ebs_volumes": true,
    "support_cluster_tags": true,
    "num_gpus": 0,
    "node_instance_type": {
        "instance_type_id": "Standard_DS3_v2",
        "local_disks": 1,
        "local_disk_size_gb": 28,
        "instance_family": "Standard DSv2 Family vCPUs",
        "local_nvme_disk_size_gb": 0,
        "local_nvme_disks": 0,
        "swap_size": "10g"
    },
    "is_hidden": false,
    "support_port_forwarding": true,
    "display_order": 0,
    "is_io_cache_enabled": false,
    "node_info": {
        "available_core_quota": 374,
        "total_core_quota": 422
    },
    "photon_worker_capable": false,
    "photon_driver_capable": false,
    "is_encrypted_in_transit": false,
    "is_graviton": false,
    "require_fabric_manager": false
}
Standard_D4as_v5
{
    "node_type_id": "Standard_D4as_v5",
    "memory_mb": 16384,
    "num_cores": 4,
    "description": "Standard_D4as_v5 (beta)",
    "instance_type_id": "Standard_D4as_v5",
    "is_deprecated": false,
    "category": "General Purpose",
    "support_ebs_volumes": true,
    "support_cluster_tags": true,
    "num_gpus": 0,
    "node_instance_type": {
        "instance_type_id": "Standard_D4as_v5",
        "local_disks": 0,
        "local_disk_size_gb": 0,
        "instance_family": "Standard DASv5 Family vCPUs",
        "local_nvme_disk_size_gb": 0,
        "local_nvme_disks": 0,
        "swap_size": "10g"
    },
    "is_hidden": false,
    "support_port_forwarding": true,
    "display_order": 0,
    "is_io_cache_enabled": false,
    "node_info": {
        "available_core_quota": 350,
        "total_core_quota": 350
    },
    "photon_worker_capable": true,
    "photon_driver_capable": true,
    "is_encrypted_in_transit": false,
    "is_graviton": false,
    "require_fabric_manager": false
}
脚注
  1. https://docs.databricks.com/clusters/clusters-manage.html?searchString=&from=0&sortby=_score&orderBy=desc&pageNo=1&aggregations=[]&uid=7dc8d13f-90bb-11e9-98a5-06d762ad9a62&resultsPerPage=10&exactPhrase=&withOneOrMore=&withoutTheWords=&pageSize=10&language=en&state=3&suCaseCreate=false#pin-a-cluster ↩︎

Discussion