Azure无服务器Spark中PySpark数据合并后文件定位及大数据合并咨询
问题解答
一、CSV结果文件的存储位置
你当前使用的/synfs/notebook/46/aml_notebook_mount是Azure ML无服务器Spark节点的临时分布式存储挂载点,这个路径下的文件仅在当前Spark会话存续期间可访问,且不会同步到你的Notebook本地挂载或持久化存储中——这就是你在外部找不到文件,但同一会话内能读取的原因。
会话未结束时查看临时文件
如果Spark会话还在运行,你可以通过PySpark命令查看文件的具体位置:
# 替换为你的实际保存路径后缀 dbutils.fs.ls("/synfs/notebook/46/aml_notebook_mount/your_save_directory")
注意:一旦会话结束,该临时存储内的文件会被自动清理,无法再访问。
持久化保存的正确方式
要让文件能永久留存并可随时访问,你需要将数据写入Azure ML的持久化数据存储(如Azure Blob Storage/ADLS Gen2),示例代码如下:
# 替换为你的数据存储容器和存储账户信息 persistent_path = "abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/your-save-path" merged_df.write.csv(persistent_path, header=True, mode="overwrite")
之后你可以在Azure ML工作室的「数据存储」页面找到对应容器,或通过Notebook挂载数据存储来访问文件。
二、处理100GB数据合并的注意事项
针对100GB级别的数据合并,结合你当前的Spark节点配置,需重点关注以下几点:
- 调整执行器资源配置:当前2个执行器(4vCPU/32GB)不足以支撑100GB数据处理,建议增加执行器数量(如8-12个),同时保持每个执行器的资源规格(4vCPU/32GB)或适当升级(如6vCPU/48GB),确保总计算能力和内存能覆盖数据处理需求,避免OOM(内存溢出)。
- 优化数据分区与避免倾斜:
- 合并前检查两个数据集的分区数,确保分区大小均匀(建议每个分区1-2GB),可通过
repartition()或coalesce()调整。 - 如果是按某列关联(join),若其中一个数据集较小(如<10GB),可使用
broadcast()广播小表,减少shuffle数据量;若关联列存在数据倾斜(某类值占比极高),需对该列加盐(salt)拆分后再关联。
- 合并前检查两个数据集的分区数,确保分区大小均匀(建议每个分区1-2GB),可通过
- 选择高效存储格式:CSV的读写效率和压缩率较低,建议优先使用Parquet或ORC格式;若必须用CSV,开启压缩选项:
merged_df.write.csv(persistent_path, header=True, mode="overwrite", compression="gzip") - 内存与资源参数调优:配置Spark内存参数,给执行器预留足够的内存开销,示例:
spark.conf.set("spark.executor.memoryOverhead", "4g") # 预留4GB给非堆内存 spark.conf.set("spark.sql.shuffle.partitions", "200") # 调整shuffle分区数,避免小分区过多 - 预处理减少数据量:合并前过滤不需要的列、清洗无效数据,降低后续计算和存储的负载。
- 监控与调试:在Azure ML的Spark作业面板实时监控任务进度,重点关注是否有任务执行时间过长(数据倾斜征兆),及时调整策略。
内容的提问来源于stack exchange,提问作者Ratna Pathak
相关产品推荐
相关产品推荐

