赞
踩
本文会重点介绍一下阿里系的搜索引擎中间件 Havenask(内部代号Ha3),在阿里内部支持了淘宝、天猫、菜鸟、优酷、高德、饿了么等在内的阿里搜索业务。
Ha3 支持千亿级别数据实时检索、百万qps查询,百万TPS高时效性写入保障,毫秒级查询延迟和数据更新。
开源地址:http://github.com/alibaba/havenask
关键节点
一个较为完整的搜索服务由:在线系统、索引系统、管控系统、扩展插件等部分构成,其中包括了查询流、数据流、控制流。
1)在线系统,包含了 QRS 和 Searcher。Qrs 负责接收用户查询、查询分发、收集整合结果。Searcher 是搜索查询的执行者,负责倒排索引召回、统计、条件过滤、文档打分、排序、摘要生成等。
2)索引系统,负责索引数据生成的过程,还包含有文档处理与索引构建服务 Build Service。索引构建分为三个步骤,对数据进行前置处理(例如分词、向量计算等)、产出索引、合并索引文件的处理。
3)管控系统,负责提供强大的运维能力。
4)扩展插件,提供插件机制,索引和在线流程各环节中,均可以通过开发插件,对原始文档(UDF)、查询 Query、召回、算分(粗排)、排序、摘要进行灵活修改。
在线
离线
从业务角度出发,Ha3包括了zone、biz、table的概念
config=cluster:zone_name&&query=plain:你好&&attribute=id
在线流程中,用户访问Ha3的方式是向多行部署的其中一个Qrs发送请求,而Qrs的选择是通过发现服务配合流量均衡策略实现的。一个完整的请求会包含查询关键词,并且会包含描述了统计、过滤、排序的行为参数。Qrs会再次通过发现服务结合流量均衡策略,选择具体的一列或多列Searcher机器,将用户查询分发下去。Searcher上执行索引查找、过滤、统计,这些流程的具体行为与相关参数在查询和配置中均会有涉及。
qrs上的查询逻辑主要分两个阶段 :第一个阶段向一个完整行的多列Searcher发送请求,从多列Searcher中拿到结果后合并排序。第二个阶段是将排序后前N个文档再次拼接查询串继续请求Searcher得到摘要查询结果,拿到摘要之后合并结果返回给用户。一般大多是时候摘要都是单独请求或者不请求。
Searcher的在线查询流程较多,主要的步骤如下
离线流程的执行者Build Service, 负责将纯文本的商品数据构建成Ha3格式的索引文件。原始的商品数据有两类,一类是存放在HDFS上的全量商品数据,这是定期(一般周期为天)由业务方产出,另一类为实时增量数据,商品信息变更后,业务放即时通知给消息系统Swift。
除了以上三种角色之外还有BS Admin,负责整个集群的任务调度和资源管理。提供丰富的接口进行索引的构建和构建任务的启停,资源的调整等,一般Admin会配合调度系统来调度任务的执行并维护任务的状态。
在一个Build Service服务中可以有一个或者多个Admin,通过Zookeeper进行leader选举,只有leader才会管理整个Build Service服务,其他Admin作为fllower。
对于Processor、Builer和Meger节点,它们只有分片(Shard)的概念,没有备份的概念。比如对于Processor,每个分片处理不同的数据,一个分片只会启动一个节点,如果某些原因启动了多个节点,多个节点之间通过ZK进行leader选举,只有leader节点才会存活并工作,非leader节点的进程会自动退出。Builder和Merger的情况与Processor类似,唯一不同的是分片数是在创建表时就确定的,它们只能基于分片数据调节并发度,因此Builder和Meger节点真实启动的个数是分片数乘以并发度。
Ha3的日常运维包括二进制版本更新、配置更新、全量与增量索引更新、扩行扩列、机器调度分配等。这些都是通过简易的web操作(tisplus->suez ops),后端子模块相互配合完成的,避免了全手工操作的琐碎而又容易出错的细节。实现运维环节的子模块包含以下几个:
特点 | 机器学习 | 深度学习 |
---|---|---|
模型复杂度 | 较为简单,采用线性模型、决策树、支持向量机 | 非常复杂,采用多层神经网络 |
特征工程 | 手工提取特征 | 自动特征提取 |
数据量 | 较小数据量 | 几百万 |
计算资源 | 较小 | 较强算力GPU/TPU |
应用场景 | 文本分类、推荐系统 | 计算机视觉、自然语言处理 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。