我的团队为我们用于监控和分析目的的许多数据流管道使用了大量聚合器(自定义计数器)。
我们主要编写DoFn
类来执行此操作,但我们有时会使用Combine.perKey()
,编写我们自己的实现SerializableFunction<Iterable<T>, S>
的合并类(通常在我们的例子中,T
和S
是一样的)。我们运行的一些工作只有一小部分非常热门的密钥,我们希望利用Combine
提供的一些功能(例如热键扇出),但这种方法存在一个问题。 / p>
似乎聚合器仅在DoFn
内可用,我想知道是否有解决方法,或者这可能是将来添加的功能。大多数情况下,我们使用一堆自定义计数器来计算不同类型的某些事件/对象的数量,以便进行分析和监视。在某些情况下,我们可以在Combine步骤之后应用另一个DoFn来执行此操作,但在其他情况下,我们确实需要在组合过程中对事物进行计数 - 例如,我们想知道对象在键上的分布以了解如何例如,我们拥有许多热键以及热键和非常热键之间的界限。还有一些其他案例对我们来说似乎很棘手。
我四处寻找,但在Combine
步骤中我找不到有关如何使用聚合器的资源,所以任何帮助都会非常感激!
如果需要,我可以描述一下我们使用的Combine
步骤以及我们想要计算的内容,但这需要一些时间,我希望能有一个解决方案。< / p>
答案 0 :(得分:1)
目前无法实现。在未来(作为Apache Beam的一部分),很可能在CombineFn
内定义指标(类似于聚合器),这应该解决这个问题。
与此同时,对于您的用例,您可以按照您的描述进行操作。您可以拥有Combine.perKey()
,然后有多个步骤消耗结果 - 一个用于实际处理,另一个用于报告各种指标。
您还可以查看CombineFns中允许创建合成CombineFn
的方法。例如,您可以使用CombineFn
和简单Count
,以便报告DoFn
可以报告每个密钥中的元素数量(使用Count
)和实际处理DoFn
会占用您CombineFn
的结果。