> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sifi.life/llms.txt
> Use this file to discover all available pages before exploring further.

# Serverless 비용 모델과 마이그레이션

> 이 문서는 **[컴퓨트](/training/04-compute-and-workspace/overview)** 섹션의 일부입니다.

## DBU (Databricks Unit)

> 💡 **DBU(Databricks Unit)** 는 Databricks의 과금 단위입니다. 사용한 컴퓨팅 리소스의 양을 DBU로 환산하여 과금합니다. DBU당 단가는 워크로드 유형(SQL, Jobs, All-Purpose 등)과 요금 플랜에 따라 다릅니다.

## 서버리스 vs 클래식 비용 비교

서버리스의 DBU 단가는 클래식보다 높지만, **총 비용(TCO)** 은 서버리스가 더 낮은 경우가 많습니다.

| 비용 요소          | Customer-Managed | Serverless  |
| -------------- | ---------------- | ----------- |
| DBU 단가         | 낮음               | 높음          |
| 클라우드 VM 비용     | 별도 과금            | **DBU에 포함** |
| 유휴 비용          | 발생 (자동 종료 전)     | **없음**      |
| 관리 인건비         | 높음 (클러스터 운영)     | 낮음          |
| 런타임 업그레이드 비용   | 테스트/마이그레이션 필요    | **없음**(자동)  |
| **총 비용 (TCO)** | 상황에 따라           | **보통 더 저렴** |

| 비용 항목             | 클래식 비용 구조      | 서버리스 비용 구조    |
| ----------------- | -------------- | ------------- |
| Databricks DBU 비용 | 포함             | 포함            |
| 클라우드 VM 비용        | 별도 과금          | DBU에 포함       |
| 유휴 시간 비용          | 발생 (자동 종료 전까지) | 없음 (즉시 반환)    |
| 총 비용              | DBU + VM + 유휴  | DBU만 (사용한 만큼) |

### 비용 최적화 팁

| 팁                        | 설명                                          |
| ------------------------ | ------------------------------------------- |
| **Auto-Stop 활용**         | 서버리스는 유휴 시 즉시 해제되므로 별도 설정 없이 비용이 절감됩니다      |
| **적절한 사이즈**              | SQL Warehouse는 필요한 최소 사이즈로 시작하고, 필요 시 확장합니다 |
| **예약 용량(Committed Use)** | 장기 사용이 확실하면 예약 용량 할인을 활용합니다                 |
| **시스템 테이블 모니터링**         | `system.billing.usage`로 비용을 추적하고 이상을 감지합니다  |

```sql theme={null}
-- 서버리스 vs 클래식 비용 비교 쿼리
SELECT
    sku_name,
    billing_origin_product,
    SUM(usage_quantity) AS total_dbus,
    COUNT(DISTINCT usage_date) AS active_days,
    ROUND(SUM(usage_quantity) / COUNT(DISTINCT usage_date), 1) AS avg_daily_dbus
FROM system.billing.usage
WHERE usage_date >= CURRENT_DATE() - INTERVAL 30 DAY
  AND billing_origin_product IN ('JOBS_COMPUTE', 'JOBS_SERVERLESS',
                                  'SQL_COMPUTE', 'SQL_SERVERLESS',
                                  'ALL_PURPOSE_COMPUTE', 'INTERACTIVE_SERVERLESS')
GROUP BY sku_name, billing_origin_product
ORDER BY total_dbus DESC;
```

***

## 제한사항 및 주의사항

| 제한사항                | 설명                            | 대안                                          |
| ------------------- | ----------------------------- | ------------------------------------------- |
| **GPU 미지원**         | 서버리스에서 GPU 워크로드는 실행할 수 없습니다   | 딥러닝 학습은 Customer-Managed 클러스터를 사용합니다        |
| **Spark 설정 제한**     | 일부 Spark 설정을 직접 변경할 수 없습니다    | 대부분의 최적화가 자동 적용됩니다                          |
| **Init Script 미지원** | 기존 Init Script를 직접 사용할 수 없습니다 | Environment 설정으로 대체합니다                      |
| **커스텀 Docker 미지원**  | 사용자 정의 Docker 이미지를 사용할 수 없습니다 | Environment에서 라이브러리를 지정합니다                  |
| **네트워크 제약**         | 기본적으로 고객 VPC 내부 리소스에 접근 불가합니다 | SNC(Serverless Network Connectivity)를 설정합니다 |
| **리전 가용성**          | 일부 클라우드 리전에서는 사용이 불가할 수 있습니다  | 지원 리전 목록을 확인합니다                             |

> ⚠️ **중요**: 서버리스로 전환하기 전에, 기존 워크로드가 위 제한사항에 해당하지 않는지 반드시 확인하시기 바랍니다. 특히 Init Script, 커스텀 Spark 설정, 특수 라이브러리(JNI 등)를 사용하는 경우 호환성 테스트가 필요합니다.

***

## 마이그레이션 가이드 (클래식 → 서버리스)

### 마이그레이션 단계

| 단계          | 설명          |
| ----------- | ----------- |
| 1. 현황 분석    | 워크로드 목록 파악  |
| 2. 호환성 확인   | 제한사항 체크     |
| 3. 파일럿 전환   | 비핵심 워크로드 먼저 |
| 4. 성능/비용 비교 | 기존 대비 평가    |
| 5. 점진적 확대   | 핵심 워크로드 전환  |

### Step 1: 현황 분석

```sql theme={null}
-- 현재 클러스터 사용 현황 분석
SELECT
    cluster_name,
    cluster_source,
    COUNT(*) AS job_count,
    SUM(usage_quantity) AS total_dbus
FROM system.billing.usage u
JOIN system.compute.clusters c ON u.usage_metadata.cluster_id = c.cluster_id
WHERE usage_date >= CURRENT_DATE() - INTERVAL 30 DAY
GROUP BY cluster_name, cluster_source
ORDER BY total_dbus DESC;
```

### Step 2: 호환성 체크리스트

| 체크 항목                | 확인 방법                                 |
| -------------------- | ------------------------------------- |
| Init Script 사용 여부    | 클러스터 설정에서 Init Script 확인합니다           |
| 커스텀 Spark 설정         | `spark.conf.get()` 또는 클러스터 설정에서 확인합니다 |
| 특수 라이브러리 (JNI, C 확장) | 클러스터의 라이브러리 목록을 확인합니다                 |
| VPC 내부 접근 필요 여부      | 온프레미스 DB, Private Link 사용 여부를 확인합니다   |
| GPU 사용 여부            | 클러스터 노드 타입에 GPU 인스턴스가 있는지 확인합니다       |

### Step 3: Job 마이그레이션 예시

```yaml theme={null}
# Before: Customer-Managed 클러스터 사용
resources:
  jobs:
    my_job:
      tasks:
        - task_key: "etl"
          existing_cluster_id: "0123-456789-abcdef"
          notebook_task:
            notebook_path: "/Workspace/etl/pipeline"

# After: 서버리스로 전환
resources:
  jobs:
    my_job:
      tasks:
        - task_key: "etl"
          # existing_cluster_id 제거
          environment_key: "default"
          notebook_task:
            notebook_path: "/Workspace/etl/pipeline"
      environments:
        - environment_key: "default"
          spec:
            client: "1"
            dependencies:
              - "pandas>=2.0"
```

### Step 4: 성능/비용 비교

마이그레이션 후 최소 2주간 성능과 비용을 비교합니다.

```sql theme={null}
-- 마이그레이션 전후 비교
SELECT
    CASE
        WHEN billing_origin_product LIKE '%SERVERLESS%' THEN 'Serverless'
        ELSE 'Classic'
    END AS compute_type,
    SUM(usage_quantity) AS total_dbus,
    COUNT(DISTINCT usage_date) AS active_days
FROM system.billing.usage
WHERE usage_date >= CURRENT_DATE() - INTERVAL 14 DAY
  AND billing_origin_product IN ('JOBS_COMPUTE', 'JOBS_SERVERLESS')
GROUP BY 1;
```

***

## 언제 서버리스를 사용하고, 언제 클래식을 사용하나요?

| 상황              | 추천           | 이유                                 |
| --------------- | ------------ | ---------------------------------- |
| SQL 분석, 대시보드    | ✅ Serverless | 즉시 시작, SQL 최적화가 자동 적용됩니다           |
| 노트북 개발, 프로토타이핑  | ✅ Serverless | 빠른 반복 개발이 가능합니다                    |
| 정기 ETL Jobs     | ✅ Serverless | 관리 간소화, 비용 효율적입니다                  |
| SDP 파이프라인       | ✅ Serverless | 파이프라인별 리소스 자동 관리됩니다                |
| GPU 워크로드 (딥러닝)  | ❌ 클래식        | 서버리스에서 GPU를 지원하지 않습니다              |
| 특정 라이브러리/JNI 필요 | ⚠️ 상황에 따라    | 서버리스 Environment로 해결 가능한지 먼저 확인합니다 |
| 극도로 세밀한 클러스터 튜닝 | ❌ 클래식        | 노드 타입, Spark 설정을 직접 제어해야 할 때 사용합니다 |
| VPC 내부 리소스 접근   | ⚠️ SNC 필요    | SNC 설정 후 서버리스 사용이 가능합니다            |

***

## 정리

| 핵심 개념             | 설명                                              |
| ----------------- | ----------------------------------------------- |
| **Serverless**    | 인프라 관리 없이 코드만 실행하면 자동으로 리소스가 할당됩니다              |
| **즉시 시작**         | 사전 예열된 VM 풀에서 수 초 내에 시작됩니다                      |
| **자동 비용 관리**      | 유휴 시 즉시 리소스를 해제하여 불필요한 비용이 발생하지 않습니다            |
| **Databricks 관리** | VM, 런타임, 보안 패치 등을 Databricks가 자동으로 관리합니다        |
| **SNC**           | 서버리스에서 고객 VPC 내부 리소스에 안전하게 접근하는 방법입니다           |
| **Environment**   | 서버리스에서 Python 라이브러리를 관리하는 방법입니다                 |
| **DBU**           | Databricks의 컴퓨팅 과금 단위이며, 서버리스는 VM 비용이 포함되어 있습니다 |

이것으로 **컴퓨트와 워크스페이스** 섹션을 마치겠습니다. 다음 섹션에서는 실제 [데이터 엔지니어링](../05-data-engineering/README) 파이프라인 구축 방법을 알아보겠습니다.

***

## 참고 링크

* [Databricks: Serverless compute](https://docs.databricks.com/aws/en/serverless-compute/)
* [Databricks: Serverless Networking](https://docs.databricks.com/aws/en/serverless-compute/serverless-connectivity.html)
* [Databricks: Serverless Environment](https://docs.databricks.com/aws/en/serverless-compute/serverless-environment.html)
* [Azure Databricks: Serverless compute](https://learn.microsoft.com/en-us/azure/databricks/serverless-compute/)
* [Databricks: Pricing](https://www.databricks.com/pricing)
* [Databricks Blog: Serverless Compute](https://www.databricks.com/blog/serverless-compute)
