Skip to main content

Managed vs External Volume 심화

두 Volume 유형의 선택은 데이터 관리 전략에 중요한 영향을 미칩니다.

상세 비교

비교 항목Managed VolumeExternal Volume
스토리지 위치UC Metastore의 기본 경로 하위에 자동 생성사용자가 지정한 클라우드 스토리지 경로
스토리지 비용Databricks 관리 버킷에 포함고객 클라우드 스토리지 비용 별도 발생
데이터 삭제 시Volume 삭제 시 데이터도 함께 삭제Volume 삭제해도 원본 데이터 유지
외부 접근Databricks를 통해서만 접근클라우드 네이티브 도구(AWS CLI, azcopy)로도 접근 가능
기존 데이터 연결불가 (새로 업로드 필요)기존 스토리지의 데이터를 그대로 연결 가능
권한 모델UC 권한만 적용UC 권한 + 클라우드 IAM 이중 체크
Storage Credential불필요External Location + Storage Credential 필요
백업/복제Databricks가 관리하는 내구성 정책고객이 클라우드 복제(Cross-Region 등) 직접 관리

External Volume 설정 과정

-- 1. Storage Credential 생성 (관리자)
CREATE STORAGE CREDENTIAL my_s3_credential
WITH (
    AWS_IAM_ROLE.ROLE_ARN = 'arn:aws:iam::123456789012:role/databricks-external-volume-role'
);

-- 2. External Location 생성 (관리자)
CREATE EXTERNAL LOCATION my_external_location
URL 's3://my-company-data-lake/volumes/'
WITH (STORAGE CREDENTIAL my_s3_credential);

-- 3. External Volume 생성
CREATE EXTERNAL VOLUME production.ecommerce.external_data
LOCATION 's3://my-company-data-lake/volumes/ecommerce/'
COMMENT '기존 S3 데이터를 UC로 거버넌스';

선택 가이드

상황권장 유형이유
새 프로젝트Managed설정이 간단하고 관리 부담이 없습니다
기존 S3/ADLS 데이터External데이터 이동 없이 거버넌스만 추가합니다
외부 시스템과 파일 교환External외부 도구에서도 직접 파일에 접근 가능합니다
ETL 랜딩 존ExternalAuto Loader 등으로 외부에서 적재한 파일을 처리합니다
노트북 작업 파일Managed임시 파일, 실험 데이터 관리에 적합합니다
규제 데이터External데이터 위치를 고객이 명시적으로 제어해야 할 때

Volume 접근 패턴 심화

SQL 접근 고급 패턴

-- 디렉토리 내 파일 수와 총 크기 확인
LIST '/Volumes/production/ecommerce/raw_files/orders/2025/';

-- 와일드카드로 여러 파일 읽기
SELECT * FROM read_files(
    '/Volumes/production/ecommerce/raw_files/orders/2025/03/',
    format => 'json',
    schemaHints => 'order_id BIGINT, amount DOUBLE, order_date DATE'
);

-- 특정 파일 패턴만 읽기
SELECT * FROM read_files(
    '/Volumes/production/ecommerce/raw_files/',
    format => 'csv',
    pathGlobFilter => '*.csv',
    recursiveFileLookup => true,
    header => true
);

-- 바이너리 파일 읽기 (이미지 등)
SELECT
    path,
    length(content) AS file_size_bytes
FROM read_files(
    '/Volumes/production/ecommerce/images/',
    format => 'binaryFile'
);

Python 접근 고급 패턴

import os

# 표준 Python 파일 I/O로 접근 (가장 직관적)
volume_path = "/Volumes/production/ecommerce/raw_files"

# 파일 목록 조회
for f in os.listdir(volume_path):
    filepath = os.path.join(volume_path, f)
    size = os.path.getsize(filepath)
    print(f"{f}: {size:,} bytes")

# 파일 읽기/쓰기
with open(f"{volume_path}/config.json", "r") as f:
    config = json.load(f)

with open(f"{volume_path}/output/result.json", "w") as f:
    json.dump(result_data, f, ensure_ascii=False)

# Pandas로 CSV 직접 읽기
import pandas as pd
df = pd.read_csv(f"{volume_path}/data.csv")

# PIL로 이미지 처리
from PIL import Image
img = Image.open(f"{volume_path}/images/product_001.jpg")

Databricks CLI 접근

# 파일 업로드
databricks fs cp ./local_data/ /Volumes/production/ecommerce/raw_files/ --recursive

# 파일 다운로드
databricks fs cp /Volumes/production/ecommerce/reports/monthly.pdf ./local/

# 디렉토리 생성
databricks fs mkdirs /Volumes/production/ecommerce/raw_files/2025/04/

# 파일 삭제
databricks fs rm /Volumes/production/ecommerce/raw_files/temp_file.csv

# 파일 이동 (복사 + 삭제)
databricks fs cp /Volumes/production/ecommerce/raw_files/old/ \
                 /Volumes/production/ecommerce/archive/old/ --recursive
databricks fs rm /Volumes/production/ecommerce/raw_files/old/ --recursive

REST API 접근

import requests

# REST API로 파일 업로드
workspace_url = "https://<workspace-url>"
token = "<access-token>"

# 파일 업로드
with open("local_file.csv", "rb") as f:
    response = requests.put(
        f"{workspace_url}/api/2.0/fs/files/Volumes/production/ecommerce/raw_files/data.csv",
        headers={"Authorization": f"Bearer {token}"},
        data=f
    )

# 파일 다운로드
response = requests.get(
    f"{workspace_url}/api/2.0/fs/files/Volumes/production/ecommerce/raw_files/data.csv",
    headers={"Authorization": f"Bearer {token}"}
)
with open("downloaded.csv", "wb") as f:
    f.write(response.content)