当前位置: 首页 > 知识库问答 >
问题:

Spark将拼花写入S3,最后一个任务需要永远

洪胜涝
2023-03-14

我正在将一个拼花文件从DataFrame写入S3。当我查看Spark UI时,我可以看到除1项任务外的所有任务都在写作阶段迅速完成(例如199/200)。这最后一个任务似乎要花很长时间才能完成,而且常常由于超出执行器内存限制而失败。

我想知道最后一个任务发生了什么。如何优化它?谢谢。

共有3个答案

房唯
2023-03-14

正如其他人所指出的,数据偏差可能在起作用。

除此之外,我注意到您的任务计数是200。

配置参数spark。sql。洗牌分区配置为联接或聚合洗牌数据时使用的分区数。

此设置的默认值为200,但通常远不是最佳值。

对于小数据,200可能是多余的,您会在多个分区的开销中浪费时间。

对于大数据,200可能会导致大分区,应该将其分解为更多、更小的分区。

真正粗略的经验法则是:-cpu的分区数是2-3倍-或约128MB。

2GB是最大分区大小。如果您将鼠标悬停在2000个分区以下,则当分区数大于2000个时,Spark会使用不同的数据结构进行无序记账[1]

private[spark] object MapStatus {

  def apply(loc: BlockManagerId, uncompressedSizes: Array[Long]): MapStatus = {
    if (uncompressedSizes.length > 2000) {
      HighlyCompressedMapStatus(loc, uncompressedSizes)
    } else {
      new CompressedMapStatus(loc, uncompressedSizes)
    }
  }
...

您可以尝试在运行时使用此参数:

<代码>火花。conf.set(“spark.sql.shuffle.partitions”,“300”)

[1] spark的最佳值是什么。sql。洗牌分区,或者在使用Spark SQL时如何增加分区?

裴宜春
2023-03-14

听起来你的数据有偏差。在写入S3之前,可以通过在数据帧上调用重新分区来解决此问题。

蔺昊穹
2023-03-14

我尝试过Glemmie Helles Sindholt解决方案,效果很好。这是代码

path = 's3://...'
n = 2 # number of repartitions, try 2 to test
spark_df = spark_df.repartition(n)
spark_df.write.mode("overwrite").parquet(path)
 类似资料:
  • 我试图做一些非常简单的事情,我有一些非常愚蠢的挣扎。我想这一定与对火花的基本误解有关。我非常感谢任何帮助或解释。 我有一张非常大的桌子(~3 TB,~300毫米行,25k个分区),在s3中保存为拼花地板,我想给一些人一个很小的拼花文件样本。不幸的是,这要花很长时间才能完成,我不明白为什么。我尝试了以下方法: 然后当这不起作用时,我尝试了这个,我认为应该是一样的,但我不确定。(我添加了,以尝试调试。

  • 如果我写信 临时工。拼花文件夹我得到了和行号相同的文件号 我想我不太了解拼花地板,但它是自然的吗?

  • 我正在使用Apache Spark生成拼花文件。我可以按日期划分它们,没有问题,但在内部我似乎无法按正确的顺序排列数据。 在处理过程中,顺序似乎丢失了,这意味着拼花地板元数据是不正确的(具体来说,我想确保拼花地板行组反映排序顺序,以便特定于我的用例的查询可以通过元数据有效地过滤)。 考虑以下示例: 使用这种方法,我确实得到了正确的拼花地板分区结构(按日期)。更好的是,对于每个日期分区,我看到一个大

  • 我有一个pySpark工作(spark 2.4.1),它在10%的情况下似乎工作正常,其他时候似乎永远停留在一个任务上,我不能真正理解发生了什么。以下是我在pyspark代码中所做的: 我似乎永远停留在对“Topandas”调用的评价中。当我检查executors选项卡时,只有一个executors可以运行,调用堆栈如下: null 编辑:我也有2个执行器失败,错误如下: java.io.ioEx

  • 我是pycharm的新用户,我很难运行一个简单的文件来导入熊猫。我有以下问题: 每当我打开项目时,“扫描文件到索引”都需要很长时间。 我可以看到在索引中,它使用了Anaconda2中的包/文件,这就是为什么我的程序需要很长时间才能运行。 我已经尝试使某些文件夹“排除”,如此处所述 PyCharm 4.0.5 挂在“扫描文件以索引”后台任务上,我还删除了此处所述的“缓存”文件夹 Intelli J

  • 我有一个带有20个分区的火花数据帧df,每个分区都有一天的数据。这意味着我的输入数据帧已经按天分区。我的目标是编写一个拼花文件,该文件也按天分区。如果我尝试以下命令: df。重新划分(5)。写模式(“覆盖”)。partitionBy(['day'])。拼花地板(“路径”) 当我的输入数据框已经分区时,有很多洗牌正在发生。请注意,这个数据框包含超过10亿行,并且由于洗牌,它正在杀死我的执行器。 有没