我有一个长期运行的Python 3.6应用程序,该应用程序在YARN上托管了PySpark 2.4.6 Session。我希望能够在Spark Session崩溃/死亡的情况下得到通知/拥有一个称为的方法,以便我可以自动重新启动它。
我想主动执行此操作,而不是包装对会话的每个调用并捕获会话关闭的错误,然后让用户等待会话重新启动。
答案 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)