关于 MES 实时计算的引擎,我们主要经历了两次演进。
在设计第一代 MES 时,我们希望可以支持秒级的计算,并且精确计算每一个用户。所以在当时的现状下,我们综合考虑选择了 Spark Streaming。
这个方案计算出来的 UV 是比较精确的。但它有自己的局限性:
首先,这一套架构用到的几个组件其实对资源都比较依赖, 而且 SparkStreaming 对那种时不时的流量高峰的数据处理不是非常友好。数据先在 Spark Streaming 算好然后再入 Redis,最后再入库到 Hbase,数据链路比较长,不好维护。
另外,第一代 MES 只支持自助配置规则,有了规则才会实时计算。所以对于比较自由的 OLAP 交叉分析不友好。而且如果由于集群不稳定等原因导致的任务失败数据少算, 那么不管是用户自助提交 Presto 还是利用 Spark 批处理全量重算,都是一个消耗集群资源的过程。由于批处理重算需要一定的时间来完成对历史数据的修复,这对一些需要数据准确并及时提供的用户不是非常友好。
我们考虑,在数据量大的情况下,我们是不是可以适当牺牲 UV 精准度的计算,来保障整个系统的性能和稳定性。所以就引入了 Flink + Druid。
刚才我们已经简单了解过 Flink,再来说下 Druid。
Druid 是一个大数据实时查询和分析的高容错、高性能的开源分布式系统,用来快速处理大规模的数据,它能够实现对大量数据的快速查询和分析,不足是存在一个 2% 的误差。但事实上,在数据量非常大的情况下,2% 的误差是可以接受的。后面我们又通过 Yahoo 提供的 Data Sketch,实现 UV 计算的精确调控,可以实现在 800w 之下的数据量,UV 都是准确的。最终的计算结果通过 restful 接口提供给 MES 获取数据并展现。