写入Redis时,Google Dataflow作业会无限期挂起

时间:2018-06-25 07:46:51

标签: redis google-cloud-datastore google-cloud-dataflow apache-beam google-cloud-memorystore

我正在通过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

2 个答案:

答案 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