Synapse Notebook中使用mssparkutils.fs.mv移动文件时HTTP头缺失报错排查
mssparkutils.fs.mv报HTTP头缺失400错误的原因 问题场景
在Azure Synapse Notebook中使用PySpark执行文件移动操作,代码如下:
filepath = "abfss://raw@xxxxdev001.blob.core.windows.net/SASDatFiles/test_sep22.sas7bdat " movepath = "abfss://raw@xxxxdev001.blob.core.windows.net/SASDatFiles/Processed/test_sep22.sas7bdat" mssparkutils.fs.mv(filepath,movepath, True)
执行后触发Py4JJavaError,核心错误为:
Operation failed: "An HTTP header that's mandatory for this request is not specified.", 400, PUT, https://xxxxdev001.blob.core.windows.net/raw/SASDatFiles/Processed/test_sep22.sas7bdat?timeout=90, , ""
用户已拥有该ADLS Gen2存储账户的Owner/Blob Contributor权限,且在Storage Explorer中可正常移动文件。
排查方向与解决方案
1. 源路径末尾的空格问题
观察代码中filepath的末尾存在多余空格:"abfss://raw@xxxxdev001.blob.core.windows.net/SASDatFiles/test_sep22.sas7bdat "。这个空格会导致路径解析异常,mssparkutils在构造请求时无法正确识别目标文件,进而引发HTTP头缺失的错误。
解决: 去掉源路径末尾的空格,修改代码如下:
filepath = "abfss://raw@xxxxdev001.blob.core.windows.net/SASDatFiles/test_sep22.sas7bdat" movepath = "abfss://raw@xxxxdev001.blob.core.windows.net/SASDatFiles/Processed/test_sep22.sas7bdat" mssparkutils.fs.mv(filepath,movepath, True)
2. 目标目录存在性验证
虽然mssparkutils.fs.mv理论上会自动创建不存在的目标目录,但部分场景下目录缺失可能导致请求构造异常。先手动确认SASDatFiles/Processed目录是否存在,若不存在可通过以下代码创建:
mssparkutils.fs.mkdirs("abfss://raw@xxxxdev001.blob.core.windows.net/SASDatFiles/Processed")
3. Spark会话凭据有效性验证
即使Notebook使用个人凭据运行,也可能存在会话凭据过期或未正确加载的情况。可通过魔术命令重新认证:
%azure.login
重新认证后再执行移动操作。
4. Synapse Spark池版本兼容性
旧版本的Synapse Spark池存在ABFS协议操作的已知bug,可能导致请求头构造不完整。尝试将Spark池升级至最新稳定版本,或切换到其他版本的Spark池进行测试。
5. 存储账户分层命名空间确认
ADLS Gen2依赖分层命名空间特性,若存储账户未启用该特性,会导致ABFS协议请求异常。可在Azure门户的存储账户配置中,确认分层命名空间处于启用状态。
内容的提问来源于stack exchange,提问作者Sreedhar

