💡 発見した裏技の概要
Databricks Serverless SQL Warehouseは驚異的な性能を持ち、わずか5秒で起動します ⚡
この高速起動を最大限に活かすため、自動停止時間を1分に設定する裏技を発見しました 🎯
🤔 GUIとAPIの設定可能値の違い
Databricksの管理コンソール(GUI)とREST APIでは、設定可能な自動停止時間に違いがあります。
📊 GUIで設定可能:5分以上のみ
🔥 APIで設定可能:1分から可能!(1分、2分、3分、4分もOK)
この違いを活用することで、より細かいコスト最適化が実現できます 💰
⚡ なぜ1分設定が有効なのか
Serverless SQL Warehouseは5秒という高速起動を実現しています 🚀 この特性を考慮すると、アイドル時間を1分に設定することで、使用パターンに応じた最適な運用が可能になります。
例えば、断続的にクエリを実行する開発環境では、1分設定により必要な時だけリソースを確保し、使用していない時間を最小化できます 📉
🛠️ 実装方法
Databricksノートブックで以下のコードを実行することで、GUIでは設定できない1分自動停止を実現できます 🎉
⚙️ 設定パラメータ
# 🎯 Warehouse IDと自動停止時間の設定
WAREHOUSE_ID = "your_warehouse_id_here" # 対象のWarehouse ID
AUTO_STOP_MINUTES = 1 # 🔥 APIなら1分設定が可能!
import requests
import json
from time import sleep
🔐 認証情報の取得
# 🔑 Databricks環境から認証情報を自動取得
host = "https://" + dbutils.notebook.entry_point.getDbutils().notebook().getContext().browserHostName().get()
headers = {
"Authorization": "Bearer " + dbutils.notebook.entry_point.getDbutils().notebook().getContext().apiToken().get(),
"Content-Type": "application/json"
}
api_base = f"{host}/api/2.0/sql/warehouses"
print(f"✅ 認証情報を取得しました")
print(f"📍 対象Warehouse ID: {WAREHOUSE_ID}")
print(f"⚙️ 設定する自動停止時間: {AUTO_STOP_MINUTES}分")
📋 現在の設定確認関数
def get_warehouse_config(warehouse_id):
"""
📊 SQL Warehouseの現在の設定を取得
"""
url = f"{api_base}/{warehouse_id}"
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
config = response.json()
print(f"✅ 現在のWarehouse設定を取得しました")
print(f" 📝 Name: {config.get('name')}")
print(f" 🚦 State: {config.get('state')}")
print(f" ⏰ Current Auto-stop: {config.get('auto_stop_mins', 'Not set')} minutes")
print(f" 📏 Cluster Size: {config.get('cluster_size')}")
print(f" 🏷️ Warehouse Type: {config.get('warehouse_type', 'CLASSIC')}")
return config
except requests.exceptions.RequestException as e:
print(f"❌ エラー: Warehouse設定の取得に失敗しました")
print(f" 📝 詳細: {e}")
raise
🔄 自動停止時間を更新する関数
def update_auto_stop_mins(warehouse_id, auto_stop_mins):
"""
🔥 SQL WarehouseのAuto Stop時間を更新
APIを使用することで1分設定も可能 💡
"""
# 現在の設定を取得
print("=" * 60)
print("📋 現在のWarehouse設定を取得中...")
current_config = get_warehouse_config(warehouse_id)
# 🛠️ 更新パラメータを準備
update_params = {
"id": warehouse_id,
"name": current_config.get("name"),
"cluster_size": current_config.get("cluster_size"),
"auto_stop_mins": auto_stop_mins # 🎯 ここがポイント!
}
# オプショナルパラメータを既存設定から追加
optional_params = [
"max_num_clusters",
"enable_photon",
"enable_serverless_compute",
"warehouse_type",
"spot_instance_policy",
"channel",
"tags"
]
for param in optional_params:
if param in current_config:
update_params[param] = current_config[param]
if "max_num_clusters" not in update_params:
update_params["max_num_clusters"] = 1
print("=" * 60)
print(f"🔄 Auto-stop時間を {auto_stop_mins} 分に更新中...")
url = f"{api_base}/{warehouse_id}/edit"
try:
response = requests.post(url, headers=headers, json=update_params)
response.raise_for_status()
print(f"✅ 正常に更新されました")
# 🔍 更新の確認
sleep(2)
print("=" * 60)
print("📋 更新後の設定を確認中...")
updated_config = get_warehouse_config(warehouse_id)
if updated_config.get('auto_stop_mins') == auto_stop_mins:
print("=" * 60)
print(f"🎉 成功: Auto-stop時間が {auto_stop_mins} 分に設定されました")
return True
except requests.exceptions.RequestException as e:
print(f"❌ エラー: Warehouse設定の更新に失敗しました")
print(f" 📝 詳細: {e}")
raise
🚀 メイン実行処理
print("🚀 Databricks SQL Warehouse 自動停止時間設定スクリプト")
print("=" * 60)
print(f"🎯 対象Warehouse ID: {WAREHOUSE_ID}")
print(f"⏰ 設定する自動停止時間: {AUTO_STOP_MINUTES} 分")
print("=" * 60)
try:
# 🔥 Auto-stop時間を更新
update_auto_stop_mins(WAREHOUSE_ID, AUTO_STOP_MINUTES)
print("=" * 60)
print("✅ すべての処理が完了しました 🎉")
except Exception as e:
print("=" * 60)
print(f"❌ 処理中にエラーが発生しました: {e}")
print("\n💡 ヒント:")
print(" 1️⃣ Warehouse IDが正しいか確認してください")
print(" 2️⃣ Warehouseが存在し、アクセス権限があるか確認してください")
print(" 3️⃣ DatabricksノートブックまたはJobsから実行しているか確認してください")
📊 設定結果の確認
実行後、以下のような出力で設定変更を確認できます 👀
設定前:
📝 Name: XXS 4DBU 5分 プレビュー
⏰ Current Auto-stop: 5 minutes
設定後:
📝 Name: XXS 4DBU 5分 プレビュー
⏰ Current Auto-stop: 1 minutes ← 🔥 1分に変更成功!
🎯 活用シーン
この裏技は以下のような場面で特に有効です 💪
🛠️ 開発・テスト環境での活用
開発中は頻繁にクエリを実行したり停止したりするため、1分設定により素早いリソース解放が実現できます ⚡
📊 アドホッククエリの実行環境
不定期にクエリを実行する分析環境では、使用していない時間を最小限に抑えることができます 📉
🌟 すべてのWarehouseを一括更新
複数のWarehouseを管理している場合は、以下のコードですべてのWarehouseをリスト表示し、一括更新も可能です 🚀
def list_all_warehouses():
"""
📋 すべてのSQL Warehousesをリスト表示
"""
url = api_base
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
warehouses = response.json().get('warehouses', [])
print("=" * 60)
print("📊 利用可能なSQL Warehouses:")
print("-" * 60)
for wh in warehouses:
print(f" 🏢 Name: {wh.get('name')}")
print(f" 🆔 ID: {wh.get('id')}")
print(f" 🚦 State: {wh.get('state')}")
print(f" ⏰ Auto-stop: {wh.get('auto_stop_mins', 'Not set')} minutes")
print(f" 📏 Size: {wh.get('cluster_size')}")
print("-" * 60)
return warehouses
except requests.exceptions.RequestException as e:
print(f"❌ エラー: Warehouseリストの取得に失敗しました")
return []
# 🔥 実行
warehouses = list_all_warehouses()
# 💡 すべてのWarehouseを1分設定に変更
for wh in warehouses:
print(f"🔄 更新中: {wh['name']}")
update_auto_stop_mins(wh['id'], 1)
print(f"✅ 完了: {wh['name']}\n")
💰 コスト削減効果のシミュレーション
📈 実際の削減例
🕐 1日の使用パターン例:
• クエリ実行回数:50回
• 1クエリの処理時間:平均30秒
• 業務時間:8時間
📊 デフォルト設定(5分)の場合:
• 総アイドル時間:250分 😱
• 実質稼働時間:25分
⚡ 1分設定の場合:
• 総アイドル時間:50分 🎉
• 実質稼働時間:25分
💰 削減効果:アイドル時間を200分削減!
🏆 まとめ
この裏技により、以下のメリットが得られます:
✅ GUIでは不可能な1分設定を実現 🔓
✅ Serverless SQL Warehouseの5秒起動を最大活用 ⚡
✅ 不要なアイドル時間を大幅削減 💰
✅ 開発効率とコスト効率の両立 🚀
🔗 関連リソース
📚 Databricks SQL Warehouses Documentation
🛠️ Databricks REST API Reference
💡 Databricks Cost Optimization Guide
この記事が役に立ったら、ぜひストック⭐とLGTM👍をお願いします!
コメント欄で皆さんの環境での削減効果も教えてください 💬 質問や改善提案も大歓迎です 🙌