0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🔓【裏技】Databricks SQL WarehouseをAPIで1分自動停止に設定する方法 🚀

0
Posted at

💡 発見した裏技の概要

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👍をお願いします!

コメント欄で皆さんの環境での削減効果も教えてください 💬 質問や改善提案も大歓迎です 🙌

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?