一、在线特征系统
主流互联网产品中,不论是经典的计算广告、搜索、推荐,还是垂直领域的路径规划、司机派单、物料智能设计,建立在人工智能技术之上的策略系统已经深入到了产品功能的方方面面。相应的,每一个策略系统都离不开大量的在线特征,来支撑模型算法或人工规则对请求的精准响应,因此特征系统成为了支持线上策略系统的重要支柱。美团点评技术博客之前推出了多篇关于特征系统的文章,如《机器学习中的数据清洗与特征处理综述》侧重于介绍特征生产过程中的离线数据清洗、挖掘方法,《业务赋能利器之外卖特征档案》侧重于用不同的存储引擎解决不同的特征数据查询需求。而《外卖排序系统特征生产框架》侧重介绍了特征计算、数据同步和线上查询的特征生产Pipeline。
本文以美团酒旅在线特征系统为原型,重点从线上数据存取角度介绍一些实践中的通用技术点,以解决在线特征系统在高并发情形下面临的问题。
1.1 在线特征系统框架——生产、调度、服务一体化
在线特征系统就是通过系统上下文,获得相关特征数据的在线服务。其功能可以是一个简单的Key-Value(KV)型存储,对线上提供特征查询服务,也可以辐射到通用特征生产、统一特征调度、实时特征监控等全套特征服务体系。可以说,几个人日就可以完成一个简单能用的特征系统,但在复杂的业务场景中,把这件事做得更方便、快速和稳定,却需要一个团队长期的积累。
以上结构图为一体化特征系统的概貌,自底向上为数据流动的方向,各部分的功能如下:
数据源:用于计算特征的原始数据。根据业务需求,数据来源可能是分布式文件系统(如Hive),关系型数据库(如MySQL),消息队列(如Kafka)等。
特征生产:该部分负责从各种数据源读取数据,提供计算框架用于生产特征。生产框架需要根据数据源的类型、不同的计算需求综合设计,因此会有多套生产框架。
特征导入:该部分负责将计算好的特征写入到线上存储供特征服务读取。该部分主要关注导入作业之间的依赖、并发写入的速度与一致性等问题。
特征服务:该部分为整个特征系统的核心功能部分,提供在线特征的存取服务,直接服务于上层策略系统。
特征的生命周期按照上述过程,可以抽象为五个步骤:读、算、写、存、取。整个流程于特征系统框架内成为一个整体,作为特征工程的一体化解决方案。本文主要围绕特征服务的核心功能“存”、“取”,介绍一些通用的实践经验。特征系统的延伸部分,如特征生产、系统框架等主题会在后续文章中做详细介绍。
1.2 特征系统的核心——存与取
简单来说,可以认为特征系统的核心功能是一个大号的HashMap,用于存储和快速提取每次请求中相关维度的特征集合。然而实际情况并不像HashMap那样简单,以我们的通用在线特征系统(Datahub)的系统指标为例,它的核心功能主要需面对存储与读取方面的挑战:
高并发:策略系统面向用户端,服务端峰值QPS超过1万,数据库峰值QPS超过100万(批量请求造成)。
高吞吐:每次请求可能包含上千维特征,网络IO高。服务端网络出口流量均值500Mbps,峰值为1.5Gbps。
大数据:虽然线上需要使用的特征数据不会像离线Hive库那样庞大,但数据条数也会超过10亿,字节量会达到TB级。
低延迟:面对用户的请求,为保持用户体验,接口的延迟要尽可能低,服务端TP99指标需要在10ms以下。
以上指标数字仅是以我们系统作为参考,实际各个部门、公司的特征系统规模可能差别很大,但无论一个特征系统的规模怎样,其系统核心目标必定是考虑:高并发、高吞吐、大数据、低延迟,只不过各有不同的优先级罢了。当系统的优化方向是多目标时,我们不可能独立的用任何一种方式,在有限资源的情况下做到面面俱到。留给我们的是业务最重要的需求特性,以及对应这些特性的解决方案。