当两个或多个spark作业具有相同的输出目录时,文件的相互删除将不可避免。
我正在用spark2.4.4在append模式下编写一个Dataframe,我想向spark的tmp dir添加一个时间戳以避免这些删除。
例子:
我的工作是写信 hdfs:/outputFile/0/tmp/file1.parquet
使用其他数据调用相同的spark作业并写入 hdfs:/outputFil/0/tm/file2.parquet
我想让jobspark1写信来 hdfs:/outputFile/0/tmp+(timeStamp)/file1.parquet
另一份工作写进去 hdfs:/outputFile/0/tmp+(timeStamp)/file2.parquet
下一步将parques移到hdfs:/outputfile/
1条答案
按热度按时间dhxwm5r41#
当spark将数据附加到现有数据集时,spark使用fileoutputcommitter管理暂存输出文件和最终输出文件。fileoutputcommitter的行为直接影响写入数据的作业的性能。
fileoutputcommitter有两个方法:committask和commitjob。ApacheSpark2.0及更高版本使用ApacheHadoop2,它使用mapreduce.fileoutputcommitter.algorithm.version的值来控制committask和commitjob的工作方式。在hadoop 2中,mapreduce.fileoutputcommitter.algorithm.version的默认值是1。对于此版本,committask将任务生成的数据从任务临时目录移动到作业临时目录,当所有任务完成时,commitjob将数据从作业临时目录移动到最终目标。
因为驱动程序正在做commitjob的工作,对于云存储来说,这个操作可能需要很长时间。你可能经常认为你的手机“挂着”。但是,当mapreduce.fileoutputcommitter.algorithm.version的值为2时,committask会将任务生成的数据直接移动到最终目标,commitjob基本上是禁止操作的。