Hi Steve, I referenced the ShutdownHookManager in my original message, but it appears to be an internal-only API. Looks like it uses a Hadoop equivalent internally, though, so I'll look into using that. Good tip about timeouts, thanks.
- Dan On Thu, Mar 17, 2016 at 5:02 AM, Steve Loughran <ste...@hortonworks.com> wrote: > > On 16 Mar 2016, at 23:43, Dan Burkert <d...@cloudera.com> wrote: > > After further thought, I think following both of your suggestions- adding > a shutdown hook and making the threads non-daemon- may have the result I'm > looking for. I'll check and see if there are other reasons not to use > daemon threads in our networking internals. More generally though, what do > y'all think about having Spark shutdown or close RelationProviders once > they are not needed? Seems to me that RelationProviders will often be > stateful objects with network and/or file resources. I checked with the C* > Spark connector, and they jump through a bunch of hoops to handle this > issue, including shutdown hooks and a ref counted cache. > > > I'd recommend using org.apache.spark.util.ShutdownHookManager as the > shutdown hook mechanism; it gives you priority over shutdown , and is > already used in the Yarn AM, DiskBlockManager and elsewhere > > > One thing to be careful about in shutdown hooks is to shut down in a > bounded time period even if you can't connect to the far end: do make sure > there are timeouts on TCP connects &c. i've hit problems with Hadoop HDFS > where, if the endpoint isn't configured correctly, the shutdown hook > blocks, causing Control-C/kill <pid> interrupts to appear to hang, and of > course a second kill just deadlocks on the original sync. (To deal with > that, I ended up recognising a 2nd Ctrl-C interrupt as a trigger for > calling System.halt(), which bails out the JVM without trying to invoke > those hooks > > > - Dan > > On Wed, Mar 16, 2016 at 4:04 PM, Dan Burkert <d...@cloudera.com> wrote: > >> Thanks for the replies, responses inline: >> >> On Wed, Mar 16, 2016 at 3:36 PM, Reynold Xin <r...@databricks.com> wrote: >> >>> There is no way to really know that, because users might run queries at >>> any given point. >>> >>> BTW why can't your threads be just daemon threads? >>> >> >> The bigger issue is that we require the Kudu client to be manually closed >> so that it can do necessary cleanup tasks. During shutdown the client >> closes the non-daemon threads, but more importantly, it flushes any >> outstanding batched writes to the server. >> >> On Wed, Mar 16, 2016 at 3:35 PM, Hamel Kothari <hamelkoth...@gmail.com> >> wrote: >> >>> Dan, >>> >>> You could probably just register a JVM shutdown hook yourself: >>> https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.Thread) >>> >>> >>> This at least would let you close the connections when the application >>> as a whole has completed (in standalone) or when your executors have been >>> killed (in YARN). I think that's as close as you'll get to knowing when an >>> executor will no longer have any tasks in the current state of the world. >>> >> >> The Spark shell will not run shutdown hooks after a <ctrl>-D if there are >> non-daemon threads running. You can test this with the following input to >> the shell: >> >> new Thread(new Runnable { override def run() = { while (true) { >> println("running"); Thread.sleep(10000) } } }).start() >> Runtime.getRuntime.addShutdownHook(new Thread(new Runnable { override def >> run() = println("shutdown fired") })) >> >> - Dan >> >> >> >>> >>> On Wed, Mar 16, 2016 at 3:29 PM, Dan Burkert <d...@cloudera.com> wrote: >>> >>>> Hi Reynold, >>>> >>>> Is there any way to know when an executor will no longer have any >>>> tasks? It seems to me there is no timeout which is appropriate that is >>>> long enough to ensure that no more tasks will be scheduled on the executor, >>>> and short enough to be appropriate to wait on during an interactive shell >>>> shutdown. >>>> >>>> - Dan >>>> >>>> On Wed, Mar 16, 2016 at 2:40 PM, Reynold Xin <r...@databricks.com> >>>> wrote: >>>> >>>>> Maybe just add a watch dog thread and closed the connection upon some >>>>> timeout? >>>>> >>>>> >>>>> On Wednesday, March 16, 2016, Dan Burkert <d...@cloudera.com> wrote: >>>>> >>>>>> Hi all, >>>>>> >>>>>> I'm working on the Spark connector for Apache Kudu, and I've run into >>>>>> an issue that is a bit beyond my Spark knowledge. The Kudu connector >>>>>> internally holds an open connection to the Kudu cluster >>>>>> <https://github.com/apache/incubator-kudu/blob/master/java/kudu-spark/src/main/scala/org/kududb/spark/KuduContext.scala#L37> >>>>>> which >>>>>> internally holds a Netty context with non-daemon threads. When using the >>>>>> Spark shell with the Kudu connector, exiting the shell via <ctrl>-D >>>>>> causes >>>>>> the shell to hang, and a thread dump reveals it's waiting for these >>>>>> non-daemon threads. Registering a JVM shutdown hook to close the Kudu >>>>>> client does not do the trick, as it seems that the shutdown hooks are not >>>>>> fired on <ctrl>-D. >>>>>> >>>>>> I see that there is an internal Spark API for handling shutdown >>>>>> <https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/util/ShutdownHookManager.scala>, >>>>>> is there something similar available for cleaning up external data >>>>>> sources? >>>>>> >>>>>> - Dan >>>>>> >>>>> >>>> >>> >> > >