如何通过Hadoop FileSystem API访问Azure Storage Emulator做单元测试
正确配置方案
你之前的配置缺少模拟器专用开关,且密钥类型、域名、协议配置都和模拟器默认规则不匹配,正确配置如下:
核心修正点:
- 必须新增
fs.azure.emulator.enabled配置并设为true,开启Hadoop Azure文件系统的模拟器适配逻辑 - 存储模拟器默认使用账户密钥验证,你填写的长串是默认账户密钥而非SAS密钥,需用账户密钥专用配置项,不能用SAS配置
- 模拟器默认走HTTP协议,使用
wasb即可,无需用HTTPS的wasbs,避免本地证书校验失败 - 模拟器的正确域名后缀是
blob.core.windows.net,不是blob.windows.core.net
完整可运行代码示例:
import org.apache.hadoop.conf.Configuration import org.apache.hadoop.fs.FileSystem // 替换为你自己在模拟器中创建的容器名 val containerName = "test-container" val emulatorAccountName = "devstoreaccount1" // 模拟器固定默认账户密钥,不需要修改 val emulatorAccountKey = "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==" val hadoopConfig = new Configuration() // 开启模拟器适配 hadoopConfig.set("fs.azure.emulator.enabled", "true") // 配置模拟器账户密钥 hadoopConfig.set(s"fs.azure.account.key.${emulatorAccountName}.blob.core.windows.net", emulatorAccountKey) // 配置默认FS hadoopConfig.set("fs.defaultFS", s"wasb://${containerName}@${emulatorAccountName}.blob.core.windows.net") // 配置文件系统实现类 hadoopConfig.set("fs.wasb.impl", "org.apache.hadoop.fs.azure.NativeAzureFileSystem") hadoopConfig.set("fs.wasbs.impl", "org.apache.hadoop.fs.azure.NativeAzureFileSystem$Secure") // 获取FileSystem实例 val fs = FileSystem.get( new java.net.URI(s"wasb://${containerName}@${emulatorAccountName}.blob.core.windows.net"), hadoopConfig )
额外注意事项:
- 运行代码前请确保Azure Storage Emulator已经正常启动,默认端口10000(Blob服务)没有被其他进程占用
- 请提前在模拟器中创建对应的容器,否则会报容器不存在的错误
- 建议使用3.3.0及以上版本的
hadoop-azure依赖,避免旧版本不支持模拟器配置项的问题
内容的提问来源于stack exchange,提问作者jps
相关产品推荐
相关产品推荐

