在Yarn集群上运行时无法完成spark批处理

3df52oht  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(399)

设置场景
我正在制作一个spark流应用程序(scala的spark 2.2.1)在一个Yarn集群(Hadoop2.7.4)上运行。
到目前为止,我设法用spark submit将申请提交给了Yarn集群。我可以看到receiver任务正确启动,并从数据库(couchbase server5.0)中获取了大量记录,而且我还可以看到这些记录被划分为多个批。
问题
但是,当我查看spark web ui上的流统计数据时,我可以看到我的批处理从未被处理过。我见过记录为0的批处理正在处理并完成,但当记录为0的批处理开始处理时,它永远不会完成。有一次它甚至被卡在了一个没有记录的批次上。
我甚至尝试尽可能简化steamingcontext上的输出操作。但是仍然使用非常简单的输出操作print(),我的批处理永远不会被处理。日志不显示任何警告或错误。
有人知道哪里不对吗?任何关于如何解决这个问题的建议都将不胜感激。
更多信息
spark应用程序的主类是根据couchbase spark connector文档中的这个示例(第一个)构建的,并结合这个示例和spark文档中的checkpoint。
现在我有3230个活动批(3229个排队,1个处理)和1个完成批(0个记录),应用程序已经运行了4小时30分钟。。。每5秒添加一批。
如果我查看执行器的“线程转储”,我会看到很多等待、定时等待和一些可运行的线程。名单将填补3截图,所以我只会张贴它,如果需要的。
下面您将看到一些来自web ui的屏幕截图
执行人概述

spark作业概述

节点概述和资源

容量调度器概述

tquggr8v

tquggr8v1#

每个屏幕截图,你有两个核心,一个用于驱动程序,另一个用于接收器。你没有一个核心来进行实际的处理。请增加核心数,然后重试。
参考:https://spark.apache.org/docs/latest/streaming-programming-guide.html#input-数据流和接收器
如果您使用的是基于接收器的输入数据流(如sockets、kafka、flume等),那么将使用单个线程来运行接收器,不留下任何线程来处理接收到的数据。因此,在本地运行时,始终使用“local[n]”作为主url,其中n>要运行的接收器数(有关如何设置主url的信息,请参阅spark属性)。

相关问题