Scala 在HDF上写入数据需要很长时间
在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都将不胜感激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) 只
%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
ofshow
这样的实际触发计算的操作,你就无法衡量性能。我并不是说重新分区
工作得很快。但是,coalesce
肯定会更慢。或者您可以调用coalesce(1,shuffle=true)
,这相当于重新分区。我将尝试使用shuffle合并并检查性能。coalesce(1,shuffle=true)给出错误“方法coalesce的参数太多”,那么它对于Sql api不存在。仅适用于Rdd。只需使用重新分区。