Apache Spark外部加入需要很长时间

时间:2016-03-26 02:41:27

标签: apache-spark apache-spark-sql

我是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个字段,如srcidstccode和客户详细信息,如名字,姓氏等。它们是小字符串,最初是oracle表中的varchar。

两个数据帧都有大约300万条记录。

当我们运行这项工作时,我们看到很多缓慢,因为刽子手需要大约2个小时才能完成计算。我们尝试了许多设置,如左广播加入和设置分区数,但无济于事。

当数据很小(50K文件)时,作业在6分钟内完成。我看到了Spark UI,并且只进行了火花执行计算。

我们甚至为每个执行者12 G设置了内存,并为其指定了24个具有NUM个核心的刽子手为20。

我们正在使用与Cloudera 5.X集群捆绑在一起并与Yarn一起运行的Spark 1.5.0。

请你告诉我在哪里可以调试除火花背景之外的缓慢?

2 个答案:

答案 0 :(得分:0)

我建议的一种方法是,检查你的df3的物理计划,并确保你最后没有交叉产品。另一个是,检查你的spark.sql.shuffle.partitions并增加它,如果它更低。使用200左右的地方。

在非常重要的任务中优化连接,它需要分析很多东西。另外,确保你打开钨。将spark.sql.tungsten.enabled设置为true。

在这些之后检查并告诉我。对于连接,1.5.0会慢一点,因为我认为它没有添加完整的优化列表。不过,请检查这些并告诉我。

答案 1 :(得分:0)

此问题已修复。问题是如果输入键中有null,则spark会创建一个cartsian连接。我们通过从键中删除空值

来解决这个问题