spark:将数据帧写入文件与将 rdd 写入 hdfs 中的文件之间的区别

时间:2021-05-27 19:02:48

标签: apache-spark pyspark apache-spark-sql hdfs rdd

在 hdfs 中将数据帧写入 csv 文件和将 rdd 写入 csv 文件有区别吗?

  1. 我有一个将 rdd 写入文件的 Scala 程序
  2. 将数据帧写入 csv 文件的 pyspark 程序

两个作业都在具有相同内存配置的同一个 Spark 集群上运行。我观察到 pyspark 作业因纱线内存开销问题而失败,该问题可以输出 10GB 文件。但 Scala 程序运行良好,输出 40 GB 文件,没有内存问题。

Pyspark 内部步骤,每次都因内存而失败。

csv at NativeMethodAccessorImpl.java:0. +details
org.apache.spark.sql.DataFrameWriter.csv(DataFrameWriter.scala:644)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
py4j.Gateway.invoke(Gateway.java:282)
py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
py4j.commands.CallCommand.execute(CallCommand.java:79)
py4j.GatewayConnection.run(GatewayConnection.java:238)
java.lang.Thread.run(Thread.java:748) 

用于写入 CSV 文件的 Spark 内部步骤

runJob at SparkHadoopWriter.scala:78+details
org.apache.spark.SparkContext.runJob(SparkContext.scala:2087)
org.apache.spark.internal.io.SparkHadoopWriter$.write(SparkHadoopWriter.scala:78)
org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsHadoopDataset$1.apply$mcV$sp(PairRDDFunctions.scala:1096)

我在将 df 写入 hdfs 时做错了什么吗?任何帮助都会有所帮助。

 def save_df_in_HDFS(self,spark,application_id, df,output_file):
        #save dataframe as part files in dir and merge
        part_filename = "FINAL_DF"
        seperator = "," 
        intermediate_dir = os.path.join(self.output_dir, application_id, part_filename)
        dst_file = os.path.join(self.output_dir, application_id, output_file)
        df.write.csv(path = intermediate_dir,sep=seperator)
        self.combine_part_files_in_HDFS_dir(spark, intermediate_dir, dst_file, False, True)

斯卡拉

private def saveRDDToFile(file: String, rdd: RDD[T] forSome {type T}): Unit = {
    val partFile = s"$file-parts"
    rdd.saveAsTextFile(partFile)
    hdfs.delete(file, recursive)
    hdfs.merge(partFile, file)
    hdfs.delete(partFile,true)

  }

问题在于将数据帧写入 CSV 中的 hdfs(因为 df 首先作为部分文件写入 hdfs),因为我观察到在 pyspark 作业失败后,我看不到任何部分文件。

df.write.csv(path = intermediate_dir,sep=seperator)

0 个答案:

没有答案