我有一个基本的火花工作,可以做几个连接。加入的3个数据框有点大,每个数据库都有近20亿条记录。我有一个Spark基础设施,可以在必要时自动扩展节点。这似乎是一个非常简单的spark SQL查询,其结果我写入磁盘。但是当我从 Spark UI 看一下时,这份工作总是停留在99%。
我尝试过的一些事情是:
executors
和executor memory
。repartition
。join
代替spark SQL join
等然而,这些都没有奏效。如果有人可以分享解决这个问题的经验,那就太好了。提前谢谢。
答案 0 :(得分:2)
由于连接操作,具有相同键的所有记录都被拖放到同一个执行程序。如果数据偏斜,这意味着有一个或几个键在行数方面占主导地位。然后这个单一的执行器必须处理所有这些行。基本上你的Spark作业变成单线程,因为这个单一的密钥需要由一个线程处理。
重新分区无效,因为您的加入操作将通过散列连接键再次对数据进行洗牌。如果运行不正常,您可以尝试增加分区数。
此视频解释了问题,并提出了一个解决方案: https://www.youtube.com/watch?v=6zg7NTw-kTQ
干杯,福科