如何通过Apache Beam上传文件到Azure Blob Storage,相关报错如何解决?
问题原因
- 报错核心是
DefaultAzureCredential类不支持Jackson序列化:你继承的BlobstoreOptions默认会初始化azureCredentialsProvider属性为com.azure.identity.DefaultAzureCredential实例,而DirectRunner运行时需要将所有PipelineOptions序列化为JSON传递,这个实例没有适配序列化逻辑,直接触发序列化失败。 - 你同时传入了连接字符串、SAS Token、访问密钥三类认证参数,触发了Beam Azure认证的默认CredentialsProvider优先级逻辑,优先使用默认的
DefaultAzureCredential而不是你传入的静态密钥,导致冗余的实例被初始化。 - Beam 2.31.0版本的Azure IO组件本身存在CredentialsProvider序列化的已知bug,也会加剧这个问题。
- 你配置的目标路径格式错误:
azfs协议的路径格式为azfs://<容器名>/<文件路径>,不需要额外存储账户名,账户名已通过单独参数指定,你当前写的azfs://$AZURE_STORAGE_ACCOUNT/$AZURE_STORAGE_CONTAINER_NAME/example.json不符合规范。
解决方案
按优先级推荐以下操作:
- 升级Beam版本到2.34.0及以上,官方已经在后续版本修复了Azure CredentialsProvider的序列化问题,升级后不需要额外修改代码即可解决序列化报错。
- 如果无法升级版本,先删除冗余的认证参数,仅保留单一认证方式即可,比如只传
--azureConnectionString或者仅传--accessKey和--accountName,不要同时传三类认证参数。 - 在运行参数中显式指定CredentialsProvider为无操作实现,避免默认初始化
DefaultAzureCredential,添加参数--azureCredentialsProvider=org.apache.beam.sdk.io.azure.options.AzureCredentialsProvider$NoOpCredentialsProvider即可。 - 修正目标路径格式,将
azfs://$AZURE_STORAGE_ACCOUNT/$AZURE_STORAGE_CONTAINER_NAME/example.json修改为azfs://$AZURE_STORAGE_CONTAINER_NAME/example.json。
内容的提问来源于stack exchange,提问作者Yukino Ikegami
相关产品推荐
相关产品推荐

