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 直接挂载使用。
一句话记忆:ADLS Gen2 = Blob 存储 + 分层命名空间。启用 HNS 的存储账户,其 Blob 端点依然可用,但获得了目录语义与 ACL 能力。

二、访问端点与协议

同一个启用 HNS 的存储账户会暴露两类端点,理解它们的差异有助于排查连接问题:

端点类型示例典型用途
Blob 端点https://acct.blob.core.windows.net通用对象访问、SDK、REST
DFS 端点https://acct.dfs.core.windows.net目录操作、ACL、ABFS 驱动
ABFS URIabfss://container@acct.dfs.core.windows.net/pathSpark / 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 层即可,过深会增加路径管理成本。

ADLS Gen2 分层命名空间与目录结构 Blob 存储:扁平命名空间 容器 raw 内的对象名(斜杠仅为字符) raw/2024/06/01/orders.csv raw/2024/06/01/users.json raw/2024/06/02/orders.csv raw/2024/06/02/users.json 重命名“目录” = 逐个复制 + 删除 无目录级 ACL,授权粒度到对象 启用 HNS ADLS Gen2:分层命名空间 真实目录树(目录为独立实体) 📁 raw/ 📁 2024/ 📁 06/ 📁 01/ 📄 orders.csv 📄 users.json 目录重命名/删除为原子操作 · 支持目录级 ACL

五、创建时的常见判断点

在实际操作中,有几个容易踩坑的地方值得提前确认:

  • HNS 不可逆:账户创建后无法切换,若未来确定要用作数据湖,创建时就应启用。
  • 命名唯一性:存储账户名全局唯一,仅小写字母和数字,长度 3~24 位。
  • 冗余选择:开发环境可用 LRS 控制成本,生产环境按可用性要求选择 ZRS/GRS。
  • 权限模型:启用 HNS 后,建议同时规划 RBAC(粗粒度)与 ACL(细粒度),避免只依赖账户密钥。
  • 容器即文件系统:在 ADLS Gen2 语境下,容器与“文件系统(file system)”是同一概念,ABFS URI 中的容器名即文件系统名。
不要用账户密钥硬编码在代码或 Notebook 中。生产环境应使用托管标识(Managed Identity)或服务主体,并通过 RBAC + ACL 授予最小权限。