我在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。我是否需要工作线程的某种返回值?