我正在通过Python API使用Apache Beam on Dataflow从Bigquery读取数据,进行处理并将其转储到Datastore接收器中。
就在写入数据存储区之前,我已经创建了一个ParDo函数,该函数将数据写入Memorystore-Google的托管Redis服务。由于Python中没有Redis Sink API,因此我只需在ParDo中调用Redis API。
不幸的是,工作经常无限期地挂起,我不得不手动停止它。在将数据写入Datastore和Redis的过程中,从Dataflow图中,我注意到只有少数几个条目被卡住而使工作挂起。
结果,当一台拥有15台16核机器的作业运行9个小时(正常情况下,该作业运行30分钟)时,将导致巨额成本。
也许有一种方法可以设置一个计时器,如果它超过时间限制,该计时器将停止数据流作业?
JobID:2018-06-23_17_45_06-10997437951845491641
答案 0 :(得分:1)
我们查看了2018-06-23_17_45_06-10997437951845491641作业,看起来有些元素在处理中卡住了,但是我们无法确定它为什么发生。 您可以尝试删除Redis或数据存储写入,然后重试吗? 如果您可以创建一个customer support ticket,以便我们尝试与您进行调试,那就太好了。
也许有一种方法可以设置一个计时器,该计时器将在以下情况下停止数据流作业 超过时间限制了吗?
不幸的是,答案是否定的,Dataflow在一定时间后没有自动取消作业的方法。但是,可以使用API进行此操作。可以wait_until_finish()超时,然后取消()管道。
答案 1 :(得分:0)
总结起来,借助@ankitk答案,这对我有用(python 2.7,sdk 2.14):
pipe = beam.Pipeline(options=pipeline_options)
... # main pipeline code
run = pipe.run() # doesn't do anything
run.wait_until_finish(duration=3600000) # (ms) actually starts a job
run.cancel() # cancels if can be cancelled
因此,如果作业在wait_until_finished()
的持续时间内成功完成,那么cancel()
只会打印警告“已关闭”,否则将关闭正在运行的作业。
P.S。如果您尝试打印作业的状态
state = run.wait_until_finish(duration=3600000)
logging.info(state)
对于RUNNING
内尚未完成的工作,它将为wait_until_finished()
,对于已完成的工作将为DONE
。