Как остановить или удалить HiveContext в Pyspark?

Я сталкиваюсь со следующей проблемой:

def my_func(table, usr, psswrd):
    from pyspark import SparkContext, SQLContext, HiveContext, SparkConf

    sconf = SparkConf()
    sconf.setAppName('TEST')
    sconf.set("spark.master", "local[2]")

    sc = SparkContext(conf=sconf)
    hctx = HiveContext(sc)

    ## Initialize variables

    df = hctx.read.format("jdbc").options(url=url,
                                          user=usr,
                                          password=psswd,
                                          driver=driver,
                                          dbtable=table).load()
    pd_df = df.toPandas()

    sc.stop()
    return pd_df

Проблема здесь заключается в сохранении HiveContext (т. Е. Если я выполняю hctx._get_hive_ctx(), он возвращает JavaObject id=Id). Поэтому, если я использую my_func несколько раз в одном и том же сценарии, он завершится неудачно во второй раз. Я бы попытался удалить HiveContext, который, очевидно, не удаляется, когда я останавливаю SparkContext.

Спасибо

1 ответ

Решение

Удаление HiveContext невозможно, так как некоторое состояние сохраняется после sc.stop(), что делает его неработоспособным в некоторых случаях.

Но вы могли бы обойти это (осторожно! Это опасно), если это возможно для вас. Вы должны удалять metastore_db каждый раз, когда запускаете / останавливаете свой sparkContext. Опять же, посмотрите, возможно ли это для вас. Код Java ниже (в вашем случае вы должны изменить его в Python).

File hiveLocalMetaStorePath = new File("metastore_db");
FileUtils.deleteDirectory(hiveLocalMetaStorePath);

Вы можете лучше понять это из следующих ссылок.

https://issues.apache.org/jira/browse/SPARK-10872

https://issues.apache.org/jira/browse/SPARK-11924

Другие вопросы по тегам