擅长:python、mysql、java
<p>我的直觉是您使用了太多的分区。我会第一次尝试大幅减少他们的数量。你可以在这个主题上找到这个有趣的<a href="https://medium.com/@adrianchang/apache-spark-partitioning-e9faab369d14" rel="nofollow noreferrer">post</a></p>
<p>如果分区是平衡的,则按分区平均有<code>29 millions /80k partitions = 362</code>个观测值。我想这还不够。你花了很多时间安排任务,而不是执行任务</p>
<p>如果没有平衡分区(请参见<a href="https://dataengi.com/2019/02/06/spark-data-skew-problem/" rel="nofollow noreferrer">here</a>),情况会变得更糟。这通常会造成瓶颈,这在您的案例中似乎会发生。有几个选项:</p>
<ul>
<li>您可以<code>coalesce</code>将数据分配到较少的分区。这比使用<code>repartition</code>要好,因为它避免了完全的混乱</li>
<li><code>repartitionByRange</code>如果您希望基于某些列分割数据。您将不会像使用<code>coalesce</code>或<code>repartition</code>那样拥有平衡的分区,但如果使用后者,则会非常有用。您需要使用这些分割列的操作</li>
</ul>
<p>您可以使用<code>spark.sql.shuffle.partitions</code>和<code>spark.default.parallelism</code>更改有关分区的默认值</p>
<p>根据我的经验,这是一个猜测。找到分区的adequat数很难,但值得。请告诉我它是否有帮助,或者您是否仍然遇到瓶颈</p>