1

在云Datafusion中,我使用连接器转换来连接两个表。

其中一个是一个大约有 87M 连接的大表,而另一个是一个只有约 250 条记录的小表。我在连接器中使用了 200 个分区。

这会导致以下故障:

org.apache.spark.SparkException:作业因阶段失败而中止:阶段 7.0 中的任务 50 失败 4 次,最近一次失败:阶段 7.0 中丢失任务 50.3(TID xxx,cluster_workerx.c.project.internal,执行程序 6): ExecutorLostFailure(由于其中一项正在运行的任务导致执行器 6 退出) 原因:执行器心跳在 133355 毫秒后超时 java.util.concurrent.ExecutionException: java.lang.RuntimeException: org.apache.spark.SparkException: Application application_xxxxx finished with failed status

仔细查看 Spark UI 的 200 个 Join 任务,87m 条记录中有近 80% 进入一个任务 O/P,该任务 O/P 因心跳错误而失败,而成功的任务几乎没有记录 O/P ~<10k记录

似乎 spark 执行了一个随机哈希连接,在 datafusion/cdap 中是否有一种方法可以强制广播连接,因为我的一个表非常小?或者我可以对集群配置进行配置更改以使此加入工作吗?

我可以在数据融合管道中进行哪些性能调整。我没有找到对配置的任何参考,在 Datafusion 文档中进行了调整

4

1 回答 1

1

您可以org.apache.spark.sql.functions.broadcast(Dataset[T])用来标记要在加入时广播的数据帧/数据集。广播并不总是得到保证,但对于 250 条记录,它会起作用。如果具有 87M 行的数据帧被均匀分区,那么它应该会提高性能。

于 2020-01-11T01:44:22.823 回答