flink计算流量中位数

时间:2017-09-27 15:20:00

标签: apache-flink

我需要计算从kafka流中收到的许多参数的中位数,持续15分钟的时间窗口。

我找不到任何内置函数,但我找到了一种使用自定义WindowFunction的方法。

我的问题是:

  1. 对于flink来说这是一项艰巨的任务吗?数据可能非常大。
  2. 如果数据达到千兆字节,flink会将所有内容存储在内存中,直到时间窗结束? (应用WindowFunction实现的一个参数是Iterable - 在时间窗口期间出现的所有数据的集合)
  3. 感谢

1 个答案:

答案 0 :(得分:0)

您的问题包含多个方面,但让我回答最基本的一个方面:

这对Flink来说是一项艰巨的任务,为什么这不是标准示例?

是的,中位数是一个很难的概念,因为确定中位数的唯一方法是保留完整数据。

许多统计信息都不需要计算完整的数据。例如:

  • 如果有总计,则可以取之前的总计并添加最新的观测值。
  • 如果您有总数,则加1并得到新的总数
  • 如果有平均值,则可以在后台进行总和和计数的跟踪,并随时根据观察结果计算新的平均值。

这甚至可以使用更复杂的指标(例如标准差)来完成。

但是,没有确定中位数的捷径,添加新观测值后才知道中位数是什么的唯一方法是查看所有观测值,然后找出中间值是什么。

因此,这是一个具有挑战性的指标,需要处理传入的数据大小。如前所述,可能会有如下估算:https://issues.apache.org/jira/browse/FLINK-2147

或者,您可以查看数据的分布方式,并可以使用均值,偏度和峰度等指标估算中位数。

我可以想出的最后一个解决方案是,如果您需要大概知道该值是多少,请选择一些“候选对象”并计算其下​​的观测值的分数。那么最接近50%的那个就是合理的估算值。