Apache spark Spark worker关机-如何释放共享资源
在Spark手册中,建议在工作代码中使用共享静态资源(例如连接池) 示例来自:Apache spark Spark worker关机-如何释放共享资源,apache-spark,spark-streaming,Apache Spark,Spark Streaming,在Spark手册中,建议在工作代码中使用共享静态资源(例如连接池) 示例来自: dstream.foreachRDD{rdd=> rdd.foreachPartition{partitionOfRecords=> //ConnectionPool是一个静态的、延迟初始化的连接池 val connection=ConnectionPool.getConnection() Records.foreach分区(记录=>connection.send(记录)) ConnectionPool.return
dstream.foreachRDD{rdd=>
rdd.foreachPartition{partitionOfRecords=>
//ConnectionPool是一个静态的、延迟初始化的连接池
val connection=ConnectionPool.getConnection()
Records.foreach分区(记录=>connection.send(记录))
ConnectionPool.returnConnection(connection)//返回池以便将来重用
}
}
在关闭执行器之前,当需要释放/关闭静态资源时,该怎么办?没有地方可以调用close()
函数。尝试了一个关机挂钩,但似乎没有帮助
实际上,目前我的工作进程变成了僵尸,因为我使用的共享资源创建了一个非deamon线程池(HBase async client),这意味着JVM将永远挂起
我使用的是在驱动程序上调用的火花流:
streamingContext.stop(true,true);
编辑: 似乎Spark JIRA中已经存在一个问题,它正在处理相同的问题
想分享一些代码片段吗?我的实际代码太复杂了。但是让我们假设
ConnectionPool
有一个方法close()
,需要在工作完成后调用该方法。什么时候调用它?在close()
;阻塞直到所有连接返回,切勿松开连接。并在分区结束时调用它?就是这样,有了给定的信息,没错。但是我想跨多个批重用连接对象。为每个微批次打开一个新的连接是非常低效的。不,不,不。你可能已经仔细考虑过了,因为它太复杂了。但在批处理之间共享状态或资源(这也可能意味着在机器之间)听起来比低效更糟糕,与分布式计算形成对比。您可能过早地进行了优化。