1、选型:wasb vs abfs(以及 SSL 变体)
1.1 WASB(Blob Storage,兼容方案)
wasb://:非加密访问wasbs://:SSL 加密访问(推荐用这个)
URI 格式:
wasb://<container>@$<account>.blob.core.windows.net/<object-path>wasbs://<container>@$<account>.blob.core.windows.net/<object-path>
1.2 ABFS(ADLS Gen2,推荐方案)
Azure 推荐访问 ADLS Gen2 用 ABFS(即便 WASB 也能"兼容访问")。
abfs://:非加密abfss://:SSL 加密(推荐用这个)
URI 格式:
abfs://<container>@$<account>.dfs.core.windows.net/<object-path>abfss://<container>@$<account>.dfs.core.windows.net/<object-path>
注意:abfs:// 只能用于 ADLS Gen2 存储账号。你需要先确认你的 Storage Account 是否为 ADLS Gen2(Azure 文档提供识别方式)。
2、代码示例:读、写、Checkpoint 存 Azure(以 wasb 为例)
2.1 从 Azure 读(FileSource)
java
FileSource<String> fileSource = FileSource.forRecordStreamFormat(
new TextLineInputFormat(),
new Path("wasb://<your-container>@$<your-azure-account>.blob.core.windows.net/<object-path>")
).build();
env.fromSource(
fileSource,
WatermarkStrategy.noWatermarks(),
"azure-blob-storage-input"
);
2.2 写入 Azure(FileSink)
java
stream.sinkTo(
FileSink.forRowFormat(
new Path("wasb://<your-container>@$<your-azure-account>.blob.core.windows.net/<object-path>"),
new SimpleStringEncoder<String>()
).build()
);
2.3 用 Azure 作为 Checkpoint Storage
java
Configuration config = new Configuration();
config.set(CheckpointingOptions.CHECKPOINT_STORAGE, "filesystem");
config.set(CheckpointingOptions.CHECKPOINTS_DIRECTORY,
"wasb://<your-container>@$<your-azure-account>.blob.core.windows.net/<object-path>");
env.configure(config);
生产建议:如果你的目标是 ADLS Gen2,优先把以上示例中的 wasb://...blob.core.windows.net 替换为 abfss://...dfs.core.windows.net,并配套用 managed identity 认证(见下文)。
3、插件安装:flink-azure-fs-hadoop(Shaded Hadoop)
Flink 提供 flink-azure-fs-hadoop 插件(shaded 版),用于接入 Azure 文件系统。
安装方式:把 jar 从 opt 拷贝到 plugins(启动 Flink 前完成):
bash
mkdir ./plugins/azure-fs-hadoop
cp ./opt/flink-azure-fs-hadoop-2.2.0.jar ./plugins/azure-fs-hadoop/
插件注册的 scheme:
wasb://与wasbs://(SSL)
(ABFS 的认证与使用依赖 Hadoop ABFS 体系,下面单独讲。)
4、认证与凭证配置:WASB 与 ABFS 两条路线
4.1 WASB:两种常见配置方式
WASB 的 Hadoop Azure Filesystem 支持按 Hadoop 文档配置。Flink 为了方便,做了一个"转发规则":
- 所有
fs.azure.*前缀的 Flink 配置,会转发到 Hadoop 配置里
方式 A:直接在 Flink 配置写 Storage Key
yaml
fs.azure.account.key.<account_name>.blob.core.windows.net: <azure_storage_key>
方式 B:从环境变量读取 Storage Key(更安全)
把 key 放到环境变量 AZURE_STORAGE_KEY,然后在 Flink 配置里指定 key provider:
yaml
fs.azure.account.keyprovider.<account_name>.blob.core.windows.net: org.apache.flink.fs.azurefs.EnvironmentVariableKeyProvider
这种方式更适合 K8s(Secret 注入环境变量)、或避免明文写入配置文件的场景。
4.2 ABFS(ADLS Gen2):推荐 Managed Identity
ABFS 支持多种认证方式,具体可参考 Hadoop ABFS 文档。但 Azure 官方更推荐:
- 使用 Azure Managed Identity 访问 ADLS Gen2(更安全、免密钥)
前提条件:
- Flink 集群部署在支持 Managed Identities 的 Azure 服务上(Azure 有官方清单)
- 作业运行的身份(系统分配或用户分配)需要被授予访问对应 ADLS Gen2 的权限
使用 Storage Key 访问 ABFS(不推荐,但可用)
yaml
fs.azure.account.key.<account_name>.dfs.core.windows.net: <azure_storage_key>
5、生产实践建议(最容易踩坑的点)
- 优先用加密 scheme
- Blob:
wasbs:// - ADLS Gen2:
abfss://
- ADLS Gen2 就别纠结 wasb 兼容
- 既然 Azure 推荐 ABFS,就尽量走
abfs/abfss,减少未来迁移成本
- 尽量不用 Storage Key
- WASB 可用环境变量 provider
- ABFS 强烈建议 managed identity(权限治理更清晰、密钥轮换更省心)
- Checkpoint 与 Sink 路径分层
.../<env>/<cluster>/<job>/checkpoints/.../<env>/<cluster>/<job>/output/
避免多作业、跨环境互相覆盖。