![](/img/trans.png)
[英]Apache Beam in python: How to reuse exactly the same transform on another PCollection
[英]How to transform bounded pcollection to unbounded in Python with Apache Beam?
我正在嘗試轉換GTB中存儲的數TB的郵件日志,而不使用太多內存。
按照指南中的建議,我將時間戳記添加到每個元素,將其拆分到一個滑動窗口中,並且在將其發送到GroupByKey
和之后將其發送到ParDo
解析器之前,我已經指定了(聚合)觸發器。 應該可以,但是GroupByKey
仍然等待所有數據到達。 為什么?
我也嘗試過Direct和Google Dataflow運行程序。
我想念什么?
這是代碼的要點:
known_args, pipeline_options = parse_args(sys.argv)
pipeline = beam.Pipeline(options=pipeline_options)
lines = pipeline | 'read' >> beam.io.ReadFromText(known_args.input)
parsed_json = lines \
| 'cut' >> beam.Map(lambda x: x[39:])\
| 'jsonify' >> beam.Map(json_loads).with_outputs('invalid_input', main='main')
keyed_lines = parsed_json['main']\
| 'key_filter' >> beam.Filter(lambda x: u'key' in x)\
| 'keyer' >> beam.Map(lambda x: (x['key'], x))\
| 'log_processed_rows' >> beam.Map(log_processed_rows)
window_trigger = trigger.DefaultTrigger()
windowed_lines = keyed_lines\
| 'timestamp' >> beam.ParDo(AddTimestampDoFn())\
| 'window' >> beam.WindowInto(beam.window.SlidingWindows(size=3600+600, period=3600), trigger=window_trigger,
accumulation_mode=trigger.AccumulationMode.DISCARDING) # 1 hour steps with 10 minutes of overlap
results = windowed_lines \
| 'groupbykey' >> beam.GroupByKey()\
| 'parse' >> beam.ParDo(ParseSendingsDoFn()).with_outputs('too_few_rows', 'invalid_rows', 'missing_recipients', main='main_valid')
output = results['main_valid'] \
| 'format' >> beam.Map(output_format)\
| 'write' >> beam.io.WriteToText(known_args.output, file_name_suffix=".gz")
默認觸發器要求在處理之前整個數據集都可用,這就是為什么它等待所有數據到達的原因。
此外, SlidingWindows通常用於運行平均值,並且由於僅添加時間戳,因此單個全局窗口可能是更好的選擇。
編輯
關於窗口化,您可以具有一個流作業,該作業可以從內存中的數據創建一個pcollection,並可以從GCS存儲中進行側面輸入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.