Spark:线程“main”org.apache.spark.sql.catalyst.errors.package中的异常

时间:2017-10-25 10:56:59

标签: scala apache-spark

在运行我的spark-submit代码时,执行时出现此错误。

执行连接的Scala文件。

我很想知道这个TreeNodeException错误是什么。

为什么会出现此错误?

请分享您对此TreeNodeException错误的想法:

Exception in thread “main” org.apache.spark.sql.catalyst.errors.package$TreeNodeException: execute, tree:

2 个答案:

答案 0 :(得分:0)

我在加入数据框时也遇到了这个异常

Exception in thread “main” org.apache.spark.sql.catalyst.errors.package$TreeNodeException: execute, tree:

要修复它,我只是颠倒了连接的顺序。也就是说,我没有做df1.join(df2,on_col =“ A”),而是做了df2.join(df1,on_col =“ A”)。不确定为什么会这样,但是我的直觉告诉我,当您使用前一个命令而不是后者时,Spark必须遵循的逻辑树是混乱的。您可以将其视为我的玩具示例中Spark必须与“ A”列进行比较的次数,才能将两个数据框都加入。我知道这不是一个确定的答案,但希望对您有所帮助。

答案 1 :(得分:0)

好的,所以上面给出的堆栈跟踪信息不足以理解根本原因,但是正如您所提到的,您正在使用联接很可能是因为这种情况。我在加入时也遇到了同样的问题,如果您深入研究堆栈跟踪,您将看到类似-

+- *HashAggregate(keys=[], functions=[partial_count(1)], output=[count#73300L])
+- *Project
+- *BroadcastHashJoin 
...
Caused by: java.util.concurrent.TimeoutException: Futures timed out after [300 seconds]

这提示了失败的原因,Spark尝试使用具有超时和广播大小阈值的“广播哈希联接”进行联接,这两种情况均会导致上述错误。要根据基本错误进行修复-

增加“ spark.sql.broadcastTimeout”,默认值为300秒-

spark = SparkSession
  .builder
  .appName("AppName")
  .config("spark.sql.broadcastTimeout", "1800")
  .getOrCreate()

或增加广播阈值,默认值为10 MB-

spark = SparkSession
      .builder
      .appName("AppName")
      .config("spark.sql.autoBroadcastJoinThreshold", "20485760 ")
      .getOrCreate()

或通过将值设置为-1来禁用广播联接

spark = SparkSession
          .builder
          .appName("AppName")
          .config("spark.sql.autoBroadcastJoinThreshold", "-1")
          .getOrCreate()

更多详细信息可以在这里找到-https://spark.apache.org/docs/latest/sql-performance-tuning.html