使用顺序GroupByKey时如何控制累积模式?还是其他惯用的方法?

时间:2018-06-20 03:37:27

标签: python google-cloud-dataflow apache-beam

我的任务等同于:

  • 给出了一系列字母(每个字母都与作者相关联)
  • 在固定窗口内建立ngram的低延迟直方图,
  • 假设正确的ngram由来自相同作者的一系列字母组成。

我的管道如下:

| 'Extract and assign timestamps' >> Map(..)
| 'Extract author from message'   >> Map(..)
| 'Assign author as key'          >> Map(lambda x: (x.author, x))     # :(author,chr)
| 'Assign windows'                >> WindowInto(window.FixedWindows(5*60),
                                     trigger=Repeatedly(AfterAny(
                                         AfterCount(2),
                                         AfterWatermark())),
                                     accumulation_mode=ACCUMULATING)
| 'Group letters by author'       >> GroupByKey()                     # :(author,[chr])
| 'Extract many ngrams from every substring' >> ParDo(..)             # :[(author, ngram)]
| 'Re-key by ngrams'              >> Map(lambda x: (x.ngram, 1))      # :(ngram,1)
| 'Group again, now by ngrams'    >> GroupByKey()                     # :(ngram,[1])
| 'Sum ngrams counts'             >> Map(lambda x: (x[0], sum(x[1]))) # :(ngram,count)
| 'Re-key by window'              >> ParDo(..)                        # :(window, (ngram,count))
| 'Group within window'           >> GroupByKey                       # :(window, [(ngram,count)])

我的目标是每两个输入消息接收一条输出消息,以便输出消息总结介于以下两个事件之间的ngram统计:事件时间当前5分钟间隔的开始,以及处理时间当前时刻。 / p>

没有AfterCount触发器,一切运行良好:每个窗口只有一个窗格。在事件发生的每5分钟我收到一条直方图消息。

此管道实际上并没有按预期的方式在每个窗口中包含多个窗格,因为我在这里有3个GBK,每个GBK由窗格触发,并且通过累积进行。例如:

  • 输入前两个字符(假设('a','author1')('b','author1')之后,窗格会在所有 GBK s中触发;
  • 我得到一条输出消息,该消息正确总结了到目前为止看到的所有ngram,看起来像('[0,300)', [('ab', 1)]);
  • 现在我有:
    • 第一个“按单词分组的字母” -GBK前面的缓冲字符:('author1','a')('author1','b'));
    • 第二个“组”前面的缓冲ngram,现在为ngrams-GBK:('ab',1);和
    • 第三个“窗口内的组” -GBK前面的缓冲ngram-sum:('[0,300)',('ab',1))
  • 当再输入两个字符:('c','author1')('d','author2')时,所有GBK都会使用缓冲的东西重新触发:
    • 第一个GBK到目前为止可以正确处理完整数据:('a','author1')('b','author1')('c','author1')('d','author2'),并正确发出:('author1',['a','b','c'])('author2',['d'])
    • 第二GBK进程缓冲('ab',1,)以及新发出的('bc',1)并重新发出('ab',1)-并开始复制(并在同一窗口的每个窗格上级联)。
    • li>
  • 在四个字符之后,我到目前为止的摘要统计信息是('[0,300)',[('ab',2),('bc',1)]),而应该是('[0,300)',[('ab',1),('bc',1)])

这是我的想法:

  • 直觉上,我想在第一次GBK之后从“累积”更改为“取消”。我看不到Apache Beam是否支持。
  • 我可以使用单个GBK-by-window,并在自定义转换中进行所有中间分组和缩小地图,但是感觉就像放弃了Apache Beam模型;
  • 我可以先打开GBK后重新显示窗口,然后切换到DISCARDING,但是随后我开始得到很多空白或不完整的输出窗口-换句话说,这不能满足我的要求。

这种管道的合适解决方案是什么?我该如何在第一个GBK之前进行累积,而在其他两个GBK之前进行丢弃-但是要确保所有三个GBK的窗格都围绕同一数据(或其派生数据)关闭?

0 个答案:

没有答案