[英]How to use impersonate_service_account for streaming beam pipeline
[英]FixedWindow apparently not firing in streaming python beam pipeline
我正在嘗試在 python 中構建數據流管道。主輸入 stream 來自 Pub/Sub,主處理 function 采用從 Pub/Sub stream 相當不規則地更新的副輸入。 我編寫了以下代碼來測試我的設計:
def print_and_return(x):
print('---DEBUG---: ' + str(x))
return x
def comb(x, y):
return f'Main input: {x}, side input: {y}'
def load_side_input(pubsub_message):
import json
message = pubsub_message.decode("utf8")
side_input = json.loads(message)
return ('side', side_input)
def run(input_subscription, side_input_sub, pipeline_args=None):
pipeline_options = PipelineOptions(
pipeline_args, streaming=True, save_main_session=True
)
with Pipeline(options=pipeline_options) as pipeline:
side_input = (
pipeline
| "Side impulse" >> io.ReadFromPubSub(subscription=side_input_sub)
| "Window side" >> WindowInto(window.GlobalWindows(), trigger=trigger.Repeatedly(trigger.AfterCount(1)),
accumulation_mode=trigger.AccumulationMode.DISCARDING)
| "Parse side input" >> Map(load_side_input)
)
(
pipeline
| "Read from Pub/Sub" >> io.ReadFromPubSub(subscription=input_subscription, with_attributes=True)
| "Window" >> WindowInto(window.FixedWindows(10))
| "Add sideinput" >> Map(comb, y=pvalue.AsDict(side_input))
| "Print" >> Map(print_and_return)
)
我在本地運行它以在調試模式下進行測試, load_side_input
function 觸發器(我知道,因為如果我在其中放置一個斷點,它就會被擊中)但是 rest( comb
和print_and_return
)不會。 我的理解是 FixedWindow 應該在主輸入上每 10 秒觸發一次,並且光束將匹配 window 與側輸入上觸發器的最后一次觸發,因為它在全局 window 中,但實際上沒有任何反應。
我錯過了什么,為什么沒有output?
編輯:
經過幾天的嘗試,甚至詢問 beam 用戶郵件組后,我認為這可能只是本地運行器在起作用,而且可以肯定的是,在部署到 Dataflow 之后,管道按預期工作。 雖然以這種方式進行測試很煩人,但知道問題是什么以及如何解決仍然是件好事。
它不會觸發,因為主輸入和側輸入的 window 不匹配(固定與全局),因此它無法獲取側輸入數據。
由於您沒有使用任何聚合,因此您可以將主要的 window 取出。 如果您計划聚合,請在加入側輸入后重新窗口。
你在這里有一個例子:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.