一点资讯采用的是Lambda architecture,对于核心计算逻辑有一套统一的数据结构抽象和计算算子抽象。我们本质上处理的是事件流在不同矩阵上以不同粒度聚合的问题,这里尤其是对于矩阵的Delta和Base之间的计算,我们给出了一套比较完整的抽象。这一套核心代码可以同时跑在Storm/JStorm, Spark、Mapeduce这样的平台上,使离线和在线计算相结合。 问题3:数据变化如何追踪与Debug 我们的平台除了思考上面所述的数据结构和计算模型进行统一之外,还考虑到了时间的因素。时间是一个非常重要的维度,对于我们的计算引擎也是一个挑战。总结来说,包括这几个问题:不同类型的Feature需要不同的淘汰策略,需要能够计算各种时间周期上的feature、需要能够知道数据历史变化的状态、数据分析需要追踪指标变化曲线。 对于这些问题,我们构建了比较完整的windowingmodel(窗口模型)的实时计算模型:在hbase上存储细粒度的delta数据,这一部分的数据是实时更新的,每次更新时计算pipeline(管道)会通过kafka写入一个WAL,有一个Pusher组件会监听这个WAL,开奖,并可以根据自定义的策略对不同的数据表采用不同的window计算模型;在pusher层面,支持各种时间窗口淘汰策略,包括Fixedwindow,session window,slidingwindow,decay,last value win等。 问题4:线上高性能存储引擎 一点资讯在高峰期产生的2M+QPS的读请求,和200K+的更新量,因此对我们线上的分布式存储系统会有比较高的性能要求,市面上线程的分布式存储方案都不能解决我们面临的问题。 因此我们开发了自己的分布式存储系统NeoDB,底层基于Rocksdb,上层使用定制的ThriftRPC接口,我们对系统层次做了很多的优化,包括把一些部分计算可以推到最底下节点上、减少Compaction的层次,控制Compaction对于读请求的影响、控制写放大,优化缓存命中率等。 问题5:如何监控和维护整个系统 最后一个问题怎么样做监控和维护整个系统。这里面涉及到一些问题,主要包括怎么对数据流lag做监控报警。对流式计算如何做profiling(分析),线上如何做负载均衡等。我们针对这些问题开发了两个系统,一个是我们开发了YMetric的监控系统。客户端兼容codahale metrics库,会将metric汇总发送到Kafka中,并由我们统一的Storm Pipeline进行聚合计算,结果存储在openTSDB之中。我们的这套系统支持多Metric的自定义计算、报警、Trending预测等。 另外一个系统是ycluster的线上服务,atv直播,她有点像Apache Helix,但是我们做的更为简单易用,YCluster是一套基于Zookeeper的分布式负载均衡和机群管理系统,支持Multiple Service Namespace、Hash Sharding、Multiple Replica。同时我们基于YCluster做了Neo系统的Smart Client,通过这套Smart Client完成路由和负载均衡的工作,我们支持多种不同负载均衡的算法,包括简单的Random和Round-Robin、,同时我们做了一个叫做link Scheduler的负载均衡的算法,可以支持多数据中心中的本地优先调度,并支持相同副本的优先调度,从而大幅度提升了缓存命中率。 (责任编辑:本港台直播) |