如果托管的Spark Session死亡,则得到通知

时间:2020-06-16 15:30:49

标签: apache-spark pyspark

我有一个长期运行的Python 3.6应用程序,该应用程序在YARN上托管了PySpark 2.4.6 Session。我希望能够在Spark Session崩溃/死亡的情况下得到通知/拥有一个称为的方法,以便我可以自动重新启动它。

我想主动执行此操作,而不是包装对会话的每个调用并捕获会话关闭的错误,然后让用户等待会话重新启动。

2 个答案:

答案 0 :(得分:2)

有一个REST API可用于Yarn。您可以每隔一段时间查询一次所有正在运行的applications

http://rm-http-address:port/ws/v1/cluster/apps?states=RUNNING

,然后检查您的PySpark会话是否是结果的一部分。

答案 1 :(得分:2)

使用https://stackoverflow.com/a/44084038/328968作为起点,您可以创建一个侦听器并将其添加到会话中。应用程序结束时,您可以执行回调以重新启动应用程序。

SparkListener在上面的参考答案中定义。

class SparkApplicationEndListener(SparkListener):
    def __init__(self, applicationEndCallback):
        self.applicationEndCallback = applicationEndCallback

    def onApplicationEnd(self, applicationEnd):
        if self.applicationEndCallback != None:
            self.applicationEndCallback(applicationEnd)

########

def handleSparkApplicationEnd(app_end):
    print(app_end.toString())
    sparkSession = buildSparkSession()

def buildSparkSession():
    #......
    sparkSession.sparkContext._gateway.start_callback_server()
    listener = SparkApplicationEndListener(handleSparkApplicationEnd)
    sparkSession.sparkContext._jsc.sc().addSparkListener(listener)