我正在具有2个工作节点的群集中运行spark job
!我正在使用下面的代码(spark java)将计算的数据帧作为csv保存到辅助节点。
dataframe.write().option("header","false").mode(SaveMode.Overwrite).csv(outputDirPath);
我试图了解spark如何在每个工作程序节点上写入多个零件文件。
Run1)worker1
具有part files
和SUCCESS
; worker2
有_temporarty/task*/part*
个任务都在运行零件文件。
Run2)worker1
有零件文件,还有_temporary
目录; worker2
有multiple part files
任何人都可以帮助我了解这种行为的原因吗?
1)我是否应该将outputDir/_temporary
中的记录与part files in outputDir
一起作为输出文件的一部分?
2)是否应该在作业运行后删除_temporary
目录并将part
文件移动到outputDir
?
3)为什么不能直接在输出目录下创建零件文件?
coalesce(1)
和repartition(1)
不能为选项,因为outputDir文件本身将位于500GB
Spark 2.0.2. 2.1.3
和Java 8, no HDFS
答案 0 :(得分:3)
TL; DR 要使用基于文件系统的源正确写入(或为此读取)数据,您需要共享存储。
_temporary
目录是Spark使用的基本提交机制的一部分-数据首先被写入临时目录,一旦所有任务完成,就自动地移动到最终目的地。您可以在Spark _temporary creation reason
要使此过程成功,您需要共享文件系统(HDFS,NFS等)或等效的分布式存储(如S3)。由于您没有人,因此无法清除临时状态-Saving dataframe to local file system results in empty results。
当某些执行程序与驱动程序位于同一位置并与驱动程序共享文件系统时,就会发生观察到的行为(部分提交数据和部分未提交数据),从而对数据子集启用完全提交。
答案 1 :(得分:2)
多个零件文件基于您的数据框分区。写入的文件或数据的数量取决于您写出数据时DataFrame拥有的分区数量。默认情况下,每个数据分区写入一个文件。
您可以通过合并或重新分区来控制它。您可以缩小或增加分区。
如果合并为1,那么您将看不到其中的多个零件文件,但这会影响以并行方式写入数据。
[outputDirPath = /tmp/multiple.csv]
dataframe
.coalesce(1)
.write.option("header","false")
.mode(SaveMode.Overwrite)
.csv(outputDirPath);
关于如何引用它的问题。
以下所有部分均称为/tmp/multiple.csv
。
/tmp/multiple.csv/part-00000.csv
/tmp/multiple.csv/part-00001.csv
/tmp/multiple.csv/part-00002.csv
/tmp/multiple.csv/part-00003.csv
答案 2 :(得分:0)
经过分析,观察到我的火花作业正在使用默认的fileoutputcommitter version 1
。
然后,我包括配置以使用fileoutputcommitter version 2
代替version 1
,并在AWS的10节点spark独立集群中进行了测试。所有part-* files
都直接在outputDirPath
dataframe.write().option("header","false").mode(SaveMode.Overwrite).csv(outputDirPath)
下生成
我们可以设置属性
通过与--conf 'spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version=2'
中的spark-submit command
相同
或使用sparkContext javaSparkContext.hadoopConifiguration().set("mapreduce.fileoutputcommitter.algorithm.version","2")
我了解spark docs中概述的失败情况的后果,但是我达到了预期的结果!
spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version ,默认值为1
的 文件输出提交者算法版本,有效算法版本 数字:1或2。版本2可能有更好的性能,但版本1 可能会在某些情况下更好地处理故障 MAPREDUCE-4815。