我是Spark的新手。我有两个Spark SQl Dataframes。代码就是这样的
val df1 = sparksql.read.format(com.databricks.avro).loadfiles(filespath)
val df2 = sparksql.sql(select * from hivedb)
val df3 = df1.join(df2,df1.srcid <=> df2.srcid and df1.srccode <=> df2.srccode, left_outer)
sqlcontext.cacheastable(""table)
val insertid = sparkcontext.sql("select * from table where cid is null")
val updateid = sparkcontext.sql("select * from table where cid is not null")
然后我们将这两个df保存到数据库中。
这两个数据框都包含大约10个字段,如srcid
,stccode
和客户详细信息,如名字,姓氏等。它们是小字符串,最初是oracle表中的varchar。
两个数据帧都有大约300万条记录。
当我们运行这项工作时,我们看到很多缓慢,因为刽子手需要大约2个小时才能完成计算。我们尝试了许多设置,如左广播加入和设置分区数,但无济于事。
当数据很小(50K文件)时,作业在6分钟内完成。我看到了Spark UI,并且只进行了火花执行计算。
我们甚至为每个执行者12 G设置了内存,并为其指定了24个具有NUM个核心的刽子手为20。
我们正在使用与Cloudera 5.X集群捆绑在一起并与Yarn一起运行的Spark 1.5.0。
请你告诉我在哪里可以调试除火花背景之外的缓慢?
答案 0 :(得分:0)
我建议的一种方法是,检查你的df3的物理计划,并确保你最后没有交叉产品。另一个是,检查你的spark.sql.shuffle.partitions
并增加它,如果它更低。使用200左右的地方。
在非常重要的任务中优化连接,它需要分析很多东西。另外,确保你打开钨。将spark.sql.tungsten.enabled
设置为true。
在这些之后检查并告诉我。对于连接,1.5.0会慢一点,因为我认为它没有添加完整的优化列表。不过,请检查这些并告诉我。
答案 1 :(得分:0)
此问题已修复。问题是如果输入键中有null,则spark会创建一个cartsian连接。我们通过从键中删除空值
来解决这个问题