DBFS(Databricks File System) ๋ ๋ฐ์ดํฐ๋ธ๋ฆญ์ค ํ๊ฒฝ์์ ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง๋ฅผ ์์ฝ๊ฒ ๋ค๋ฃจ๊ธฐ ์ํ ๋ถ์ฐ ํ์ผ ์์คํ ์ ๋๋ค.
์ด ๊ธ์์๋ DBFS์ ๊ฐ๋ ๋ถํฐ ๊ตฌ์กฐ, ์ค์ ์ฌ์ฉ๋ฒ, ๊ทธ๋ฆฌ๊ณ ์ต์ ํธ๋ ๋์ธ Unity Catalog์์ ๋น๊ต๊น์ง ํ ๋ฒ์ ์ ๋ฆฌํฉ๋๋ค.
DBFS(Databricks File System) ๋ ๋ฐ์ดํฐ๋ธ๋ฆญ์ค ์ํฌ์คํ์ด์ค์ ๊ธฐ๋ณธ ๋ด์ฅ๋ ๋ถ์ฐ ํ์ผ ์์คํ
์ผ๋ก,
Apache Spark ํด๋ฌ์คํฐ์์ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ์ค๋ธ์ ํธ ์คํ ๋ฆฌ์ง์ ์ ๊ทผํ๊ธฐ ์ํ ์ถ์ํ ๋ ์ด์ด(Abstraction Layer) ์ญํ ์ ํฉ๋๋ค.
์ฝ๊ฒ ๋งํด, DBFS๋ ๋ค์๊ณผ ๊ฐ์ ์ญํ ์ ํฉ๋๋ค:

*โฒ Databricks ํ๋ซํผ ์ ์ฒด ์ํคํ
์ฒ โ DBFS๋ Data Plane์ ์คํ ๋ฆฌ์ง ๋ ์ด์ด์ ์์น*
---
```markdown
> ๐ก **ํต์ฌ ํฌ์ธํธ**
> DBFS๋ Unix ๊ณ์ด ํ์ผ ์์คํ
๊ณผ ๋์ผํ ๋ช
๋ น์ด(ls, cp, rm ๋ฑ)๋ก ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง๋ฅผ ์กฐ์ํ ์ ์๊ฒ ํด์ค๋๋ค.
> ๋ด๋ถ์ ์ผ๋ก๋ ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง API ํธ์ถ๋ก ๋ณํ๋ฉ๋๋ค.
---
## ๐๏ธ DBFS์ ํต์ฌ ๊ตฌ์กฐ
DBFS๋ ํฌ๊ฒ ๋ ๊ฐ์ง ๊ฐ๋
์ผ๋ก ๋๋ฉ๋๋ค:
### 1. DBFS Root (`dbfs:/`)
์ํฌ์คํ์ด์ค ์์ฑ ์ **์๋์ผ๋ก ํ๋ก๋น์ ๋**๋๋ ๊ธฐ๋ณธ ์คํ ๋ฆฌ์ง ์์น์
๋๋ค.
`dbfs:/` ์คํด์ผ๋ก ์ ๊ทผํ๋ฉฐ, ์ํฌ์คํ์ด์ค์ ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง ๊ณ์ ์ ์์นํฉ๋๋ค.
```python
# DBFS Root ์ ๊ทผ ์์ (Spark API Format)
df = spark.read.csv("dbfs:/FileStore/mydata.csv", header=True)
# ๋๋ File API Format
import os
files = os.listdir("/dbfs/FileStore/")
/mnt/)์ธ๋ถ ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง๋ฅผ DBFS์ ๋ง์ดํธํ์ฌ, ๋ง์น ๋ก์ปฌ ๋๋ ํ ๋ฆฌ์ฒ๋ผ ์ฌ์ฉํ ์ ์๊ฒ ํฉ๋๋ค.
# S3 ๋ฒํท ๋ง์ดํธ ์์
dbutils.fs.mount(
source = "s3a://my-s3-bucket/",
mount_point = "/mnt/my-data",
extra_configs = {"fs.s3a.access.key": ACCESS_KEY,
"fs.s3a.secret.key": SECRET_KEY}
)
# ๋ง์ดํธ๋ ๊ฒฝ๋ก ์ ๊ทผ
df = spark.read.parquet("/mnt/my-data/sales/2024/")
โ ๏ธ ์ค์ ๊ณต์ง (2024~): DBFS Root ๋ฐ DBFS Mounts๋ Deprecated(์ง์ ์ค๋จ ์์ ) ์ํ์ ๋๋ค.
์ ๊ท ๊ณ์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ๊ธฐ๋ฅ์ ์ ๊ทผํ ์ ์์ผ๋ฉฐ, Databricks๋ Unity Catalog Volumes๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
DBFS Root(dbfs:/)์๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ๋๋ ํ ๋ฆฌ๋ค์ด ์์ต๋๋ค:
| ๋๋ ํ ๋ฆฌ | ์ค๋ช |
|---|---|
/FileStore | UI๋ฅผ ํตํด ์ ๋ก๋ํ ๋ฐ์ดํฐยท๋ผ์ด๋ธ๋ฌ๋ฆฌยท์์ฑ๋ ํ๋กฏ ์ ์ฅ |
/databricks-datasets | Databricks ์ ๊ณต ์คํ์์ค ์์ ๋ฐ์ดํฐ์ |
/databricks-results | ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๋ค์ด๋ก๋ ํ์ผ ์ ์ฅ |
/databricks/init | ๋ ๊ฑฐ์ ๊ธ๋ก๋ฒ ์ด๊ธฐํ ์คํฌ๋ฆฝํธ (ํ์ฌ ๋น๊ถ์ฅ) |
/user/hive/warehouse | Hive Metastore ๊ด๋ฆฌ ํ ์ด๋ธ ๊ธฐ๋ณธ ์ ์ฅ ์์น |
/mnt | ์ธ๋ถ ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง ๋ง์ดํธ ํฌ์ธํธ |
# DBFS ๋๋ ํ ๋ฆฌ ๋ชฉ๋ก ์กฐํ
display(dbutils.fs.ls("dbfs:/"))
DBFS๋ ๋ค์ํ ๋น ๋ฐ์ดํฐ ํฌ๋งท์ ์ง์ํฉ๋๋ค:

*โฒ DBFS ๊ตฌ์กฐ โ ํด๋ผ์ฐ๋ ์ค๋ธ์ ํธ ์คํ ๋ฆฌ์ง ์์ ์ถ์ํ ๋ ์ด์ด*
---
```markdown
| ํฌ๋งท | ํํ | ํน์ง |
|------|------|------|
| **Parquet** โญ | ์ปฌ๋ผํ, ๋ฐ์ด๋๋ฆฌ | ์ต๊ณ ์์ถ๋ฅ & ๋ถ์ ์ฟผ๋ฆฌ ์ต์ ํ |
| **Delta Lake** โญ | Parquet + ํธ๋์ญ์
๋ก๊ทธ | ACID ํธ๋์ญ์
, ํ์ํธ๋๋ธ ์ง์ |
| **Avro** | ํ ๊ธฐ๋ฐ, ๋ฐ์ด๋๋ฆฌ | ์คํค๋ง ์งํ(Schema Evolution) ์ง์ |
| **JSON** | ํ
์คํธ, ๋ฐ์ ํ | NoSQL ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ ํฉ |
| **ORC** | ์ปฌ๋ผํ, ๋ฐ์ด๋๋ฆฌ | Hive ์ํฌ๋ก๋์ ์ต์ ํ |
| **CSV** | ํ
์คํธ, ์ ํ | ๋จ์ํ๊ณ ๋ฒ์ฉ์ |
| **์ด๋ฏธ์ง/์ค๋์ค/PDF** | ๋ฐ์ด๋๋ฆฌ | ML ํ์ต ๋ฐ์ดํฐ ์ ์ฅ |
> ๐ **์ฑ๋ฅ ํ**: ๋ถ์ ์ํฌ๋ก๋์๋ **Parquet** ๋๋ **Delta Lake** ํฌ๋งท ์ฌ์ฉ์ ๊ฐ๋ ฅํ ๊ถ์ฅํฉ๋๋ค.
> ์ปฌ๋ผํ ์ ์ฅ ๋ฐฉ์์ผ๋ก ์ฟผ๋ฆฌ ์๋์ ์์ถ๋ฅ ๋ชจ๋ ํ์ํฉ๋๋ค.
---
## โ
DBFS ์ฃผ์ ์ด์
### โ ํตํฉ ์ธํฐํ์ด์ค (Unified Interface)
AWS S3, Azure ADLS, GCS ๋ฑ **๊ฐ ํด๋ผ์ฐ๋๋ณ ๋ค๋ฅธ API**๋ฅผ ๋ฐฐ์ธ ํ์ ์์ด, DBFS ํ๋์ ์ธํฐํ์ด์ค๋ก ํตํฉ ์ ๊ทผ ๊ฐ๋ฅํฉ๋๋ค.
### โก Spark ์ํฌ๋ก๋ ์ต์ ํ
ETL, ๋จธ์ ๋ฌ๋, ์ ๋ํน ๋ถ์ ๋ฑ **Spark ๊ธฐ๋ฐ ์ํฌ๋ก๋**์ ์ต์ ํ๋ I/O ์ฑ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
### โข ๋ฌด์ ํ ํ์ฅ์ฑ
๋ฐฑ์๋์ ํด๋ผ์ฐ๋ ์ค๋ธ์ ํธ ์คํ ๋ฆฌ์ง ๋๋ถ์ **์คํ ๋ฆฌ์ง ์ฉ๋ ์ ํ์ด ์์ต๋๋ค**.
๋ฐ์ดํฐ ์ฆ๊ฐ์ ๋ฐ๋ผ ์๋ ์ค์ผ์ผ์
/๋ค์ด๋ฉ๋๋ค.
### โฃ ํด๋ฌ์คํฐ ๊ฐ ๋ฐ์ดํฐ ๊ณต์
์ฌ๋ฌ Spark ํด๋ฌ์คํฐ์์ **๋์ผํ DBFS ๋ฐ์ดํฐ์ ๋์ ์ ๊ทผ** ๊ฐ๋ฅํฉ๋๋ค.
ํด๋ฌ์คํฐ๊ฐ ์ข
๋ฃ๋์ด๋ ๋ฐ์ดํฐ๋ ๋ณด์กด๋ฉ๋๋ค. (์ปดํจํ
-์คํ ๋ฆฌ์ง ๋ถ๋ฆฌ)
### โค ๋ค์ํ API ์ง์
```python
# Spark DataFrame API
df = spark.read.parquet("dbfs:/data/sales/")
# Python OS API
import os
files = os.listdir("/dbfs/data/")
# dbutils API
dbutils.fs.ls("dbfs:/data/")
dbutils.fs.cp("dbfs:/source/", "dbfs:/dest/", recurse=True)
# CLI
# databricks fs ls dbfs:/
Admin Settings โ Workspace Settings โ Advanced โ Enable DBFS File Browser ์ฒดํฌ ํ ์๋ก๊ณ ์นจ
Catalog โ DBFS ํญ โ Upload ๋ฒํผ์ผ๋ก ๋ก์ปฌ ํ์ผ ์
๋ก๋
๊ธฐ๋ณธ ์ ์ฅ ์์น: /FileStore/
# CSV ํ์ผ ์ฝ๊ธฐ
df = spark.read.format("csv") \
.option("header", "true") \
.option("inferSchema", "true") \
.load("dbfs:/FileStore/sales_data.csv")
# ์์ ๋ทฐ ์์ฑ
df.createOrReplaceTempView("sales_data")
# SQL๋ก ๋ถ์
%sql
SELECT region, SUM(revenue) as total_revenue
FROM sales_data
GROUP BY region
ORDER BY total_revenue DESC
LIMIT 10
# ์์ 10๊ฐ ํ ํ์ธ
display(df.limit(10))
# ํน์ ์ปฌ๋ผ ํํฐ๋ง
df.filter(df["revenue"] > 10000).show()
# Databricks CLI๋ก DBFS โ ๋ก์ปฌ ๋ค์ด๋ก๋
databricks fs cp dbfs:/FileStore/result.csv ./local/result.csv
# ๋๋ ํ ๋ฆฌ ์ ์ฒด ๋ค์ด๋ก๋
databricks fs cp -r dbfs:/FileStore/results/ ./local/results/
| ํญ๋ชฉ | DBFS | HDFS |
|---|---|---|
| ์คํ ๋ฆฌ์ง ๋ฐฑ์๋ | ํด๋ผ์ฐ๋ ์ค๋ธ์ ํธ ์คํ ๋ฆฌ์ง (S3, ADLS, GCS) | ๋ก์ปฌ ์๋ฒ ๋ธ๋ก ์คํ ๋ฆฌ์ง |
| ์ํคํ ์ฒ | ์๋ฒ๋ฆฌ์ค, ์ปดํจํ -์คํ ๋ฆฌ์ง ๋ถ๋ฆฌ | NameNode-DataNode ๋ง์คํฐ-์ฌ๋ ์ด๋ธ |
| ํ์ฅ์ฑ | โ ๋ฌด์ ํ (ํด๋ผ์ฐ๋ ์๋ ์ค์ผ์ผ) | โ ๏ธ ์ ํ์ (์๋ ๋ ธ๋ ์ถ๊ฐ ํ์) |
| ๋๋ค ์ก์ธ์ค | โ ์ฐ์ | โ ๋ฏธํก (์์ฐจ ์ฝ๊ธฐ์ ์ต์ ํ) |
| ํด๋ฌ์คํฐ ์ข ๋ฃ ์ | โ ๋ฐ์ดํฐ ๋ณด์กด | โ ํด๋ฌ์คํฐ์ ํจ๊ป ์๋ฉธ ์ํ |
| ๋น์ฉ ๋ชจ๋ธ | Pay-as-you-go (ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง ๋น์ฉ) | ํ๋์จ์ด ๊ตฌ๋งค/์ ์ง ๋น์ฉ |
| ๋ณด์ | SSL, IAM, RBAC ํตํฉ | Kerberos, ACL |
| ํ์ฉ ํ๊ฒฝ | ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ๋ฐ์ดํฐ ํ๋ซํผ | ์จํ๋ ๋ฏธ์ค Hadoop ์์ฝ์์คํ |

*โฒ Unity Catalog Volumes vs DBFS Mount โ ์ต์ Databricks ๊ถ์ฅ ์ํคํ
์ฒ*
---
```markdown
Databricks๋ 2023๋
์ดํ **Unity Catalog Volumes**๋ฅผ ๊ณต์ ๊ถ์ฅ ์คํ ๋ฆฌ์ง๋ก ๋ฐํํ์ต๋๋ค.
| ํญ๋ชฉ | DBFS | Unity Catalog Volumes |
|------|------|----------------------|
| **๊ฑฐ๋ฒ๋์ค** | ๊ธฐ๋ณธ์ ์ธ ์ ๊ทผ์ ์ด | โ
์ธ๋ฐํ RBAC, ๋ฐ์ดํฐ ๊ณ๋ณด ์ถ์ |
| **๋ฉํฐ ์ํฌ์คํ์ด์ค** | ์ํฌ์คํ์ด์ค ๋จ์ | โ
์กฐ์ง ์ ์ฒด ํตํฉ ๊ด๋ฆฌ |
| **๊ฐ์ฌ ๋ก๊ทธ** | ์ ํ์ | โ
์์ธ ๊ฐ์ฌ ๋ก๊ทธ |
| **๋ฐ์ดํฐ ๊ณ๋ณด** | โ ๋ฏธ์ง์ | โ
์๋ ๊ณ๋ณด ์ถ์ |
| **๊ถ์ฅ ์ฌ๋ถ** | โ ๏ธ Deprecated ์งํ ์ค | โ
Databricks ๊ณต์ ๊ถ์ฅ |
| **์ ๊ทผ ๊ฒฝ๋ก** | `dbfs:/` ๋๋ `/dbfs/` | `/Volumes/catalog/schema/volume/` |
```python
# Unity Catalog Volumes ์ ๊ทผ ์์ (ํ์ฌ ๊ถ์ฅ)
df = spark.read.parquet(
"/Volumes/main/sales_data/raw/2024/transactions.parquet"
)
# DBFS ์ ๊ทผ ์์ (๋ ๊ฑฐ์)
df = spark.read.parquet("dbfs:/mnt/sales-data/2024/transactions.parquet")
๐ ๋ง์ด๊ทธ๋ ์ด์ ๊ถ์ฅ: ๊ธฐ์กด DBFS ๋ง์ดํธ๋ฅผ ์ฌ์ฉ ์ค์ด๋ผ๋ฉด
Unity Catalog External Locations & Volumes ๋ก์ ๋จ๊ณ์ ๋ง์ด๊ทธ๋ ์ด์ ์ ๊ถ์ฅํฉ๋๋ค.
| ์ํฉ | ๊ถ์ฅ ์ฌํญ |
|---|---|
| ์ ๊ท ํ๋ก์ ํธ ์์ | Unity Catalog Volumes ์ฌ์ฉ |
| ๊ธฐ์กด DBFS ์ฌ์ฉ ์ค | ์ ์ง์ Unity Catalog ๋ง์ด๊ทธ๋ ์ด์ ๊ณํ ์๋ฆฝ |
| ํ๋ก๋์ ๋ฐ์ดํฐ ์ ์ฅ | DBFS Root ์ฌ์ฉ ์ง์ |
| ML ํ์ต ์ฒดํฌํฌ์ธํธ | DBFS ๋๋ MLflow Artifact Store |
| ์์ ๋ฐ์ดํฐ/์ค์ต | DBFS FileStore ํ์ฉ ๊ฐ๋ฅ |
DBFS (Databricks File System)
โโโ ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง ์์ ํตํฉ ํ์ผ ์์คํ
์ถ์ํ ๋ ์ด์ด
โโโ dbfs:/ ์คํด์ผ๋ก ์ ๊ทผ (Spark API)
โโโ /dbfs/ ๊ฒฝ๋ก๋ก ์ ๊ทผ (File API)
โโโ DBFS Root โ ์ํฌ์คํ์ด์ค ๊ธฐ๋ณธ ์คํ ๋ฆฌ์ง
โโโ DBFS Mounts โ ์ธ๋ถ ์คํ ๋ฆฌ์ง ๋ง์ดํธ (Deprecated)
โโโ ๊ถ์ฅ ๋์ โ Unity Catalog Volumes
DBFS๋ Databricks ํ๋ซํผ์ ํต์ฌ ์คํ ๋ฆฌ์ง ๋ ์ด์ด๋ก, ์๋ ๊ฐ ๋ฐ์ดํฐ ์์ง๋์ด์ ๋ฐ์ดํฐ ์ฌ์ด์ธํฐ์คํธ๋ค์ด ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง๋ฅผ ์์ฝ๊ฒ ๋ค๋ฃฐ ์ ์๋๋ก ํด์ฃผ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์ฌ๋ ๋ ๊ฐ๋ ฅํ ๊ฑฐ๋ฒ๋์ค์ ๋ณด์์ ์ ๊ณตํ๋ Unity Catalog ์ฒด๊ณ๋ก์ ์ ํ์ด ์ด๋ฃจ์ด์ง๊ณ ์์ต๋๋ค.
๊ธฐ์กด DBFS ์ฌ์ฉ์๋ผ๋ฉด ํ์ฌ ์ํฌํ๋ก์ฐ๋ ๊ทธ๋๋ก ์ ์ง๋์ง๋ง, ์๋ก์ด ํ๋ก์ ํธ์์๋ Unity Catalog Volumes๋ฅผ ํ์ฉํ์ฌ ๋ฏธ๋ ์งํฅ์ ์ธ ๋ฐ์ดํฐ ์ํคํ ์ฒ๋ฅผ ๊ตฌ์ฑํด ๋ณด์ธ์!
โ๏ธ ์ด ๊ธ์ด ๋์์ด ๋์ จ๋ค๋ฉด ๊ณต์ ๋ถํ๋๋ฆฝ๋๋ค! ์ง๋ฌธ์ด ์์ผ์๋ฉด ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์ธ์. ๐