Я развернул искру на Java-приложении драйвера пряжи, оно будет отправлять задания на спарк (главным образом, делая некоторую автономную статистику по hive ,asticsearch и 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 показывает, что ему требуется все больше и больше резидентного размера.
Я выгрузил его файл кучи и увидел много связанных с Spark экземпляров, оставшихся в threadLocal после закрытия sparksession, таких как Hive metastore,SparkSession. После многих исследований я обнаружил, что Spark использует много локальных потоков иЯ не удаляю их (или я просто не использовал правильный способ закрыть спарк-сессию). Я добавляю эти коды, чтобы очистить локальные потоки, которые оставляют искру позади:
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 может сделать всю уборку? Я просто не могу найти подсказку из документа искры.