【问题标题】:Spark: Tasks with zero input takes forever to completeSpark:零输入的任务需要永远完成
【发布时间】:2019-12-07 07:07:49
【问题描述】:

火花 2.2

我有一个从 HDFS 读取压缩数据、应用 ETL 逻辑并将输出写回 HDFS 的 spark 作业。但是,当我在 spark UI 中看到任务级别数据时,某些任务的输入记录/大小标记为 0.0B/6(即 0.0B/N,其中 N

我了解数据倾斜会使 1 个分区比其他分区大得多,从而导致任务滞后。但是,我看到了相反的行为 - 输入为 100MB/500MB 的任务正在完成,而输入为 0.0B 的任务被挂起。

你见过这样的行为吗?我应该如何调试和解决问题?任何帮助表示赞赏。谢谢!

例如 Spark UI 数据:

Task ID ▴   Address         Status          Input Size / Records  Task Duration
 1          machine:xxxx     Completed         37.0 MB / 63106       2Min 5Sec
 2          machine:xxxx     Running           0.0 B / 64068         20Hrs 50Sec
 3          machine:xxxx     Running           0.0 B / 65045         20Hrs 50Sec
 4          machine:xxxx     Completed         38.1 MB / 64255       3Mins 7Sec
 5          machine:xxxx     Completed         52.3 MB / 82091       9Mins 3Sec
 6          machine:xxxx     Completed         49.1 MB / 79232       10Mins 6Sec
 7          machine:xxxx     Running           0.0 B / 48337         20Hrs 50Sec
 8          machine:xxxx     Running           0.0 B / 59438         20Hrs 50Sec

【问题讨论】:

    标签: apache-spark apache-spark-sql bigdata


    【解决方案1】:

    尝试在单核上运行您的代码以进行调试,您可能没有使用线程安全代码并且您的作业陷入竞争状态。像这样的东西:link

    【讨论】:

      【解决方案2】:

      通常会发生这种情况,因为 spark 在开始实际读取数据之前执行了很长时间的操作。经典地,您可以通过递归搜索非常大的文件系统或枚举速度慢的文件系统来触发此行为。同样,等待非集群数据库可能会导致这种行为。没有看到你的代码很难说更多。

      【讨论】:

      • 感谢您的评论。代码中没有什么花哨的,它的标准数据 engg - 读取原始数据(压缩约 100GB)--> 应用 UDF 和过滤器--> 写成 parquet
      • @SaurabhAgrawal 好吧,你说这是标准的,但你看到的是你以前从未见过的东西。如果没有代码(至少用于阅读)和对数据在磁盘上的布局方式(文件数量、格式)的描述,我只能说我在上面做了什么。
      猜你喜欢
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多