2016-11-15 42 views
0

我的团队为我们用于监视和分析目的的许多数据流管道使用了很多聚合器(自定义计数器)。在合并步骤中使用“聚合器”(自定义计数器)的方法?

我们主要写DoFn类的话,但我们有时使用Combine.perKey(),通过编写实现SerializableFunction<Iterable<T>, S>自己的组合类(通常在我们的例子中,TS是相同的)。我们运行的一些工作只有一小部分非常热键,我们希望利用Combine(如热键扇出)提供的一些功能,但这种方法存在一个问题。

看起来,聚合器只在DoFn内可用,我想知道是否有解决方法,或者这是将来可能添加的功能。大多数情况下,我们使用一堆自定义计数器来计算不同类型的特定事件/对象的数量,以便进行分析和监控。在某些情况下,我们可以在Combine步骤之后应用另一个DoFn来完成此操作,但在其他情况下,我们确实需要在组合过程中对事物进行计数 - 例如,我们想知道对象在键上的分布情况,以了解如何例如,我们有很多热键,以及热键和热键之间的界限。还有一些其他情况对我们来说似乎很棘手。

我周围搜索,但我找不到在Combine步骤中如何使用聚合器的资源,所以任何帮助将非常感激!

如果需要,我或许可以描述我们使用什么样的Combine步骤以及我们要计数的内容,但是这需要一些时间,我希望能有一个通用的解决方案。

回答

1

这目前不可能。将来(作为Apache Beam的一部分),可能需要在CombineFn内定义度量标准(类似于聚合器),这应该解决这个问题。

与此同时,对于您的用例,您可以按照您的描述进行操作。您可以有一个Combine.perKey(),然后有多个步骤消耗结果 - 一个用于实际处理,另一个用于报告各种指标。

您也可以查看CombineFns中的方法,该方法允许创建合成的CombineFn。例如,您可以使用您的CombineFn和一个简单的Count,以便报告DoFn可以报告每个密钥中的元素数量(消耗Count),而实际处理DoFn会消耗您的CombineFn的结果。

+0

感谢您的快速响应和建议。我真的很希望指标功能即将添加! –