Spark Streaming查询上的ChannelOutputShutdownException

时间:2019-07-20 05:53:45

标签: scala apache-spark spark-structured-streaming

我已经运行spark structured streaming一段时间了,但是现在看到以下异常:

ChannelOutputShutdownException: Channel output shutdown

这是在

之后发生的
val flights2a = (spark.readStream
  .format("kafka")
  .option("kafka.bootstrap.servers", "localhost:9092")
  .option("subscribe", "airjpart3")
  .option("startingOffsets", "earliest")
  .option("max.poll.records", "20000")
  .load())

,然后进行几次查询以重组数据。这是更多的堆栈跟踪:

[0719-22:47:31.061] INFO: select * from airsyFilt
19/07/19 22:48:04 ERROR TransportClient: Failed to send RPC RPC 7871969257559858384 to mellyrn/192.168.0.3:51492: io.netty.channel.socket.ChannelOutputShutdownException: Channel output shutdown
io.netty.channel.socket.ChannelOutputShutdownException: Channel output shutdown
    at io.netty.channel.AbstractChannel$AbstractUnsafe.shutdownOutput(AbstractChannel.java:587)
    at io.netty.channel.AbstractChannel$AbstractUnsafe.flush0(AbstractChannel.java:893)
    at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.flush0(AbstractNioChannel.java:313)
    at io.netty.channel.AbstractChannel$AbstractUnsafe.flush(AbstractChannel.java:847)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.flush(DefaultChannelPipeline.java:1266)
    at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:770)
    at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:762)
    at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:743)
    at io.netty.channel.ChannelOutboundHandlerAdapter.flush(ChannelOutboundHandlerAdapter.java:115)
    at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:770)
    at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:762)
    at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:743)
    at io.netty.channel.ChannelDuplexHandler.flush(ChannelDuplexHandler.java:117)
    at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:770)
    at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:762)
    at io.netty.channel.AbstractChannelHandlerContext.access$1500(AbstractChannelHandlerContext.java:35)
    at io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask.write(AbstractChannelHandlerContext.java:1116)
    at io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.run(AbstractChannelHandlerContext.java:1050)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:399)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:464)
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:131)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NoSuchMethodError: org.apache.spark.network.util.AbstractFileRegion.transferred()J
    at org.apache.spark.network.util.AbstractFileRegion.transfered(AbstractFileRegion.java:28)
    at io.netty.channel.nio.AbstractNioByteChannel.doWrite(AbstractNioByteChannel.java:232)
    at io.netty.channel.socket.nio.NioSocketChannel.doWrite(NioSocketChannel.java:282)
    at io.netty.channel.AbstractChannel$AbstractUnsafe.flush0(AbstractChannel.java:879)
    ... 21 more
19/07/19 22:48:04 ERROR OneForOneBlockFetcher: Failed while starting block fetches
java.io.IOException: Failed to send RPC RPC 7871969257559858384 to mellyrn/192.168.0.3:51492: io.netty.channel.socket.ChannelOutputShutdownException: Channel output shutdown
    at org.apache.spark.network.client.TransportClient$RpcChannelListener.handleFailure(TransportClient.java:357)

有人见过/有见识吗?

Update1 首先,这个问题似乎是由于对Workers的内存资源施加了过多压力。 WriteStream如下:

def writes(sdf: Dataset[_], table: String, interval: String = "20 seconds", outputMode: String = "complete") = {
val outDf = (sdf.writeStream
  .outputMode(outputMode)
  .format("memory")
  .queryName(table)
  .trigger(Trigger.ProcessingTime(interval))
  .start())

正在写入的表中有太多数据无法充分存储。错误消息实际上并没有明确指出问题所在。

基于另一个答案,我提供了数据大小是元凶的证据。为避免出现此问题,对sql进行了更新,添加了limit N,如下所示:

select * from airsyFilt limit 100000 

出于诊断目的,我正在运行原始sql:生产应用仅需要聚合,因此我有能力进行此更改。

Update2 即使数据量较小到中等,也会发生上述错误。在过去的五年多的时间里,我从未见过。 spark邮件列表中最近提到了这一点,因此我目前正在尝试降级到spark 2.3.3(从2.4.2开始)。将在这里更新。

降级到Spark 2.3.3无效。所以这仍然是一个悬而未决的问题。

Update3 此代码在另一台计算机上工作正常 Spark 本身唯一的自定义设置是将log4j.properties设置为更加小气/简约。我在都是机器上做了相同的更改。

Macos Mojave是一台计算机(仅在24小时后无法运行)。另一个是Centos。通常,Spark在跨平台上的表现很好,但在这里不确定。

1 个答案:

答案 0 :(得分:0)

好吧,我发现只要在依赖列表中有不兼容的jar,就会发生NoSuchMethodError。 我强烈感到您用来运行应用程序的一些jar彼此不兼容。请查看版本。