10年+,阿里沉淀出怎样的搜索引擎?

阿里妹导读:搜索引擎是阿里的10年+沉淀,具有很高的技术/业务/商业价值。1688很多场景都借助了搜索中台的能力,基于此,以1688主搜为例介绍搜索全链路知识点,希望对你有所借鉴,有所启发。

一、整体架构

搜索引擎分为数据源聚合(俗称dump)、全量/增量/实时索引构建及在线服务等部分,以Tisplus为入口经由Bahamut(Maat进行工作流调度)->Blink->Hdfs/Swift->BuildService->Ha3->SP->SW等阶段对客户提供高可用/高性能的搜索服务。其中数据源聚合在tisplus平台和Blink平台完成,Build service和Ha3在suez平台完成,SP和SW通过drogo进行部署。具体架构图如下:

二、Tisplus

1688目前有spu、cspu,company,buyoffer和feed等引擎及offer离线在tisplus运维,该平台主要ha3和sp的搭建和维护,大体架构如下:

在日常维护中偶尔会遇到数据源产出失败的问题,主要是由于数据源表权限过期及zk抖动等原因。性能方面,在集团内搜索中台团队的引入Blink Batch模型后,dump执行时间被缩短,具体指标如下(以buyoffer引擎为例):

在tisplus平台,离线dump的入口如下:

DAG数据源图示例:

下面主要说下离线dump数据源处理流程,包括Bahamut、Maat和数据输出。

2.1 Bahamut——数据源图处理

Bahamut是离线数据源处理的组件平台,将web端拼接的数据图通过jobManager翻译成可执行的sql语句。目前Bahamut包含的组件有四类,分别是:

  1. 数据输入:datasource(支持tddl和odps)
  2. KV输入:HbaseKV(Hbase数据表)
  3. 数据处理:Rename(数据字段重命名),DimTrans(使用1对多的数据聚合),Functions(简单字段处理),Selector(字段选择),UDTF(数据逻辑处理),Merge(数据源聚合),Join(left join)
  4. 数据输出:Ha3(Hdfs/swift)

对数据源的处理过程,描述如下:

by 敬明

而对于Bahamut->blink过程可以陈述如下:

其中,Bahamut将任务拆解后扔给JobManager进行逻辑节点到物理节点的转换,形成若干节点后再归并组合成一个完整的SQL语句,例如上图Kratos_SQL就是一个增量Join的完整SQL,配合资源文件一起通过BayesSDK提交任务。此外,平台增加了一个弱个性化配置的功能,可以通过个性化配置来实现控制某个具体任务的并发度、节点内存、cpu等等参数。

2.2 Maat——分布式流程调度系统

Maat是基于开源项目Airflow再次开发的分布式流程调度系统,具有可视化编辑及通用的节点类型,Drogo化部署,分集群管理及完善的监控&报警机制等优点。

关于Airflow及其他工作流系统,对比陈列如下:

eed引擎为例,maat调度页面如下:

当任务错误时,可以通过该页面进行“将指定步骤置fail”然后重跑全量任务,也可以通过查看某个步骤的log获悉任务失败原因。

2.3 Ha3 doc——数据输出

经过上述步骤后,最后将数据以xml的形式(isearch format)输出到HDFS/Pangu路径(全量)和Swift Topic(增量),引擎全量时通过HDFS路径获取全量doc文件进行build,增量时直接从swift topic中获取增量更新消息更新到引擎中。离线平台通过一个服务为Tisplus引擎模块提供表信息的查询等功能,以下是一个HA3表包含的信息:

{"1649992010": [{"data": "hdfs://xxx/search4test_st3_7u/full", // hdfs路径"swift_start_timestamp": "1531271322", //描述了今天增量的时间起点"swift_topic": "bahamut_ha3_topic_search4test_st3_7u_1","swift_zk": "zfs://xxx/swift/swift_hippo_et2","table_name": "search4test_st3_7u", // HA3 table name,目前与应用名称一样"version": "20190920090800” // 数据产出的时间}]
}

三、Suez

经过上述步骤后,数据以xml(isearchformat)的格式产出到Hdfs和swift,然后通过在suez_ops平台的离线表中选择数据类型为zk并配置相应的zk_server和zk_path即可。

然后由Build service完成全量/增量/实时索引的构建,然后分发到Ha3在线集群提供服务。

suez的离线表构建逻辑如下:

suez在线服务逻辑如下:

下面针对离线(buildservice)和在线(ha3)进行简述:

**3.1 Build Service——索引构建
**

Build Service(简称BS)是一套提供全量、增量、实时索引的构建系统
build_service总共有五类角色:

  • admin :负责控制整体build流程,切换全量增量状态,发起定期任务,相应用户的控制请求;
  • processor :负责数据处理,将用户的原始文档转化为轻量级可build的文档形态;
  • builder :负责构建索引;
  • merger :负责索引整理;
  • rtBuilder :负责在线索引的实时构建。

其中admin、processor、builder、merger是以二进制程序的方式运行在hippo上,rtBuilder是以lib的形式提供给在线部分使用。

一个完整的全量+增量过程会产生一个generationid,该generation会经历 process full-> builder full -> merger full ->process inc -> builder inc ->merger inc的过程,其中处于inc过程后,builder inc和merger inc会交替出现。1688在ha3升级之前经常会出现 build tooslow问题就是因为分配到了坏节点或builderinc/merger inc阶段卡住。

3.2 Ha3——在线搜索服务

Ha3是一套基于suez框架的全文检索引擎,提供丰富的在线查询子句,过滤子句,排序子句,聚合子句且支持用户自定义开发排序插件。服务架构如下:

1688主搜引擎由一组Qrs、searcher和summary组成:

  • Qrs的作用是:对输入的查询作解析与校验,通过后把查询转发给相应的;searcher,收集合并searcher返回的结果,最后对结果做一些加工并返回给用户。其中也可以通过写meger插件干预合并规则;
  • searcher:可以是文档的召回服务(searcher),也可以是文档的打分与排序服务(ranker)或者是文档的摘要服务(summary);
  • summary:1688主搜将searcher和summary分离,summary集群只提供取商品详情的服务。

qrs/searcher/summary等机器通过挂载到cm2提供服务,比如qrs有对外cm2,可以对SP等调用方提供服务,searcher和summary有对内cm2,可以接收从qrs来的请求并完成召回排序取详情等服务。

一次调用方的query服务,要经由qrs->query解析->seek->filter->rank(粗排)->agg(聚合)->rerank(精排)->extraRank(最终排)->merger->summary(取详情)的过程,具体描述如下:

其中,ReRank和ExtraRank由Hobbit插件及基于Hobbit的战马插件完成,业务方可以根据自身需求开发战马特征并指定各特征权重得到商品的最终分。

四、Drogo

drogo是基于二层调度服务Carbon的无数据服务的管控平台,1688的SP服务及QP代理服务均部署在该平台。

1688搜索链路主要服务平台部署情况简述如下:


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

封装详解。

封装详解 1.该露的露,该藏的藏 ​ 我们程序设计的追求“高内聚,低耦合”。 ​ 高内聚:就是类的内部数据操作细节自己完成,不允许外部干涉; ​ 低耦合:仅暴露少量的方法给外部使用。 2封装(…

年薪15W的程序员因为掌握这个技能,薪资翻倍!

在这个IT系统动辄就是上亿流量的时代,java作为大数据时代应用最广泛的语言,诞生了一批又一批的技术。一些独角兽公司以及腾讯、阿里、百度、网易等知名大厂对java人才的需求量连年升级,优秀程序员能轻松达到30w的水平,但写此同时&…

(进阶篇)Redis6.2.0 集群 哨兵模式_故障转移_03

文章目录一、前置准备启动redis服务启动sentinel服务查看sentiel启动日志二、实战故障转移2.1. 主节点停止2.2. Sentienl监控日志2.3. 节点信息监控2.4. 故障转移后变化2.5. 重新启动2.6. sentine日志2.7. 节点信息监控2.8. 配置文件变化2.9. 读写验证一、前置准备 启动redis服…

语雀携手Teambition,玩转项目协作与知识管理

在数字化转型的大浪潮中,大量企业都有项目协作与知识管理诉求。Teambition 是一款优秀的项目协作产品,深受众多企业的青睐。语雀则是来自阿里巴巴的一款新品,是知识管理领域里冉冉升起的新星。今年夏天,语雀携手Teambition&#x…

支付宝小程序“开闸放粮”,亿级流量扶持中小商家!

街边小店也有机会登上支付宝首页推荐位了! 9月17日消息,在支付宝开放日活动中,支付宝宣布向小程序商家开放包括主搜热搜榜、首页腰封、首页惠支付频道、首页生活服务频道、花呗频道、会员频道等六大中心化入口,商家通过引导用户扫…

idea 编译Java heap space 内存溢出

解决方案 根据自身的实际情况设置参数大小,我调整到4096就好使了

【PostgreSQL】从零开始:(二十八)数据类型-XML类型

XML XML(可扩展标记语言)是一种用于描述数据的标记语言。它被设计用于传输和存储数据,以及作为不同系统之间进行数据交换的通用格式。XML使用标记来标识数据元素,并使用嵌套的结构来表示数据之间的层次关系。XML具有以下特点&…

避坑!使用 Kubernetes 最易犯的 10 个错误

Kubernetes 作为大规模企业级应用容器编排的首推工具,其为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,本文作者 Marek Bartik 深入分享了 K8s 的避坑宝典,相信会对开发者们大有裨益。作者 | Marek Bartik&…

当 K8s 集群达到万级规模,阿里巴巴如何解决系统各组件性能问题?

本文主要介绍阿里巴巴在大规模生产环境中落地 Kubernetes 的过程中,在集群规模上遇到的典型问题以及对应的解决方案,内容包含对 etcd、kube-apiserver、kube-controller 的若干性能及稳定性增强,这些关键的增强是阿里巴巴内部上万节点的 Kube…

Super详解(重点)

Super详解(重点) super注意点; 1. super调用父类的方法,必须在构造方法的第一个2. super必须只能出现在子类的方法或者构造方法中!3. super和this 不能同时调用构造方法!Vs this: ​ 代表的对象不同: ​…

来了!云栖大会都能看到什么?

盼望着 盼望着 一年一度科技盛宴2019杭州云栖大会 来了! 欢迎你 来自远方的开发者们 今天小云为你偷偷潜入会场 带来一大波“谍照” 一起看云栖 在这儿,感受科技带来的巨大惊喜 平头哥放大招! 人工智能整体性突破! 更有三位男神…

美国 AI 博士一针见血:Python 这样学最容易成为高手!

我见过市面上很多的 Python 讲解教程和书籍,他们大都这样讲 Python 的:先从 Python 的发展历史开始,介绍 Python 的基本语法规则,Python 的 list, dict, tuple 等数据结构,然后再介绍字符串处理和正则表达式&#xff0…

【物联网开发实战】- 设备上云方案详解?

【物联网开发实战】- 如何让设备上云? 物联网开发过程中遇到的第一个棘手问题就是:如何让设备连接上云? 我们以智能洗衣机为例,至少包含:温度/水位等传感器,主控MCU(Microcontroller Unit&…

bash: mysqldump: command not found

文章目录一、问题分析定位二、解决方案2.1. 解决方案12.2. 解决方案22.3. 解决方案3一、问题分析定位 由于mysqldump在mysql/bin目录下面,直接执行此命令,环境变量中没有,找不到的情况 二、解决方案 2.1. 解决方案1 # 进入到mysql的bin目…

方法重写(重点)-->多态

方法重写(重点)–>多态 总结 重写:需要有继承关系,子类重写父类的方法! 1. 方法名必须相同2. 参数列表必须相同3. 修饰符:范围可以扩大:public>Protected>Default>private4. 抛出…

深入解析 Kubebuilder:让编写 CRD 变得更简单

导读:自定义资源 CRD(Custom Resource Definition)可以扩展 Kubernetes API,掌握 CRD 是成为 Kubernetes 高级玩家的必备技能,本文将介绍 CRD 和 Controller 的概念,并对 CRD 编写框架 Kubebuilder 进行深入…

“编程能力差,90%输在了选择上!”CTO:多数程序员都是瞎努力!

在编程的世界里,编程语言就像橱窗里的衣服,琳琅满目。 编程语言实在是太多啦,如C、C、Java、Python、Objective-C和PHP等。这让不少的小白程序员产生选择困难症,到底应该学哪一门编程语言呢?大部分人在面对“你为什么要学这个编…

mysql Slave is not configured or failed to initialize properly. You must at least set --server-id

文章目录1. 问题背景2. 解决方案1. 问题背景 在创建mysql从节点复制链路时,由于虚拟机我是从一个模板复制而来的因此,server-id是一样的。 2. 解决方案 # 编辑/etc/my.cnf vi /etc/my.cnf# 添加如下2行代码 # 此处的server-id,只要不一样即…

Fun 3.0 发布——资源部署、依赖下载、代码编译等功能又又又增强啦!

Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API 网关、日志服务等资源。它通过一个模板文件(template.yml),协助您进行开发、构建、部署操作。Fun 的更多文档 参考。 3.0 带来的新特性 1.…

sqlite事务模型、性能优化tips、常见误区

0,前言 本文主要介绍sqlite的事务模型,以及基于事务模型的一些性能优化tips,包括事务封装、WAL读写分离、分库分表、page size优化等。并基于手淘sqlite的使用现状总结了部分常见问题及误区,主要集中在多线程的设置、多线程下性能…