Spark-ftp写入DataFrame至FTP异常:生成.crc文件而非.csv求助
解决Spark FTP写入生成.crc二进制文件的问题
我之前在做Spark FTP数据导出的时候也踩过几乎一模一样的坑,结合你给出的日志和问题描述,咱们来一步步解决:
问题根源拆解
- .crc文件的由来:这是Spark默认的
FileOutputCommitter生成的校验文件,用来验证输出文件的完整性,默认情况下会和目标文件一起生成。 - 二进制格式问题:大概率是你没有明确指定输出为CSV文本格式,或者使用的FTP库默认用了二进制序列化方式写入,导致文本文件被当成二进制存储。
- 本地临时路径日志:说明你的Spark FTP写入底层是先把数据写到本地临时目录,再同步到远程FTP服务器,这时候如果没过滤掉临时文件和校验文件,就会一起上传到FTP。
针对性解决方案
1. 禁用CRC校验文件生成
直接通过Spark配置关闭校验文件的生成,这样就不会再出现part-XXX..csv.crc这类文件了:
// 在代码中设置配置 spark.conf.set("mapreduce.fileoutputcommitter.marksuccessfuljobs", "false") spark.conf.set("spark.hadoop.mapreduce.fileoutputformat.outputdir", "ftp://your-ftp-server/target-path") // 或者在Spark启动时添加JVM参数 // spark-submit --conf mapreduce.fileoutputcommitter.marksuccessfuljobs=false ...
2. 明确指定CSV输出格式
不管你用的是官方CSV writer还是第三方spark-ftp库,都要明确指定输出为CSV文本格式:
官方CSV写入+FTP路径
df.write .format("csv") .option("header", "true") // 如果需要导出表头 .option("delimiter", ",") .mode(org.apache.spark.sql.SaveMode.Overwrite) .save("ftp://username:password@your-ftp-server/target-folder")
第三方spark-ftp库(比如springml)
df.write .format("com.springml.spark.sftp") .option("host", "your-ftp-server") .option("username", "your-username") .option("password", "your-password") .option("fileType", "csv") // 强制指定文件类型为CSV .option("header", "true") .mode(org.apache.spark.sql.SaveMode.Overwrite) .save("/target-folder-on-ftp")
3. 优化临时文件处理
从日志看Spark先写本地临时目录再同步到FTP,你可以指定自定义临时目录,或者配置库直接写入远程:
// 用springml库指定自定义临时目录,方便后续清理 df.write .format("com.springml.spark.sftp") .option("host", "your-ftp-server") .option("username", "your-username") .option("password", "your-password") .option("tempDir", "/your-local-temp-path") .option("fileType", "csv") .mode(org.apache.spark.sql.SaveMode.Overwrite) .save("/target-folder")
如果还是有残留文件,写入完成后可以手动清理临时目录里的.crc和临时文件。
额外排查建议
- 确认Spark版本和你使用的spark-ftp库版本兼容(比如Spark 3.x需要用对应版本的库)
- 检查FTP服务器的传输模式,确保用的是ASCII模式而不是二进制模式传输文本文件
- 查看完整的Spark日志,有没有被忽略的警告信息,比如格式转换失败的提示
内容的提问来源于stack exchange,提问作者aarafeh
相关产品推荐
相关产品推荐

