无法找到关闭Java Spark会话的正确方法(使用spark版本2.2.1)

时间:2018-06-07 12:49:15

标签: apache-spark

我在纱线驱动程序java应用程序上部署了一个spark,当任务调度系统给它一个任务调用时,它会将spark作业(主要是通过hive,elasticsearch和hbase做一些离线统计)提交到集群。所以我做了这个驱动程序应用程序继续运行,总是等待请求。

我使用线程池来处理任务调用,每个任务都会打开一个新的 SparkSession并在作业完成时关闭它(我们跳过多个任务 同时调用方案来简化这个问题。).Java代码应该是这样的:

SparkSession sparkSession=SparkSession.builder().config(new SparkConf().setAppName(appName)).enableHiveSupport().getOrCreate();
......doing statistics......
sparkSession.close();

此应用程序在jdk8下编译并运行,内存相关配置为同伴:

spark.ui.enabled=false
spark.serializer=org.apache.spark.serializer.KryoSerializer
spark.driver.memory=2G  
--driver-java-options "-XX:MaxDirectMemorySize=2048M -XX:+UseG1GC"

乍一看,我认为这个驱动程序应用程序将消耗最多的4G内存,但随着它继续运行,TOP显示它需要越来越多的常驻尺寸。
我抛弃了它的堆文件,并在sparksession关闭后看到了很多与Spark相关的实例,例如Hive Metastore,SparkSession本身。经过多次研究,我发现Spark使用了很多threadlocals并且没有删除它们(或者我只是使用正确的方法来关闭sparksession)我添加这些代码来清除留下火花的帖子:

import org.apache.hadoop.hive.ql.metadata.Hive;
import org.apache.hadoop.hive.ql.session.SessionState;
......
SparkSession.clearDefaultSession();
sparkSession.close();
Hive.closeCurrent();
SessionState.detachSession();
SparkSession.clearActiveSession();

这似乎现在很有用,但我认为它不够体面,我想知道是否有更好的方法可以做到这一点,就像另一个单一的火花java api可以做所有的清洁工作?我只是无法从火花文件中找到线索。

0 个答案:

没有答案