Spark Dataframe Write to CSV在独立集群模式下创建_temporary目录文件

时间:2018-08-30 04:27:00

标签: java csv apache-spark dataframe apache-spark-sql

我正在具有2个工作节点的群集中运行spark job!我正在使用下面的代码(spark java)将计算的数据帧作为csv保存到辅助节点。

dataframe.write().option("header","false").mode(SaveMode.Overwrite).csv(outputDirPath); 我试图了解spark如何在每个工作程序节点上写入多个零件文件。

Run1)worker1具有part filesSUCCESSworker2_temporarty/task*/part*个任务都在运行零件文件。

Run2)worker1有零件文件,还有_temporary目录; worker2multiple 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.3Java 8, no HDFS

3 个答案:

答案 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)下生成

我们可以设置属性

  1. 通过与--conf 'spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version=2'中的spark-submit command相同

  2. 或使用sparkContext javaSparkContext.hadoopConifiguration().set("mapreduce.fileoutputcommitter.algorithm.version","2")

  3. 设置属性

我了解spark docs中概述的失败情况的后果,但是我达到了预期的结果!

  

spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version ,默认值为1
  的   文件输出提交者算法版本,有效算法版本   数字:1或2。版本2可能有更好的性能,但版本1   可能会在某些情况下更好地处理故障   MAPREDUCE-4815。