基本上,我正在使用apache beam python SDK在Google Cloud Dataflow上运行管道。 首先,我从云pubsub中读取一个JSON字符串,并对照全局词典变量检查是否已使用ID接收到数据。如果这是带有ID的第一条消息,那么我将ID作为密钥添加到字典中,并将消息作为值添加,否则,我不会更改字典。基本上,每次收到新字典时,我都会向字典添加一个密钥。 接下来,我通过将新接收到的数据与上次读取的数据进行比较来监视数据的变化。
一旦处理数据流作业的工人人数超过1,使用公共变量是否会引起任何问题?
我目前编写管道的方式有效,但是现在只有一名工作人员正在处理gcp数据流作业。我不确定如果分配其他工人是否会出现任何问题。
在这里,我添加了代码的简化版本,但是实际的代码具有多个分支,用于检查不同类型的事件。
dictionary={}
class AddId2Dict(beam.DoFn):
def process(self,e):
if(e[0] not in dictionary.keys()):
dictionary[e[0]]=e[1]
return((e,))
class ChangeChecker(beam.DoFn):
def process(self,e):
if(e[0] in dictionary.keys()):
if dictionary[e[0]]<e[1]:
print 'Increase occurred for id:'+str(e[0])|
dictionary[e[0]]=e[1]
elif dictionary[e[0]]>e[1]:
print 'Decrease occurred for id:'+str(e[0])
else:
print 'Stayed constant for id:'+str(e[0])
def run():
p = beam.Pipeline(options=options)
(
p
| 'read from pubsub'<<beam.io.ReadFromPubSub(topic=topic_name).with_output_type(bytes)
| 'parse json & create tuple' >> beam.Map(lambda e: ((json.loads(x)['id'],int(json.loads(x)['data'])))
| 'add key to dict if it does not exist' >> beam.ParDo(AddId2Dict())
| 'check for event' >> beam.ParDo(ChangeChecker())
)
result = p.run()
result.wait_until_finish()
if __name__ == '__main__':
logging.getLogger().setLevel(logging.INFO)
run()
答案 0 :(得分:0)
不。每个工作人员将创建自己的dictionary
变量副本。
如果您希望工作人员共享全局状态,则可以使用Beam State API。在python中,它是userstate
模块(https://beam.apache.org/releases/pydoc/2.13.0/apache_beam.transforms.userstate.html)。