Spark写入HDFS数据SUCCESS文件生成控制
Spark写入HDFS数据SUCCESS文件
- 1、_SUCCESS的控制
- 2、_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