【问题标题】:flink calculate median on streamflink计算流中的中位数
【发布时间】:2018-03-09 03:53:08
【问题描述】:

我需要计算从 15 分钟时间窗口内从 kafka 流接收到的许多参数的中值。

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

我的问题是:

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

谢谢

【问题讨论】:

  • 你能告诉我们一些关于传入数据的事情吗?我们在谈论整数还是浮点数?如果它是整数,您是否有已知的数据范围?归根结底,问题在于对大量数字进行排序。如果我们只是在谈论千兆字节,那听起来您可以在内存中处理它。如果没有,您可以考虑外部合并排序(使用 flink 很容易)。
  • 如果您对确切结果不感兴趣,您也可以进行估算:CountMinSketch 可能是您的朋友。
  • 数据是来自kafka的日志事件。基本上,这些是大约 20 个加载时间指标,范围为 0 到 30000 (int)。通常小于 10000.. 我需要按数千个维度组合进行聚合,例如网站、页面、浏览器等 - 计算平均值、中位数、百分位数。我找不到 count-min-sketch 的文档。表 api 看起来也很有趣,但我也没有找到中位数谢谢!
  • 这里有一些关于实现 count min 草图的讨论:issues.apache.org/jira/browse/FLINK-2147
  • 我希望 Flink 的文档有更多的例子

标签: apache-flink


【解决方案1】:

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

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

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

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

  • 如果你有总和,你可以把之前的总和加上最近的观察。
  • 如果有总计数,则加 1 并获得新的总计数
  • 如果您有平均值,您可以在后台跟踪总和和计数,并随时根据观察结果计算新的平均值。

这甚至可以用更复杂的指标来完成,比如标准差。

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

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

或者,您可以查看数据的分布情况,并可能使用均值、偏斜和峰度等指标估计中值。

我可以提出的最终解决方案是,如果您需要大致了解该值应该是多少,请选择一些“候选者”并计算其下​​方观察值的分数。最接近 50% 的那个将是一个合理的估计。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 2018-05-16
    相关资源
    最近更新 更多