ADLS Gen2 는 Blob Storage 와 별개의 서비스가 아니다. 범용 v2 스토리지 계정에 계층 구조 네임스페이스(Hierarchical Namespace, HNS)를 켠 것이 ADLS Gen2 다. 같은 계정, 같은 데이터에 두 종류의 엔드포인트가 함께 열린다.
| 엔드포인트 | 형태 | 쓰는 쪽 |
|---|---|---|
| Blob | https://<account>.blob.core.windows.net |
일반 애플리케이션 · SDK · AzCopy |
| Data Lake Storage | https://<account>.dfs.core.windows.net |
abfss:// 드라이버를 쓰는 Spark · Hive · Databricks · Synapse |
따라서 "Blob 을 쓸까 ADLS Gen2 를 쓸까"는 다른 제품을 고르는 문제가 아니라 계정을 만들 때 HNS 를 켤 것인가의 문제다. Blob Storage 에 Gen1 · Gen2 라는 세대 구분은 없다. 세대가 있는 쪽은 Data Lake Storage 이고, Gen1 은 이미 서비스가 종료됐다.
HNS 를 끄면 컨테이너 아래는 평평한 키 공간이다. a/b/c.parquet 의 슬래시는 이름의 일부일 뿐 디렉터리가 아니다. 그래서 "디렉터리 이름 변경"은 그 접두사를 가진 모든 객체를 복사하고 지우는 일이 된다. 객체가 수십만 개면 그만큼 걸린다.
HNS 를 켜면 디렉터리가 실제 개체가 된다. 달라지는 점은 다음과 같다.
| 용도 | 권장 |
|---|---|
| 정적 파일 · 백업 · 미디어 · 로그 적재만 | HNS 없이 Blob |
| Spark · Hive · Databricks · Synapse 가 읽고 쓰는 데이터 레이크 | HNS 켠 ADLS Gen2 |
| 디렉터리 단위 권한이 필요한 다중 팀 공용 저장소 | HNS 켠 ADLS Gen2 |
애매하면 켜 두는 편이 낫다. 나중에 바꾸려면 계정을 새로 만들어 데이터를 옮겨야 한다. 기존 계정에 HNS 를 켜는 마이그레이션 경로가 있긴 하지만 되돌릴 수 없고 사전 조건이 있으므로 처음부터 정하는 것이 안전하다.
HNS 를 켜면 일부 기능이 제한되거나 나중에 지원된 것들이 있다. 쓰려는 기능(수명 주기 관리, 특정 SDK, 특정 서비스 연동)이 HNS 계정에서 지원되는지는 도입 시점에 공식 문서로 확인한다.
Hadoop 계열에서는 abfss:// 드라이버를 쓴다. 옛 wasbs:// 는 Blob 엔드포인트를 쓰는 구형 드라이버로, 새로 구성할 때는 쓰지 않는다.
abfss://<container>@<account>.dfs.core.windows.net/<path>
Spark 설정 예시다. 자격 증명은 파일에 직접 적지 않고 키 저장소나 관리 ID 를 쓴다.
fs.azure.account.auth.type.<account>.dfs.core.windows.net = OAuth
fs.azure.account.oauth.provider.type.<account>.dfs.core.windows.net = org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider
fs.azure.account.oauth2.client.id.<account>.dfs.core.windows.net = ${CLIENT_ID}
fs.azure.account.oauth2.client.secret.<account>.dfs.core.windows.net = ${CLIENT_SECRET}
fs.azure.account.oauth2.client.endpoint.<account>.dfs.core.windows.net = https://login.microsoftonline.com/${TENANT_ID}/oauth2/token