确保用户会话数据在apache beam中的多个worker上正确聚合

时间:2018-02-23 09:25:59

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

假设我将以下会话数据分为两个工作人员:

+---------+-----------+--------+
| user_id | timestamp | worker |
+---------+-----------+--------+
|       1 |         2 |      1 |
|       1 |         1 |      1 |
|       1 |        21 |      1 |
|       1 |        23 |      2 |
|       1 |        24 |      2 |
+---------+-----------+--------+

我想确保如果我收集数据,我将得到以下结果:

+---------+---------------+-------------+---------------+
| user_id | session_start | session_end | element_count |
+---------+---------------+-------------+---------------+
|       1 |             1 |           2 |             2 |
|       1 |            21 |          24 |             3 |
+---------+---------------+-------------+---------------+

而不是以下结果:

+---------+---------------+-------------+---------------+
| user_id | session_start | session_end | element_count |
+---------+---------------+-------------+---------------+
|       1 |             1 |           2 |             2 |
|       1 |            21 |          21 |             1 |
|       1 |            23 |          24 |             2 |
+---------+---------------+-------------+---------------+

例如在this用例中,我必须按用户ID对输入进行分区,以便在将用户分成会话窗口之前获取用户的所有会话数据。

我的问题是:

  • Apache Beam是否会自动确保每个工作人员都拥有所有数据?
  • 例如,此代码段是否确保所有用户会话都是 如果数据被多个工人分开,那么这些数据是否正确分配?
import apache_beam as beam
from apache_beam.transforms.window import Session

(pcoll 
 | beam.WindowInto(Session(gap_size=10))
 | beam.GroupByKey())
  • 如果是这样,它究竟是如何保证这种行为的呢?
  • 我如何在本地复制这种特定情况,以便对其进行测试?
  • 我可以在文档中阅读有关此行为的更多信息吗?

1 个答案:

答案 0 :(得分:0)

  

Apache Beam是否会自动确保每个工作人员都拥有所有数据?   例如,此代码段是否确保所有用户会话都正确收集,即使数据是分散在多个工作人员上的?

Apache Beam语义不依赖于哪个工作者处理哪些数据。由特定的Beam运行器来确保它正确执行管道。如果某个跑步者需要收集一名工人的所有数据来做 - 那么那个跑步者应该这样做;如果跑步者能够保证正确性而不做到这一点 - 甚至更好。

  

如果是这样,它究竟是如何保证这种行为的呢?

有效评估窗口和触发器的确切实现细节非常复杂。您可以在ReduceFnRunner中查看java实现。但是在高层次上,你可以这样想(这只是一个心理模型,而不是一个确切的实现):

  • Window变换根据时间戳将每个元素分配到一个或多个窗口中。
  • GroupByKey转换隐式按键和窗口进行分组,即对于每个键/窗口对,它使用此键和窗口维护元素缓冲区。
  • 如果windowfn是“合并”(即如果具有相同键的不同元素的窗口不是独立的 - 就像会话窗口的情况一样),它会使用此键重新计算所有元素的正确窗口集,并且将每个元素重新映射到相应的新窗口中。 (mergeWindows
  

如何在本地复制这种特定情况,以便对其进行测试?

使用在本地内存管道的直接运行器,并提供Beam模型的参考实现。