设置场景
我正在努力在Yarn集群(Hadoop 2.7.4)上运行Spark流应用程序(带有Scala的Spark 2.2.1)。
到目前为止,我设法通过spark-submit将应用程序提交到Yarn集群。我可以看到接收器任务正确启动并从数据库(Couchbase Server 5.0)中获取大量记录,我还可以看到记录被分成批次。
问题
当我查看Spark Web UI上的Streaming Statistics时,我可以看到我的批处理从未被处理过。我已经看到有0个记录的批处理过程和完成但是当一个记录开始处理的批处理它永远不会完成。有一次它甚至卡在一个有0条记录的批次上。
我甚至尝试尽可能简化SteamingContext上的输出操作。但仍然使用非常简单的输出操作print(),我的批次永远不会被处理。日志不显示任何警告或错误。
有谁知道可能出错了什么?任何关于如何解决这个问题的建议都将非常感激。
更多信息
Spark应用程序的主要类是从Couchbase Spark Connector文档中的this example(第一个)与this example以及Spark文档中的检查点一起构建的。
现在我有3230个有效批次(3229个排队和1个处理)和1个已完成批次(有0个记录),应用程序已运行4小时30分钟...并且每5秒添加一个批次
如果我查看执行程序的“线程转储”,我会看到很多WAITING,TIMED WAITING和一些RUNNABLE线程。该列表将填充3个屏幕截图,因此我只会在需要时发布。
您可以在下面找到Web UI的一些截图
执行人概述
Spark职位概述
包含资源的节点概述
容量调度程序概述
答案 0 :(得分:1)
每个屏幕截图,您有2个核心,1个用于驱动程序,另一个用于接收器。您没有实际处理的核心。请增加核心数量,然后重试。
参考:https://spark.apache.org/docs/latest/streaming-programming-guide.html#input-dstreams-and-receivers
如果您正在使用基于接收器的输入DStream(例如套接字,Kafka,Flume等),那么将使用单个线程来运行接收器,而不留下用于处理接收数据的线程。因此,当在本地运行时,总是使用“local [n]”作为主URL,其中n>要运行的接收器数量(有关如何设置主设备的信息,请参阅Spark属性)。