2. Azure Data Lake Storage Gen2基础
Azure Data Lake Storage Gen2(简称 ADLS Gen2)并不是一个独立于 Azure Storage 之外的全新服务,而是在 Azure Blob 存储之上启用“分层命名空间(Hierarchical Namespace,HNS)”后形成的一套面向大数据分析的存储能力。理解这一点,是掌握 ADLS Gen2 的关键:它复用了 Blob 存储的持久性、冗余、安全与成本体系,同时补上了对象存储原本缺失的“目录语义”。
一、Blob 存储与 ADLS Gen2 的关系
传统 Blob 存储采用扁平命名空间。容器内的每个 Blob 名字本质上是一整条字符串,例如 raw/2024/06/01/orders.csv。斜杠 / 只是名字的一部分,并不是真实目录。当你在门户里看到“文件夹”时,那只是按前缀模拟出来的视图。这种结构对海量小文件的目录级重命名、原子性目录操作、细粒度 ACL 授权支持较弱:重命名一个“目录”往往需要逐个复制并删除对象。
启用分层命名空间后,存储账户中的对象被组织成真正的目录树:目录是独立实体,文件挂在目录下。由此带来三项对数据湖至关重要的能力:
- 原子性目录操作:重命名或删除整个目录是一次元数据操作,不再逐个对象复制,大数据作业(如 Spark 写临时目录后提交)效率显著提升。
- POSIX 风格 ACL:可在目录和文件级别设置访问控制列表,配合 Azure RBAC 实现“目录级”数据授权,适合多团队共享数据湖。
- 更贴近文件系统的访问语义:ABFS 驱动(
abfss://)可被 Hadoop、Spark、Databricks、Synapse 直接挂载使用。
二、访问端点与协议
同一个启用 HNS 的存储账户会暴露两类端点,理解它们的差异有助于排查连接问题:
| 端点类型 | 示例 | 典型用途 |
|---|---|---|
| Blob 端点 | https://acct.blob.core.windows.net | 通用对象访问、SDK、REST |
| DFS 端点 | https://acct.dfs.core.windows.net | 目录操作、ACL、ABFS 驱动 |
| ABFS URI | abfss://container@acct.dfs.core.windows.net/path | Spark / Databricks / Synapse 读写 |
注意 ABFS URI 的格式:容器名在 @ 之前,账户在 @ 之后,路径跟在域名后。这是初学者最容易写错的地方。
三、创建存储账户与容器
下面以“为数据湖准备一个存储账户并建立分层目录”为例,给出可执行的示例流程。示例参数均为教学假设,实际请按你的命名规范与区域调整。
# 1. 变量(示例值)
RG=rg-datalake-dev
LOC=eastasia
ACCT=stdatalakedev001 # 全局唯一,3-24位小写字母数字
CONTAINER=raw
# 2. 创建资源组
az group create --name $RG --location $LOC
# 3. 创建启用分层命名空间的存储账户
az storage account create \
--name $ACCT \
--resource-group $RG \
--location $LOC \
--sku Standard_LRS \
--kind StorageV2 \
--hns true \
--min-tls-version TLS1_2
# 4. 创建容器(文件系统)
az storage container create \
--name $CONTAINER \
--account-name $ACCT \
--auth-mode login
# 5. 建立目录结构
az storage fs directory create -n raw/2024/06/01 \
--file-system $CONTAINER --account-name $ACCT --auth-mode login
关键参数说明:--hns true 是启用分层命名空间的开关,账户创建后无法关闭或开启,必须一开始就决定;--kind StorageV2 是支持 HNS 的账户类型;--auth-mode login 表示用当前登录身份(需具备相应 RBAC 角色,如“存储 Blob 数据参与者”)而非账户密钥。
创建完成后,可用以下命令验证目录是否真实存在:
az storage fs directory list -f raw --account-name $ACCT --auth-mode login
az storage fs file list -f raw -p 2024/06/01 --account-name $ACCT --auth-mode login
若目录列表能返回 2024/06/01 这样的层级路径,说明分层命名空间已生效;若只能看到扁平前缀,则需检查账户是否确实启用了 HNS。
四、目录结构与数据组织建议
数据湖的价值很大程度取决于目录规划。常见做法是按“区域—主题—时间”分层,例如:
raw/:原始落地数据,保留源格式,不做清洗。curated/:清洗、标准化后的数据,供分析使用。sandbox/:临时实验区,可设置较短保留策略。
时间分区建议使用 yyyy/MM/dd 或 dt=2024-06-01 形式,便于 Spark 分区裁剪。目录层级不宜过深,一般 3~5 层即可,过深会增加路径管理成本。
五、创建时的常见判断点
在实际操作中,有几个容易踩坑的地方值得提前确认:
- HNS 不可逆:账户创建后无法切换,若未来确定要用作数据湖,创建时就应启用。
- 命名唯一性:存储账户名全局唯一,仅小写字母和数字,长度 3~24 位。
- 冗余选择:开发环境可用 LRS 控制成本,生产环境按可用性要求选择 ZRS/GRS。
- 权限模型:启用 HNS 后,建议同时规划 RBAC(粗粒度)与 ACL(细粒度),避免只依赖账户密钥。
- 容器即文件系统:在 ADLS Gen2 语境下,容器与“文件系统(file system)”是同一概念,ABFS URI 中的容器名即文件系统名。