HDInsight集群Spark写入文件未存储至Azure Blob存储问题
问题结论
该现象属于HDInsight的预期默认行为,不是配置错误。
原因说明
- HDInsight部署时默认将Azure Blob Storage配置为集群的默认文件系统,对应
core-site.xml中的fs.defaultFS配置项。所有不带显式文件系统schema的路径(比如直接写/testlocation),都会被自动路由到Azure Blob存储,这也是hadoop fs -ls /返回Blob存储文件列表的原因。 - 代码中使用了显式的
hdfs://hostname:8020前缀,这个schema会直接指向集群本地部署的HDFS NameNode服务,读写请求会直接落到节点本地磁盘上由DataNode管理的存储目录,完全不会经过默认文件系统的Blob存储映射,和执行hadoop fs -ls hdfs://hostname:8020/看到本地文件的观测结果完全一致。
调整方案
如果需要让Spark作业读写Azure Blob存储上的文件,两种写法都可以:
- 和hadoop CLI保持一致,使用不带hdfs前缀的相对路径:
df1mparquet = spark.read.parquet("/dataSet/parquet/") df1mparquet.write.parquet("/dataSet/newlocation/")
- 写全限定路径时,使用Azure Blob对应的WASB/WASBS schema,不要用hdfs schema,格式为
wasbs://<容器名>@<存储账户名>.blob.core.windows.net/<文件路径>。
注意:HDInsight集群的本地HDFS属于临时计算存储,集群删除、节点重置后数据会永久丢失,仅适合存放计算过程中的临时中间数据,需要持久化的业务数据不要写入本地HDFS路径。
内容的提问来源于stack exchange,提问作者Saif Ahmad
相关产品推荐
相关产品推荐

