由于一些原因需要了解twitter的EarlyBird系统,至于对我们有什么作用...看看bloomfilter-chains就清楚了一个很好的移植,各处搜集加上自己的理解,现在作为一个总结放到这里:

EarlyBird是Twitter的实时搜索引擎,它目前服务于Twitter的tweet的搜索。建立之初,Twitter的工程师就为它定下几大目标:

(1)低延迟高吞吐的检索能力。
(2)低延迟高处理能力的索引构建。
(3)能够处理突发峰值。支持并发读写。
(4)突出时效性。时间越近权值越高。

Earlybird还有一个特点,每个用户得到的搜索结果都是“个性化”的。结果排序会根据用户的本地关系图等特征进行调整。总的来看,earlybird需要处理如下3种数据(Twitter的工程师称之为信号,signal):

  1. 静态信号(Static Signals):在初次建立索引的时候被建入,例如:tweet的语言
  2. 共鸣信号(Resonance Signals):随着时间的推移,需要不断动态更新的信息,例如:tweet被转发的次数
  3. 搜索用户的信息:和用户相关的信息,在发起搜索时被用来进行个性化排序。例如,本地关系图等

下面是从网上找到的一个架构图:

注:

twitter对存档tweet使用lucene做全量索引。

tweet的实时索引(10秒之内索引)EarlyBird完成。

  • 图的上半部分是tweet的索引构建阶段,下半部分是检索阶段。Earlybird服务是整个系统的核心,它负责建立、检索并维护着倒排索引数据。
  • 索引构建过程如下:
    1. 用户发布的新tweet会被发送到一个队列(Ingestion Pipeline)里面。在这里,tweet的文本被分词,并被加上静态信号。
    2. 按照hash分割,tweet被分发到各个Earlybird服务上。Earlybird将tweet实时地建立索引
    3. 同时,另外有个一个Updater服务,它推送共鸣信号到Earlybird服务,动态地更新索引。
  • 查询过程如下:
    1. 用户搜索请求搜先到达Blender服务(搜索前端服务器),Blender解析请求,并将搜索用户的本地社交图谱(Local Social Graph)合并到搜索请求中,往下发送到Earlybird服务。
    2. Earlybird服务执行相关性计算并排序。并将排序好的tweet列表返回给Blender。
    3. Blender合并各个Earlybird返回的列表,并执行一些重排序(Reranking),然后返回给用户

下面,我们主要关注一下Earlybird的索引结构。其中最主要的2个部分:Term字典 和 倒排索引 。

-->Term字典:
Term字典一般是Hash-based或者Tree-based的。Earlybird不需要支持计算query中term的偏移prefix等复杂查询,所以用哈希表就足够了。term字典就是一个大的hashtable。由于Java默认的Hashmap使用的是拉链法,不是gc友好的数据结构,所以Earlybird自己实现了开放链址法实现,避免大量小对象gc开销。为了节约空间,每个Term被分配了一个唯一且单调递增的id做为key,value的数据包含:

1、Term对应的倒排索引数据长度 2、指向位置倒排索引数据末尾的指针

这里保存倒排索引长度的目的是为了在多Term的拉链归并的时候,能按照索引长度进行排序,使得长度小的先先被合并,减少不必要的索引扫描。

这里有2个小问题:

  1. Q: 保存倒排索引长度的目的?

    • A: 在多Term的拉链归并的时候,能按照索引长度进行排序,使得长度小的先先被合并,减少不必要的索引扫描
  2. Q: 为什么保存的是倒排索引末尾的指针,而不是头部?
    • A: 如初识Earlybird中提到,Earlybird有对发布时间做优化,即,新的tweet有较高权值,那么它理应被先遍历到。

-->倒排索引

为了实现高吞吐、低延时地并发索引更新和检索服务,Earlybird采取了将分离索引的读和写的策略:每个实例维护了多个索引分段(目前是12个1),每个分段保存相对较少量的tweet(目前是223~840万1)。新增加的tweet首先被放到同一个索引分段中。这样,在任意时间,只有一个分段是在发生写操作的(我们称之为“活动分段”),而其它分段处于只读状态(称之为“只读分段”)。当一个活动分段写满之后,它就会被转换成一个只读分段,转换过程中,一系列优化会被执行,以提高效率:一份新的索引数据会被创建,原数据不会发生改变。当新数据创建完毕之后,原数据会被优化过的新数据替换掉。 postinglist会以1000为阈值划分为“长”和“短”的两类。短的,posting保持原样(24-bit文档id加上8-bit的位置信息),但是posting会按照时间逆序排列。对于长的postinglist,引入基于块(block-based)的来源于PForDelta2和Simple93的压缩算法。postings数据被存放在256字节定长的block中。block的最开头4个字节是未压缩的,接下来的4个字节存储了block的头信息,剩下248字节(1984bits)用来存储编码过后的变长的posting数据。原始的posting数据被转换成{d-gap, position}的对。头信息中保存着,后面的变长数据中存储了多少个{d-gap, position}对。这个n的计算方法如下:

n((log2gapmax)+(log2posmax))1984

因为上面n的取值范围在一个相对较小的区间,可以使用预先定义好的bit操作来加速编码解码。

下面是具体的数据结构

索引结构包括4pool每个pool里面有若干个slice每个slice保存一个termpostinglist每个postinglist里面存储着一个termposting信息,每个posting是一个32-bit的整数:24-bit用作文档id8-bit用作位置id保存termtweet中出现的位置。因为tweet140字符限制,所以8-bit足够用。
slice的大小由所在pool的级别决定,4pool分别对应212427211。建立索引时,先尝试填满21pool中的slice如果填满,就转到24poolslice以此类推。termdict中保存term对应的最后一个pool的中postinglist尾部指针,而不是首部。这样做的目的是,Twitter的检索顺序是按照时间顺序,数据的新旧程度在排序算法中占了很大比重。
在这样的索引结构下,一般的查询的步骤是这样的:

1、对Query进行分词成term。对每个term,查询Term dict中对应的postlinglist的指针。

2、通过指针,最多遍历4个pool中的slice数据,获得整个postinglist。

3、通过针对用户的特色处理之后返给用户结果。

为了加快处理速度,处于活动状态的分段数据是不会被压缩的。

为了实现高吞吐、低延时地并发索引更新和检索服务,Earlybird采取了将分离索引的读和写的策略:每个实例维护了多个索引分段(目前是12个),每个分段保存相对较少量的tweet。新增加的tweet首先被放到同一个索引分段中。这样,在任意时间,只有一个分段是在发生写操作的(称之为“活动分段”),而其它分段处于只读状态(称之为“只读分段”)。
11个只读段并发读不需要锁,唯一的可读可写段使用volatile关键字实现高效同步(jvm memory barrier)一个segment中tweet数量超过8.4m时,segment经过optimize(不是lucene中的段合并,而是做压缩)变为read only。11个只读段并发读不需要锁,唯一的可读可写段使用volatile关键字实现高效同步(jvm memory barrier)。twitter全量和增量分开的设计中,全量可以只有删除操作,禁止段合并,避免了段合并的问题,new generation和old generation的大小可以在整个运行阶段保持稳定,有利于系统性能的平稳高效。

Twitter实时搜索系统EarlyBird的总结相关推荐

  1. Twitter实时搜索系统EarlyBird

    twitter对存档的tweet使用lucene做全量索引,新发的推文则是实时索引,实时检索(10秒之内索引).实时索引和检索系统叫EarlyBird. 感觉写得比较清楚简洁,只要这些信息足够真实可信 ...

  2. 亿级搜索系统的基石,如何保障实时数据质量?

    简介: 突然而至的疫情,让线下娱乐几乎停摆.全国人民对于线上娱乐需求激增,在家追剧.在家上课.在家互动,还要时刻关注疫情动态.每时每刻,都有海量用户在优酷搜索自己想看的内容.千万级别的视频量,几十亿级 ...

  3. 使用 Kafka 和 Spark Streaming 构建实时数据处理系统

    使用 Kafka 和 Spark Streaming 构建实时数据处理系统  来源:https://www.ibm.com/developerworks,这篇文章转载自微信里文章,正好解决了我项目中的 ...

  4. 实时搜索专家Krzana正式进军金融大数据市场

    通过与以能源为重点的对冲基金和股市观察家签署联盟协议,来自伦敦的实时搜索专家Krzana正在金融数据市场掀起一场巨浪. 对冲基金对数据有着迫切的需求,因为他们希望对相关信号作出迅速实时的交易反应.而K ...

  5. python嵌入式系统开发_Python在开发实时嵌入式系统中的作用

    原标题:Python在开发实时嵌入式系统中的作用 在过去的几年里,Python已经成为一种热门的程序语言.以著名的Monty Python喜剧小组命名,该语言是面向对象和解释.该属性导致Python在 ...

  6. ELK学习1_开源分布式搜索平台ELK+Redis+Syslog-ng实现日志实时搜索

    Logstash + Elasticsearch + Kibana+Redis+Syslog-ng ElasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎.设计用于 ...

  7. ElasticSearch探索之路(五)集群与分片:选举、动态更新、近实时搜索、事务日志、段合并

    文章目录 集群内部原理 集群与节点 分片 选举 分片内部原理 索引不变性 动态更新索引 近实时搜索 事务日志 段合并 集群内部原理 集群与节点 一个运行中的Elasticsearch实例称为一个节点, ...

  8. 使用 Elasticsearch 优雅搭建自己的搜索系统

    什么是elasticsearch Elasticsearch 是一个开源的高度可扩展的全文搜索和分析引擎,拥有查询近实时的超强性能. 大名鼎鼎的Lucene 搜索引擎被广泛用于搜索领域,但是操作复杂繁 ...

  9. 持续定义Saas模式云数据仓库+实时搜索

    简介: 本文由阿里云计算平台事业部 MaxCompute 产品经理孟硕为大家带来<持续定义Saas模式云数据仓库+实时搜索>的相关分享.以下是视频内容精华整理,主要包括以下三个部分:1.W ...

最新文章

  1. 模板 - 质数筛法(线性筛法、二次筛法)
  2. anaconda双版本完美并存
  3. 转载+记录数据增广的八种常用方式
  4. codeforces gym-101673 Twenty Four, Again 24点,枚举表达式树过题
  5. 数据科学还是计算机科学_您应该拥有数据科学博客的3个原因
  6. 算成绩啦(洛谷P5740、P5741题题解,Java语言描述)
  7. 【转】如何更改VS2005的启动环境
  8. uniapp -nvue 轮播图与背景图的淡入淡出效果
  9. 「小狼毫」-- rimeime 中州韵输入法引擎
  10. Duplicate Finder and Remover for Mac(重复文件查找删除工具)
  11. ios开发 多人语音聊天_iOS语音通话(语音对讲)
  12. JAVA专业课题研究方向有哪些,课题研究方向有哪些
  13. 如何一键远程开机,远程唤醒功能
  14. 我国应该大力推广五笔字型输入法
  15. php nbl2,NBL二年级新军杀入总决赛 虽败犹荣已创造历史
  16. 【排故篇】_啥是无效对象,出现时如何破?
  17. 微信小程序实战教程1503---生成二维码
  18. 咸鱼看书之《射频与微波电子学》(3:电路学数学基础之:相量)
  19. 苏州大学计算机科学专业排名,2019苏州大学专业排名
  20. 揭秘618流量营销模式,天猫一小时打造阵仗浩大的立体全包围

热门文章

  1. list的stream流常用用法
  2. 【数学 进阶】初等数论 学习笔记
  3. 华为研发投入全球第二!力压三星、苹果
  4. React生命周期的变化
  5. 华为nova5i计算机在哪,华为nova5i怎么样
  6. 2020年Java开发前景还好吗?现在学java好找工作吗?
  7. 刘强东放弃京东的股权套现离场
  8. Matplotlib-几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等,附有代码
  9. GZIP,XZ,LZO,BZIP2,LZMA压缩比较
  10. 国际最顶尖的AI技术发展,愈像一场比拼资金与人才的竞赛