gpt4 book ai didi

apache-spark - Spark : Job stuck on the last 2 tasks of 100

转载 作者:行者123 更新时间:2023-12-04 12:03:42 25 4
gpt4 key购买 nike

我是 Spark 的新手,我必须支持由我们的顾问编写的应用程序。我阅读并观看了大量有关 Spark 的信息,但我仍然在为正确调整工作的小细节而苦苦挣扎。

场景:

  • 包含 5 条清理规则的 Java 类,我们将这些规则应用于 4 亿条记录的 RDD。
  • 分区数设置为 1000。
  • 最后的“操作”是对 S3 的写入,但在此之前我们将分区数减少到 100。
  • Spark UI 显示进度,但不幸的是在保存的最后阶段,任务卡在 98/100
  • 我没有使用 .collect() 但我使用 .map() 和 Spark SQL。

  • 这是我用来编写的代码:

    rdd.coalesce(100)
    .write().mode("append")
    .partitionBy("year", "month")
    .format(SPARK_AVRO_PACKAGE)
    .save(appProps.getProperty(PAGEVIEW_CLEANSED));

    我不确定是否应该努力改进代码或调整 spark/cluster 的性能。

    更新:我认为这段代码是我遇到的问题的原因。我在 SO ( Spark not distributing load to tasks evenly ) 上找到了类似的帖子,我只是不确定如何在我的情况下使用广播。

    Dataset<Row> duplicatePrefetchPrerenderHashDS = 
    hashedPageViewDS
    .select(hashedPageViewDS.col(PREFETCH_PRERENDER_HASH))
    .groupBy(hashedPageViewDS.col(PREFETCH_PRERENDER_HASH))
    .count()
    .withColumnRenamed("count", "cnt")
    .where("cnt>1");

    最佳答案

    您可以采取多种方法:

  • 您可以尝试做 distributionBy("year", "month") 这将确保每个文件夹只有 1 个分区写入。如果数据在年份和月份之间均匀分布。
  • 如果问题实际上是某些年份的偏斜。然后我会说使用repartition(1000) 和使用distributeBy("year", "month","COL1")。在上面的示例中,COL1 将是一个几乎均匀分布的列,如 DAY of MONTH 或 DATE。现在不是将 200 个(默认的随机排序值)文件写入每个分区,COL1 将决定没有文件被写入(30 个是有 DAY OF MONTH)
  • 另一件有用的事情是使用 repartition(100) 而不是 coalesce(100) ,因为 repartition 将均匀分布数据,从而导致更多分区在输出中包含每个分区的数据。
  • 关于apache-spark - Spark : Job stuck on the last 2 tasks of 100,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48324958/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com