Databricksノートブックを実行したクラスターの詳細情報の取得

Databricksではクラスターにノートブックをアタッチして処理を実行します。

![Screenshot 2024-01-07 at 21.44.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/fc5819ed-c258-c4d0-18ca-24a3ac7ba0b9.png)

再現性確保の観点では、ノートブックをどのような仕様のクラスターで実行したのかを記録しておくことが重要と言えます。

アタッチされているクラスターが存在しているのであれば、保存されている情報から追跡できなくはないですが、途中で設定が変更されてしまったり、クラスターが削除されてしまったりすると追跡は困難です。

ということで、ここでは**ノートブックにクラスターの情報を埋め込む**アプローチをご紹介します。[Databricks SDK for Python](https://learn.microsoft.com/ja-jp/azure/databricks/dev-tools/sdk-python)を使って、アタッチしているクラスターの情報にアクセスします。

# SDKのインストール

```py
%pip install databricks-sdk --upgrade
dbutils.library.restartPython()
```


# アタッチしているクラスターのID取得

SDKで使用するアタッチしているクラスターのIDを取得します。`spark.conf`経由で取得できます。

```py
current_cluster_id = spark.conf.get("spark.databricks.clusterUsageTags.clusterId")
current_cluster_id
```
```
'0830-044559-343hcl1h'
```

# クラスターの仕様へのアクセス


```py
from databricks.sdk import WorkspaceClient
from pprint import pprint

# WorkspaceClient のインスタンスを作成
w = WorkspaceClient()

# 現在のクラスターの情報を取得
current_cluster = w.clusters.get(current_cluster_id)
# クラスターの情報を表示
pprint(vars(current_cluster))
```

ランタイムのバージョン`spark_version`、クラスター名`cluster_name`、アクセスモード`data_security_mode`、ワーカーノード数`num_workers`(シングルノードはワーカー数0です)、インスタンスタイプ`node_type_id`、initスクリプト`init_scripts`など、高度な設定含めたクラスターの情報を取得することができます。また、クラスター作成時にGUIから指定した内容にフォーカスするのであれば、`'spec'`にアクセスします。
```
{'autoscale': None,
 'autotermination_minutes': 4320,
 'aws_attributes': None,
 'azure_attributes': AzureAttributes(availability=<AzureAvailability.ON_DEMAND_AZURE: 'ON_DEMAND_AZURE'>,
                                     first_on_demand=1,
                                     log_analytics_info=None,
                                     spot_bid_max_price=-1.0),
 'cluster_cores': 4.0,
 'cluster_id': '0830-044559-343hcl1h',
 'cluster_log_conf': None,
 'cluster_log_status': None,
 'cluster_memory_mb': 14336,
 'cluster_name': "Takaaki Yayoi's Personal Compute Cluster",
 'cluster_source': <ClusterSource.UI: 'UI'>,
 'creator_user_name': 'takaaki.yayoi@databricks.com',
 'custom_tags': {'ResourceClass': 'SingleNode'},
 'data_security_mode': <DataSecurityMode.SINGLE_USER: 'SINGLE_USER'>,
 'default_tags': {'ClusterId': '0830-044559-343hcl1h',
                  'ClusterName': "Takaaki Yayoi's Personal Compute Cluster",
                  'Creator': 'takaaki.yayoi@databricks.com',
                  'Vendor': 'Databricks',
                  'owner': 'xxxxx@databricks.com'},
 'docker_image': None,
 'driver': SparkNode(host_private_ip='xxx.xxx.xxx.xxx',
                     instance_id='7ec1d4d58fc04c12854282f329ba82e0',
                     node_aws_attributes=None,
                     node_id='6315c366f0704725b8a9fd0fedf6d8af',
                     private_ip='xxx.xxx.xxx.xxx',
                     public_dns='xxx.xxx.xxx.xxx',
                     start_timestamp=1724993301783),
 'driver_instance_pool_id': None,
 'driver_node_type_id': 'Standard_DS3_v2',
 'enable_elastic_disk': True,
 'enable_local_disk_encryption': False,
 'executors': [],
 'gcp_attributes': None,
 'init_scripts': [],
 'instance_pool_id': None,
 'jdbc_port': 10000,
 'last_restarted_time': 1724993497711,
 'last_state_loss_time': 0,
 'node_type_id': 'Standard_DS3_v2',
 'num_workers': 0,
 'policy_id': 'D96308F1BF0003A7',
 'runtime_engine': <RuntimeEngine.STANDARD: 'STANDARD'>,
 'single_user_name': 'takaaki.yayoi@databricks.com',
 'spark_conf': {'spark.databricks.cluster.profile': 'singleNode',
                'spark.master': 'local[*, 4]'},
 'spark_context_id': 4577072528423978100,
 'spark_env_vars': None,
 'spark_version': '15.4.x-cpu-ml-scala2.12',
 'spec': CreateCluster(spark_version='15.4.x-cpu-ml-scala2.12',
                       apply_policy_default_values=True,
                       autoscale=None,
                       autotermination_minutes=4320,
                       aws_attributes=None,
                       azure_attributes=None,
                       cluster_log_conf=None,
                       cluster_name="Takaaki Yayoi's Personal Compute Cluster",
                       cluster_source=None,
                       custom_tags=None,
                       data_security_mode=<DataSecurityMode.SINGLE_USER: 'SINGLE_USER'>,
                       docker_image=None,
                       driver_instance_pool_id=None,
                       driver_node_type_id=None,
                       enable_elastic_disk=None,
                       enable_local_disk_encryption=None,
                       gcp_attributes=None,
                       init_scripts=[],
                       instance_pool_id=None,
                       node_type_id='Standard_DS3_v2',
                       num_workers=0,
                       policy_id='D96308F1BF0003A7',
                       runtime_engine=<RuntimeEngine.STANDARD: 'STANDARD'>,
                       single_user_name=None,
                       spark_conf=None,
                       spark_env_vars=None,
                       ssh_public_keys=None,
                       workload_type=None),
 'ssh_public_keys': None,
 'start_time': 1724993160168,
 'state': <State.RUNNING: 'RUNNING'>,
 'state_message': '',
 'terminated_time': None,
 'termination_reason': None,
 'workload_type': None}
```

取得できる情報に関しては、[databricks.sdk.service.compute.ClusterDetails](https://databricks-sdk-py.readthedocs.io/en/latest/dbdataclasses/compute.html#databricks.sdk.service.compute.ClusterDetails)をご覧ください。

# クラスターライブラリ

以下のように[クラスターライブラリ](https://learn.microsoft.com/ja-jp/azure/databricks/libraries/cluster-libraries)としてインストールされたライブラリの情報にもアクセスできます。

![Screenshot 2024-08-30 at 14.05.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/09183b90-c813-5790-83e6-3ecdffb6d383.png)

詳細は[w\.libraries: Managed Libraries](https://databricks-sdk-py.readthedocs.io/en/latest/workspace/compute/libraries.html)をご覧ください。

```py
installed_libraries = w.libraries.cluster_status(current_cluster_id)
for library in installed_libraries:
    pprint(vars(library))
```
```
{'is_library_for_all_clusters': False,
 'library': Library(cran=None,
                    egg=None,
                    jar=None,
                    maven=None,
                    pypi=PythonPyPiLibrary(package='bamboolib==1.30.19',
                                           repo=None),
                    whl=None),
 'messages': None,
 'status': <LibraryFullStatusStatus.INSTALLED: 'INSTALLED'>}
```

出力はノートブックに埋め込まれる形になりますので、ノートブックを参照すれば確実なクラスターの情報にアクセスできることになります。ご活用ください！

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

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