Я использую pyspark для некоторой обработки данных и использую HiveContext для оконной функции.
Чтобы протестировать код, я использую TestHiveContext, в основном копируя реализацию из исходного кода pyspark:
https://spark.apache.org/docs/preview/api/python/_modules/pyspark/sql/context.html
@classmethod
def _createForTesting(cls, sparkContext):
"""(Internal use only) Create a new HiveContext for testing.
All test code that touches HiveContext *must* go through this method. Otherwise,
you may end up launching multiple derby instances and encounter with incredibly
confusing error messages.
"""
jsc = sparkContext._jsc.sc()
jtestHive = sparkContext._jvm.org.apache.spark.sql.hive.test.TestHiveContext(jsc)
return cls(sparkContext, jtestHive)
Затем мои тесты наследуют базовый класс, который может получить доступ к контексту.
Какое-то время это работало нормально. Тем не менее, я начал замечать некоторые прерывистые проблемы с нехваткой памяти, когда добавлял больше тестов. Теперь я не могу запустить набор тестов без сбоя.
"java.lang.OutOfMemoryError: Java heap space"
Я явно останавливаю искровой контекст после запуска каждого теста, но это, похоже, не убивает HiveContext. Таким образом, я считаю, что он продолжает создавать новые HiveContexts каждый раз, когда запускается новый тест, и не удаляет старый, что приводит к утечке памяти.
Любые предложения о том, как разорвать базовый класс, чтобы он убил HiveContext?