🏗️
Databricksクラスターをterraformで管理
はじめに
Databricksのクラスターは各用途や各自の利用ごとなどで構築する。そのため多種多様なクラスターが構築されることになる。Databricksのクラスターは起動していると課金されるため、使わなくなったものは停止する。ピン留めをすれば停止後も保持されるが、ピン留め(上限100個)しなければ停止クラスターは30日で消される[1]。
ピン留めしてクラスターを保持する手もあるが、クラスター管理の視認性やイミュータブルにクラスターを構築できるようにする。そこで、クラスターをterraformを用いて管理できるようにする。
terraform化
構築したリポジトリ
構築ポイント
- 管理対象はクラスターのみとする。
- クラスターはsingle node、multi node(fixed sizeとautoscale)の3パターンterraformモジュールとして用意する。(resource定義の構成がこの3パターンで変わるため。)
- 実際の作成環境は、environmentsフォルダ配下にクラスター単位に作成する構成とする。
- spark_versionやnode_type_idはdata resourceで取得した最新バージョンと最小構成をデフォルト値とし、任意の値を設定できるようにする。
- databricks providerは下記のとおり、すべてのモジュールで定義をする。
- クラスターのpypiやmavenなどはリストで複数指定可能な状態にする。resoure定義において、pypiなどの定義は1ライブラリ単位にlibraryブロックが必要となる。そのため、dynamicブロックを用いて生成する。なお、libraryは任意指定となるため、dynamicブロックにて3項演算子により未指定(null)判定を行う。(下記2リンク参考)
- terraformレジストリ上にはgithubの最新が反映されていない可能性もあり注意が必要である。現時点だとレジストリ上だと最新がv1.5であったが、github上では、v1.9であった。
- 上記のバージョン違いではまったところとして、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
}
-
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