Scala 在HDF上写入数据需要很长时间

Scala 在HDF上写入数据需要很长时间,scala,Scala,在HDFS上写入文件创建许多零件文件(200个)并花费很长时间 我正在将配置单元表(使用SqlContext.sql)加载到数据帧1(6K记录)中,并注册到临时表中。我将临时表与另一个配置单元表(500万条记录)连接起来,并加载到数据帧2中。我正在使用左外连接使用dataframe 2值更新dataframe 1,并尝试将dataframe_1(6K记录)写入HDFS文件,这需要1小时30分钟。我已经尝试过了 重新分区(数据帧_1.rdd.repartition(2)) 不合并写入文件(1) 只

在HDFS上写入文件创建许多零件文件(200个)并花费很长时间

我正在将配置单元表(使用SqlContext.sql)加载到数据帧1(6K记录)中,并注册到临时表中。我将临时表与另一个配置单元表(500万条记录)连接起来,并加载到数据帧2中。我正在使用左外连接使用dataframe 2值更新dataframe 1,并尝试将dataframe_1(6K记录)写入HDFS文件,这需要1小时30分钟。我已经尝试过了 重新分区(数据帧_1.rdd.repartition(2)) 不合并写入文件(1) 只写一条记录,看看它是否更快 但是没有帮助。即使在数据帧_1上显示(10)条记录也需要很长时间。 我正在使用spark解释器用齐柏林飞艇编写代码。我也没有访问任何配置设置的权限。需要与支持团队联系

我不熟悉大数据平台。任何hep都将不胜感激

%spark

import org.apache.hadoop.fs._
import org.apache.hadoop.fs.FileSystem
import org.apache.hadoop.fs.Path

val fs=FileSystem.get(sc.hadoopConfiguration)
val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
val Dataframe_1 = sqlContext.sql("""select * from  Hive_Table_1""")
Dataframe_1.registerTempTable("Dataframe_table")

val Dataframe_2 = sqlContext.sql("""SELECT * FROM 
(select B.col1,    B.col2,    A.col4,    B.col3 FROM Dataframe_table A 
left join  Hive_Table_2  B on a.col1=b.col1 and a.col2=b.col2) A """ )

val Dataframe_1 = 
Dataframe_1.join(Dataframe_2,Seq("col1","col2"),"leftouter")
.withColumn("col3", when($"col3".isNotNull,"Path Found").otherwise("Path 
Not Found"))

Dataframe_1.coalesce(1).write.format("com.databricks.spark.csv")
.option("header","true").save("/abc")

如您所说,如果您禁用了对HDFS的写入,并且作业仍然很慢,则意味着对HDFS的写入不是瓶颈。这是预期的:结果的大小与第一个数据帧(6k记录)的大小相同。无论如何,写它应该是相当快的。 所以你的问题很可能来自加入。是的,大型表的连接可能需要几个小时

为了验证这些东西,我通常将
.write
替换为
.count
,以隔离io操作。但它可能不适用于您的情况,因为spark sql api可能会优化
.count


此外,您还应该将
coalsece
替换为
repartition
,因为前者消除了并行性。

如果不编写hdfs,作业速度相当快。只需要2分钟。当我开始将连接的数据写入hdfs时,或者当我尝试使用show()方法显示连接的数据时,就会出现问题。你是说下面的代码写数据很快。Dataframe_1.repartition(1).write.format(“com.databricks.spark.csv”).option(“header”、“true”).save(“/abc”)您不能只删除对磁盘的写入。Spark使用惰性评估模型。因此,如果你不调用像
write
of
show
这样的实际触发计算的操作,你就无法衡量性能。我并不是说
重新分区
工作得很快。但是,
coalesce
肯定会更慢。或者您可以调用
coalesce(1,shuffle=true)
,这相当于
重新分区。我将尝试使用shuffle合并并检查性能。coalesce(1,shuffle=true)给出错误“方法coalesce的参数太多”,那么它对于Sql api不存在。仅适用于Rdd。只需使用重新分区。