Pyspark作业无法正常关闭

时间:2018-09-12 20:57:52

标签: pyspark

我在python(v3.6.4)和Yarn(v2.7.3)中创建了一个spark(v2.2)流作业,该作业需要运行1天,然后正常关闭,运行一个单独的进程,然后恢复运行另外24小时等

我的数据在Kafka主题中,我的胶印管理工作正常,但是,我只能使用Yarn管理器终止该作业,并且某些数据不会得到处理。

经过大量研究,我被迫在数据库或HDFS中的信号文件中创建关闭密钥。然后,我创建了一个Thread.timer类来轮询数据库,并等待关闭键,值出现,然后向Spark Streaming上下文发出shutdown shutdown命令: ssc.stop(True, True)

计时器类在火花作业运行时在其自己的进程中运行;我在日志中看到关闭消息,但是不幸的是,火花作业从未停止过。

我的代码太大,无法发送,但这是要点

class FuncTimer(threading.Thread):
def __init__(self, interval, func, *args, **kwargs):
    threading.Thread.__init__(self)
    self.interval = interval
    self.func = func
    self.args = args
    self.kwargs = kwargs
    self.runnable = True

def run(self):
    while self.runnable:
        self.func(*self.args)
        time.sleep(self.interval)

def stop(self):
    self.runnable = False

   def shutdown_gracefully(*args):
       ssc, ops = args

conn = redis.StrictRedis(host=ops.value['redis_host'], port=ops.value['redis_port'], db=ops.value['redis_db'])

check_shutdown_status = conn.sismember(ops.value['shutdown_key'], ops.value['shutdown_value'])

if check_shutdown_status:
    print("Shutdown value found in Redis! Shutting down gracefully!")
    ssc.stop(True, True)


def main():

# start shutdown timer thread!
thread = FuncTimer(ops.value['shutdown_interval'], shutdown_gracefully, ssc, ops)
thread.start()
# start streaming from the current offset
kvs = KafkaUtils.createDirectStream(ssc, [ops.value['topic_name']], kafka_params, from_offsets)

ssc.start()
ssc.AwaitTermination()

有谁知道如何正常启动此版本的Spark?

我知道您不应该在同一驱动程序线程中调用ssc.start和ssc.stop;但是我从另一个线程在ssc上调用stop。我是否需要工作线程的某种返回值?

0 个答案:

没有答案