当 Yarn 集群上 运行 时,Spark 批处理未完成
Spark batches does not complete when running on Yarn cluster
布景
我正在努力在 Yarn 集群(Hadoop 2.7.4)上制作一个 Spark 流应用程序(Spark 2.2.1 with Scala)运行。
到目前为止,我已经成功地使用 spark-submit 将应用程序提交到 Yarn 集群。我可以看到接收器任务正确启动并从数据库(Couchbase Server 5.0)中提取了很多记录,我还可以看到记录被分成批次。
问题
当我在 Spark Web UI 上查看流统计时,我可以看到我的批次从未被处理过。我看到有 0 条记录的批次处理并完成,但是当有记录的批次开始处理时,它永远不会完成。有一次它甚至卡在了 0 条记录的批次上。
我什至尝试过尽可能简化 SteamingContext 上的输出操作。但是仍然使用非常简单的输出操作 print() 我的批次从未被处理过。日志不显示任何警告或错误。
有谁知道哪里出了问题?任何有关如何解决此问题的建议将不胜感激。
更多信息
Spark 应用程序的主要 class 是从 this example (first one) from the Couchbase Spark Connector documentation combined with this example 构建的,带有来自 Spark 文档的检查点。
现在我有 3230 个活动批次(3229 个在排队,1 个正在处理)和 1 个已完成批次(有 0 条记录)并且应用程序已经 运行ning 了 4 小时 30 分钟...并且每 5 秒添加另一批。
如果我查看执行程序的 "thread dump",我会看到很多 WAITING、TIMED WAITING 和一些 RUNNABLE 线程。该列表将填满 3 个屏幕截图,因此我只会在需要时 post 它。
下面是一些来自网络的截图UI
执行器概述
Spark 作业概述
带资源的节点概览
容量调度程序概述
根据屏幕截图,您有 2 个内核,其中 1 个用于驱动器,另一个用于接收器。您没有进行实际处理的核心。请增加内核数再试。
参考:https://spark.apache.org/docs/latest/streaming-programming-guide.html#input-dstreams-and-receivers
如果您使用基于接收器的输入 DStream(例如套接字、Kafka、Flume 等),那么单线程将用于 运行 接收器,不留下处理接收到的数据的线程。因此,当 运行 在本地时,始终使用“local[n]”作为主节点 URL,其中 n > 运行 的接收者数量(有关如何设置的信息,请参阅 Spark 属性大师)。
布景
我正在努力在 Yarn 集群(Hadoop 2.7.4)上制作一个 Spark 流应用程序(Spark 2.2.1 with Scala)运行。
到目前为止,我已经成功地使用 spark-submit 将应用程序提交到 Yarn 集群。我可以看到接收器任务正确启动并从数据库(Couchbase Server 5.0)中提取了很多记录,我还可以看到记录被分成批次。
问题
当我在 Spark Web UI 上查看流统计时,我可以看到我的批次从未被处理过。我看到有 0 条记录的批次处理并完成,但是当有记录的批次开始处理时,它永远不会完成。有一次它甚至卡在了 0 条记录的批次上。
我什至尝试过尽可能简化 SteamingContext 上的输出操作。但是仍然使用非常简单的输出操作 print() 我的批次从未被处理过。日志不显示任何警告或错误。
有谁知道哪里出了问题?任何有关如何解决此问题的建议将不胜感激。
更多信息
Spark 应用程序的主要 class 是从 this example (first one) from the Couchbase Spark Connector documentation combined with this example 构建的,带有来自 Spark 文档的检查点。
现在我有 3230 个活动批次(3229 个在排队,1 个正在处理)和 1 个已完成批次(有 0 条记录)并且应用程序已经 运行ning 了 4 小时 30 分钟...并且每 5 秒添加另一批。
如果我查看执行程序的 "thread dump",我会看到很多 WAITING、TIMED WAITING 和一些 RUNNABLE 线程。该列表将填满 3 个屏幕截图,因此我只会在需要时 post 它。
下面是一些来自网络的截图UI
执行器概述
Spark 作业概述
带资源的节点概览
容量调度程序概述
根据屏幕截图,您有 2 个内核,其中 1 个用于驱动器,另一个用于接收器。您没有进行实际处理的核心。请增加内核数再试。
参考:https://spark.apache.org/docs/latest/streaming-programming-guide.html#input-dstreams-and-receivers
如果您使用基于接收器的输入 DStream(例如套接字、Kafka、Flume 等),那么单线程将用于 运行 接收器,不留下处理接收到的数据的线程。因此,当 运行 在本地时,始终使用“local[n]”作为主节点 URL,其中 n > 运行 的接收者数量(有关如何设置的信息,请参阅 Spark 属性大师)。