Python 确保在apache beam中的多个工作进程上正确聚合用户会话数据

Python 确保在apache beam中的多个工作进程上正确聚合用户会话数据,python,google-cloud-dataflow,apache-beam,Python,Google Cloud Dataflow,Apache Beam,假设我将以下会话数据拆分为两个工作进程: +---------+-----------+--------+ | user_id | timestamp | worker | +---------+-----------+--------+ | 1 | 2 | 1 | | 1 | 1 | 1 | | 1 | 21 | 1 | | 1 | 23 | 2

假设我将以下会话数据拆分为两个工作进程:

+---------+-----------+--------+
| 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 |
+---------+---------------+-------------+---------------+
而不是以下结果:

+---------+---------------+-------------+---------------+
| 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 |
+---------+---------------+-------------+---------------+
例如,在用例中,我必须按用户id对输入进行分区,以便在将其拆分为会话窗口之前获得用户的所有会话数据

我的问题是:

  • ApacheBeam是否自动确保每个工人都拥有所有数据
  • 例如,此代码段是否确保所有用户会话都是 即使数据被拆分为多个工作人员,是否正确地进行了agreggated
将apache_梁导入为梁
从apache_beam.transforms.window导入会话
(pcoll
|梁.窗(会话(间隙尺寸=10))
|beam.GroupByKey())
  • 如果是这样,它如何确切地保证这种行为
  • 如何在本地复制此特定情况,以便对其进行测试
  • 我是否可以在文档中阅读更多有关此行为的信息
ApacheBeam是否自动确保每个工人都拥有所有数据? 例如,此代码段是否确保所有用户会话都已正确聚合,即使数据已拆分到多个工作进程上

ApacheBeam语义不依赖于由哪个工作者处理的数据。由特定的Beam runner来确保正确执行管道。如果某个跑步者需要收集一个工人身上的所有数据,那么该跑步者应该这样做;如果跑步者不这样做就能保证正确性,那就更好了

如果是这样,它如何确切地保证这种行为

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

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


使用在内存中本地运行管道的direct runner,并提供梁模型的参考实现。

Hi,对我来说,还有一些事情没有解决。因此,如果我想合并运行程序在多个worker上拆分的用户会话数据,例如,dataflow runner是否自动保证每个会话的生成独立于在worker上拆分的会话,或者我是否必须对数据进行分区,因此,每个工作人员只获取特定用户的数据?我不确定您的确切意思-似乎您假设了一个特定的会话实现,其中分区非常重要,但Beam以一种不重要的方式实现了它。您将得到正确的结果,控制分区不仅是不必要的,而且是不可能的(“Spark意义上的分区”不是Beam编程模型的一部分)