在 hdfs 中将数据帧写入 csv 文件和将 rdd 写入 csv 文件有区别吗?
两个作业都在具有相同内存配置的同一个 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)