Spark写入HDFS数据SUCCESS文件生成控制

发布于:2025-02-11 ⋅ 阅读:(67) ⋅ 点赞:(0)

Spark写入HDFS数据SUCCESS文件





1、_SUCCESS的控制

与Hive不同,MapReduce和Spark在执行写入HDFS数据任务时,数据输出目录一般都会有一个名为_SUCCESS的空文件,该文件仅用来表示任务执行成功

但有些时候,在读取HDFS中的数据时,有_SUCCESS文件会使任务报错。此时,可以在 Spark代码中加以限制,不生成_SUCCESS文件即可

在Spark的Driver端配置如下参数:

sc.hadoopConfiguration.set("mapreduce.fileoutputcommitter.marksuccessfuljobs", "false")

或在SparkSQL中配置如下参数:

set mapreduce.fileoutputcommitter.marksuccessfuljobs=false;
2、_SUCCESS的实现

在Hadoop的源码中,有一个抽象类OutputCommitter专门负责Job的生命周期管理,Hadoop默认使用org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter作为具体的实现,在FileOutputCommitter的实现中,Hadoop会根据参数mapreduce.fileoutputcommitter.marksuccessfuljobs的值来判断是否要生成_SUCCESS文件。因为该参数的默认值为true,所以我们平常跑的任务基本都会输出_SUCCESS标志文件

Spark则复用了这个OutputCommitter机制,Spark任务在运行时会从配置中获取指定的实现类,如果没有指定,Spark默认会使用org.apache.hadoop.mapred.FileOutputCommitter作为实现

相反,Hive则自己实现了一个NullOutputCommitter来作为OutputCommitter的实现类,空实现其中的所有方法,即什么也不做,因此也就无法生成_SUCCESS文件

相关描述参考:https://stackoverflow.com/questions/13082606/getting-success-file-for-hive-script

更多源码细节参考文末参考文章

参考文章:
https://blog.csdn.net/u013332124/article/details/94468945
https://blog.csdn.net/u013332124/article/details/92001346


网站公告

今日签到

点亮在社区的每一天
去签到