我正在使用Java中的newAPIHadoopRDD
來讀取MongoDB集合。 首先,我創建使用下面的類JavaSparkContext
對象:如何在使用Java中的newAPIHadoopRDD讀取MongoDB集合之後停止線程?
public class SparkLauncher {
public JavaSparkContext javaSparkContext ;
public SparkLauncher()
{
javaSparkContext = null;
}
public JavaSparkContext getSparkContext() {
if (javaSparkContext == null) {
System.out.println("SPARK INIT...");
try {
System.setProperty("spark.executor.memory", "2g");
Runtime runtime = Runtime.getRuntime();
runtime.gc();
int numOfCores = runtime.availableProcessors();
numOfCores=3;
SparkConf conf = new SparkConf();
conf.setMaster("local[" + numOfCores + "]");
conf.setAppName("WL");
conf.set("spark.serializer",
"org.apache.spark.serializer.KryoSerializer");
javaSparkContext = new JavaSparkContext(conf);
} catch (Exception ex) {
ex.printStackTrace();
}
}
return javaSparkContext;
}
public void closeSparkContext(){
javaSparkContext.stop();
javaSparkContext.close();
javaSparkContext= null;
}
}
然後,在其他類我讀了MongoDB的集合:
SparkLauncher sc = new SparkLauncher();
JavaSparkContext javaSparkContext = sc.getSparkContext();
try {
interactions = javaSparkContext.newAPIHadoopRDD(mongodbConfig,
MongoInputFormat.class, Object.class, BSONObject.class);
}
catch (Exception e) {
System.out.print(e.getMessage());
}
此代碼創建了很多線程讀取集合的分裂的。關閉JavaSparkContext對象後:
javaSparkContext.close();
sc.closeSparkContext();
System.gc();
所有線程仍處於活動狀態且內存未釋放。它會導致內存泄漏和線程泄漏。這是因爲newAPIHadoopRDD方法嗎?有沒有辦法擺脫這些線程?
你怎麼知道*「的所有線程都還活着,內存不會被釋放。」 *?你如何測量/追蹤它?幾個截圖可以幫助你看到你看到和參考。 –