等待后端时Spark上下文停止

时间:2019-05-23 17:31:24

标签: apache-spark

我有一个长时间运行的EMR步骤,该步骤在EMR客户端模式下执行spark-submit。在作业执行之间,如有任何配置更改,例如--executor-memory,我将在下一次执行之前手动重新启动Spark上下文。

当我尝试使用

用新配置重新启动上下文时,遇到了以下异常
currentSparkSession.close();
return SparkSession.builder().config(newConfig).getOrCreate();
19/05/23 15:52:35 ERROR SparkContext: Error initializing SparkContext.
java.lang.IllegalStateException: Spark context stopped while waiting for backend
    at org.apache.spark.scheduler.TaskSchedulerImpl.waitBackendReady(TaskSchedulerImpl.scala:689)
    at org.apache.spark.scheduler.TaskSchedulerImpl.postStartHook(TaskSchedulerImpl.scala:186)
    at org.apache.spark.SparkContext.<init>(SparkContext.scala:567)
    at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2516)
    at org.apache.spark.sql.SparkSession$Builder$$anonfun$7.apply(SparkSession.scala:923)
    at org.apache.spark.sql.SparkSession$Builder$$anonfun$7.apply(SparkSession.scala:915)
    at scala.Option.getOrElse(Option.scala:121)
    at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:915)
.
.
.
19/05/23 15:52:35 INFO SparkContext: SparkContext already stopped.
19/05/23 15:52:35 WARN TransportChannelHandler: Exception in connection from /172.31.0.165:42556
java.io.IOException: Connection reset by peer
    at sun.nio.ch.FileDispatcherImpl.read0(Native Method)
    at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39)
    at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
    at sun.nio.ch.IOUtil.read(IOUtil.java:192)
    at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380)
    at io.netty.buffer.PooledUnsafeDirectByteBuf.setBytes(PooledUnsafeDirectByteBuf.java:221)
    at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:899)
    at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:275)
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:119)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:643)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:566)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:480)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:442)
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:131)
    at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144)
    at java.lang.Thread.run(Thread.java:748)

我尝试让线程稍微休眠一下,以防在停止和启动之间需要一些时间,例如:

currentSparkSession.close();
Thread.sleep(5000); // Sleep 5 seconds
return SparkSession.builder().config(newConfig).getOrCreate();

但这也不起作用。我查看了Spark源代码,看起来currentSparkSession.close()直到它实际上停止为止都不会返回,因此使Thread休眠不会执行任何操作。

我也在容器日志中看到了这一点

Error occurred during initialization of VM
Initial heap size set to a larger value than the maximum heap size
End of LogType:stdout

这使我感到困惑,因为我在两次执行之间更改的唯一配置是--executor-memory,实际上我删除了它而不是增加它。

我在该网站上发现了类似的问题,例如Apache Spark running spark-shell on YARN error,但这些建议看起来实际上只是关闭了一些对我来说并不十分安全的资源管理器验证检查。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

这是因为我尝试发送的请求--executor-memory(恰好设置为Xmx,最大堆大小)比在初始Spark提交上配置的Xms(初始堆大小)低。因为最大堆大小永远不能小于初始堆大小,所以引发了异常。