Spark worker shutdown - 如何释放共享资源

van*_*jar 6 apache-spark spark-streaming

在Spark手册中,建议在worker代码中使用共享静态资源(例如连接池).

手册中的示例:

dstream.foreachRDD { rdd =>
  rdd.foreachPartition { partitionOfRecords =>
    // ConnectionPool is a static, lazily initialized pool of connections
    val connection = ConnectionPool.getConnection()
    partitionOfRecords.foreach(record => connection.send(record))
    ConnectionPool.returnConnection(connection)  // return to the pool for future reuse
  }
}
Run Code Online (Sandbox Code Playgroud)

在执行程序关闭之前需要释放/关闭静态资源时该怎么办?没有地方可以调用该close()功能.试过一个关机钩子,但它似乎没有帮助.

实际上我的工作进程当前变成了僵尸,因为我正在使用共享资源创建一个非deamon线程池(HBase异步客户端),这意味着JVM会一直挂起.

我正在使用驱动程序上调用的Spark Streaming graceful shutdown:

streamingContext.stop(true, true);
Run Code Online (Sandbox Code Playgroud)

编辑:

似乎Spark JIRA中存在一个问题,即处理同样的问题

https://issues.apache.org/jira/browse/SPARK-10911