【发布时间】: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”选项卡中看到它,因为即使所有作业都成功,查询仍在运行,但您根本无法深入了解它。
我确信还有更多改进方法,但以下两种方法对我来说已经足够了:
- 减少文件数
- 将
parquet.enable.summary-metadata设置为false
【问题讨论】:
-
会不会只是一个 spark UI 错误?真的需要这么长时间才能完成吗?
-
好像不是这样。当我发现集群处于这种不确定状态时,实际上什么都没有发生。
-
在 15 分钟的工作完成期间,您是否遇到过任何执行程序/工作程序故障?如果是,并且系统过载,则可能是操作系统花了很多时间来启动下一个执行程序/工作程序(由于系统资源有限)。
-
Spark UI 没有报告任何故障,并且几个工人的日志没有显示任何明显的异常。我将更新问题,因为我目前正在 spark 集群中运行。
-
所以我目前的怀疑是我这边的错误逻辑打开了许多执行许多异步套接字写入的第 3 方库对象。由于我的代码没有阻止它,因此火花作业能够成功完成。但是由于产生的线程或套接字,下一个作业在该进程退出时被阻止。火花工作是否开始阻止工人的清洁状态?我需要几个小时来确认这一点,因为我还没有小的可重现代码。
标签: scala hadoop apache-spark