使用AzCopy在两个Azure Data Lake Storage Gen2存储账户间复制目录内容时遇到InvalidResourceName错误的求助
你好,我看到你尝试用AzCopy在两个Azure Data Lake Storage Gen2(ADLS Gen2)存储账户之间复制Parquet文件,但遇到了InvalidResourceName错误,同时还有空目录无法处理的提示,我来帮你一步步排查解决这些问题。
先说说核心问题:你当前使用的是Blob存储的端点(blob.core.windows.net),虽然ADLS Gen2兼容Blob API,但它的核心特性是分层命名空间,Blob端点并不能完美适配这个特性,这就是你遇到目录处理问题和资源名称错误的主要原因。下面是具体的解决步骤:
1. 切换到ADLS Gen2专用的DFS端点
ADLS Gen2有专门针对分层命名空间优化的端点:dfs.core.windows.net,用这个端点替换命令里的blob.core.windows.net,能彻底解决目录支持的问题,也能避免大部分资源名称兼容性错误。修改后的命令如下:
AzCopy copy "https://storageaccount1.dfs.core.windows.net/raw/2023/02/10/*" "https://storageaccount2.dfs.core.windows.net/test" --recursive=true
这里加上--recursive=true是为了确保复制所有子目录和文件(哪怕你的源目录没有子文件夹,这个参数也不会有负面影响)。
2. 排查资源名称中的非法字符
错误提示明确指出The specified resource name contains invalid characters,你需要检查源和目标路径里的容器(ADLS Gen2里叫文件系统)、目录或文件名是否包含Azure存储禁止的字符:
- 文件系统(原Blob容器)名称只能用小写字母、数字和短横线(-),且不能以短横线开头/结尾
- 目录和文件名不能包含
\ / : * ? " < > |这些字符,空格或特殊符号也可能触发错误
如果发现有非法字符,要么先修改资源名称,要么在PowerShell里用反引号(`)对特殊字符进行转义。
3. 确保目标文件系统/目录已存在
AzCopy默认不会自动创建目标文件系统(也就是Blob里的容器),如果目标端的test文件系统还没创建,你需要先手动创建:
用Azure CLI创建的话,执行这条命令:
az storage fs create -n test --account-name storageaccount2 --auth-mode login
或者用AzCopy直接创建目标路径:
AzCopy make "https://storageaccount2.dfs.core.windows.net/test"
4. 解决空目录的提示问题
你看到的Any empty folders will not be processed提示,本质上也是因为用了Blob端点导致的分层命名空间支持不足,切换到DFS端点后,这个提示就会消失,因为DFS端点原生支持ADLS Gen2的目录结构。
如果修改后还是有问题,可以加上--verbose参数获取更详细的日志,方便进一步排查:
AzCopy copy "https://storageaccount1.dfs.core.windows.net/raw/2023/02/10/*" "https://storageaccount2.dfs.core.windows.net/test" --recursive=true --verbose
备注:内容来源于stack exchange,提问作者justsander

