【问题标题】:Spark: long delay between jobsSpark:作业之间的长时间延迟
【发布时间】:2016-07-31 05:07:07
【问题描述】:

因此,我们正在运行 spark 作业来提取数据并进行一些扩展的数据转换并写入多个不同的文件。一切都运行良好,但我在资源密集型作业完成和下一个作业开始之间随机出现大量延迟。

在下图中,我们可以看到安排在 17:22:02 的作业需要 15 分钟才能完成,这意味着我预计下一个作业将安排在 17:37:02 左右。但是,下一个作业安排在 22:05:59,即作业成功后的 +4 小时。

当我深入研究下一个作业的 spark UI 时,它显示

(带有 Hadoop 2 的 Spark 1.6.1)

更新:

我可以确认 David 在下面的回答是关于 Spark 中如何处理 IO 操作的问题有点出乎意料。 (考虑到排序和/或其他操作,文件写入在写入之前基本上在幕后“收集”是有道理的。)但我对 I/O 时间不包括在作业执行时间中这一事实感到有点不安。我想您可以在 spark UI 的“SQL”选项卡中看到它,因为即使所有作业都成功,​​查询仍在运行,但您根本无法深入了解它。

我确信还有更多改进方法,但以下两种方法对我来说已经足够了:

  1. 减少文件数
  2. parquet.enable.summary-metadata设置为false

【问题讨论】:

  • 会不会只是一个 spark UI 错误?真的需要这么长时间才能完成吗?
  • 好像不是这样。当我发现集群处于这种不确定状态时,实际上什么都没有发生。
  • 在 15 分钟的工作完成期间,您是否遇到过任何执行程序/工作程序故障?如果是,并且系统过载,则可能是操作系统花了很多时间来启动下一个执行程序/工作程序(由于系统资源有限)。
  • Spark UI 没有报告任何故障,并且几个工人的日志没有显示任何明显的异常。我将更新问题,因为我目前正在 spark 集群中运行。
  • 所以我目前的怀疑是我这边的错误逻辑打开了许多执行许多异步套接字写入的第 3 方库对象。由于我的代码没有阻止它,因此火花作业能够成功完成。但是由于产生的线程或套接字,下一个作业在该进程退出时被阻止。火花工作是否开始阻止工人的清洁状态?我需要几个小时来确认这一点,因为我还没有小的可重现代码。

标签: scala hadoop apache-spark


【解决方案1】:

I/O 操作通常会在主节点上产生大量开销。由于这项工作没有并行化,因此可能需要相当长的时间。而且由于它不是工作,因此它不会显示在资源管理器 UI 中。一些由主节点完成的 I/O 任务示例

  • Spark 将写入临时 s3 目录,然后使用主节点移动文件
  • 文本文件的读取经常发生在主节点上
  • 在写入 parquet 文件时,主节点会在写入后扫描所有文件以检查架构

这些问题可以通过调整纱线设置或重新设计代码来解决。如果您提供一些源代码,我也许可以查明您的问题。

Discussion of writing I/O Overhead with Parquet and s3

Discussion of reading I/O Overhead "s3 is not a filesystem"

【讨论】:

  • 你是我的最爱!我尚未确认,但根据我阅读的内容和它似乎存在的行为。谢谢老哥!
【解决方案2】:

问题

我在 EMR 5.5.1 上使用 pyspark 在 s3 上编写镶木地板数据时遇到了类似的问题。所有工作人员将完成在输出文件夹中的_temporary 存储桶中写入数据,Spark UI 将显示所有任务都已完成。但是 Hadoop 资源管理器 UI 不会为应用程序释放资源,也不会将其标记为完成。在检查 s3 存储桶时,似乎 spark 驱动程序正在将文件 1 一个从 _temporary 目录移动到输出存储桶,这非常慢并且所有集群都处于空闲状态,除了驱动程序节点。

解决方案

对我有用的解决方案是通过将配置属性 spark.sql.parquet.fs.optimized.committer.optimization-enabled 设置为 true 来使用 AWS (EmrOptimizedSparkSqlParquetOutputCommitter) 的提交者类。

例如:

spark-submit ....... --conf spark.sql.parquet.fs.optimized.committer.optimization-enabled=true

pyspark ....... --conf spark.sql.parquet.fs.optimized.committer.optimization-enabled=true

注意此属性在 EMR 5.19 或更高版本中可用。

结果

使用上述解决方案在 EMR 5.20.0 上运行 spark 作业后,它没有创建任何 _temporary 目录,所有文件都直接写入输出存储桶,因此作业很快完成。

更多详情:
https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-s3-optimized-committer.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 2017-02-23
    相关资源
    最近更新 更多