由于执行者丢失导致洗牌阶段失败

Shuffle Stage Failing Due To Executor Loss

我的 spark 作业失败时出现以下错误 **"org.apache.spark.shuffle.FetchFailedException: The relative remote executor(Id: 21), which maintains the block data to fetch is dead."**

查看我的 spark 作业

输入大小约为 35 GB

我已经将所有较小的 table 与母亲 table 一起广播加入 dataframe1 然后我将每个大的 table 和 [=12= 加盐] 在我加入 dataframe1 之前(左 table)。

使用的配置文件:

@configure(profile=[
     'EXECUTOR_MEMORY_LARGE',
     'NUM_EXECUTORS_32',
     'DRIVER_MEMORY_LARGE',
     'SHUFFLE_PARTITIONS_LARGE'
])

使用上述方法和配置文件,我能够将运行时间减少 50%,但我仍然遇到 Shuffle Stage Failing Due to Executor Loss 问题。

有什么办法可以解决这个问题吗?

您可以尝试多种方法:

  1. 广播连接:如果您使用广播提示连接多个较小的 tables,那么生成的 table(许多较小的 tables)可能太大而无法容纳在每个执行器内存中。因此,您需要查看 dataframe1 的总大小。
  2. 35GB确实不大。也可以尝试配置文件“EXECUTOR_CORES_MEDIUM”,它确实增加了数据计算的并行性。使用动态分配(16 个执行程序应该适合 35GB)而不是静态分配。如果一次没有 32 个执行程序可用,则构建不会开始。 “DRIVER_MEMORY_MEDIUM”应该足够了。
  3. Spark 3.0 通过自适应查询执行自行处理倾斜连接。所以,你不需要使用加盐技术。有一个名为“ADAPTIVE_ENABLED”的配置文件,您可以使用 foundry。自适应查询执行的其他设置,您必须使用 Foundry 随时可用的“ctx”spark 上下文对象手动设置。

AQE的一些参考资料: https://docs.microsoft.com/en-us/azure/databricks/spark/latest/spark-sql/aqe https://spark.apache.org/docs/latest/sql-performance-tuning.html#adaptive-query-execution