簡體   English   中英

如何使用Apache Beam在Python中將有界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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM