Facebook支撑万亿Post搜索背后的技术窥探
转自http://www.csdn.net/article/2013-10-29/2817333-under-the-hood-building-posts-search
近日,Facebook为post搜索添加了Graph Search。我们来看几个惊人的数字:Facebook每天约产生10亿条post,post索引总数已上万亿条,数据量超700TB。为这些post建立索引和构建实时查询系统在工程上存在非常大的挑战,那么Facebook又是如何应对这一挑战的?以下为译文:
数据收集
Facebook的底层数据结构是为了满足快速迭代网络服务的需要,这却也成为构建实时查询系统所面临的最大挑战。增加新功能往往需要改动这些数据结构,而Facebook一贯的作风是变动不要给工程师平添烦恼。然而,由于wall post、photo、check-in等功能采用不同的数据存储机制,对底层数据结构进行改动增加了以时间、地点和标签进行排序的难度。当前,排序和索引的数据约有70种,其中很多种都是基于特定post类型的。此外,数据存储在一个用于生产环境的MySQL数据库中。这也就意味着,当数据库同时支撑生产传输及数据收集时,负载将大幅度增加,因此这些过程必须被严格监控。
索引建立
数据收集来后,我们将其存储在HBase集群中,然后执行Hadoop map-reduce任务,高并行地为之建立索引。为原始数据建立索引后,然后便传输给搜索的基础Unicorn。我们将数据分为两块——文档数据和反向索引(inverted index)。每条post的文档数据包含用于排序的相关信息。传统意义上搜索索引有什么,反向索引就有什么。要建反向索引需要遍历每一条post,并确定与假设中的哪种搜索过滤器相匹配。
索引更新
为了更新索引,我们使用Wormhole技术订阅MySQL数据库中的变更。一旦有新post,现有post被修改、删除或与post有关的相关数据被编辑等情况发生时,我们就会都对相关post进行更新操作。为了减少重复代码,我们使用与在“数据收集”部分提到的相同逻辑来进行更新操作。不同之处在于,我们在收集数据时有意避开缓存,因为我们想尽量避免请求没有缓存过的数据。当我们更新索引时,我们将会命中缓存,因为我们希望该数据是最近被访问过,并且还在缓存中。
索引存储
post索引要比Facebook维护的其他搜索索引大得多。在开始搜索post之前,Facebook 所有的搜索索引都存储在RAM中。对于快速查询来说,这再好不过了。对小型的搜索索引来说也是可行的。然而,将700多TB的数据存储在RAM中所带来系统开销是难以想象的,因为它需要维护分布在多台机器上的索引。协调存储索引的多台机器使它们有序地工作给系统带来了巨大的性能损耗,Unicorn团队为此不得不寻找存储post索引的新方法。我们最终敲定的解决方案是用固态闪存存储大部分的索引,用RAM存储存取最为频繁的数据结构,性能得以维持。
结果排序
由于索引了1万亿条post,绝大多数查询返回的结果数量之多是任何人都读不完的。为此,Facebook开始设计对结果进行排序。为了使对用户有价值并与用户相关的内容浮到上面,主要采用了两种主要策略:查询重写和结果动态打分。在执行前,先重写查询,灵活增加子句,以确保查询结果对用户价值更大。为搜索结果进行打分,包括基于一系列用于排序的特征进行排序和选择文档。排序特征是从文档中抽取出来的,目前一共抽取了100多项特征,结合排序模型,用于寻找最佳搜索结果。随着用户量的增长和用户反馈的增多,排序模型必将得到进一步改善。
项目简史
像 Facebook 的很多其他产品一样,post搜索功能也是诞生于一个编程马拉松项目。而在过去的一年中,Graph Search 团队的几十个人实现了post搜索的大部分功能——基础架构、排序和产品化。
Facebook支撑万亿Post搜索背后的技术窥探的更多相关文章
- TOP100summit:【分享实录-QQ空间】10亿级直播背后的技术优化
本篇文章内容来自2016年TOP100summit QQ空间客户端研发总监王辉的案例分享.编辑:Cynthia 王辉:腾讯SNG社交平台部研发总监.腾讯QQ空间移动客户端技术负责人高级工程师.09年起 ...
- 市值3万亿的facebook再出丑闻,你的数据,到底应该归谁?
最近一则<Facebook隐私泄露事件继续发酵,黑客明码标价出售聊天信息>的新闻被爆出,一个用户的信息被标价10美分.让人不禁感慨,3万亿市值的facebook,用户数据竟然如此便宜. 在 ...
- 【DataMagic】如何在万亿级别规模的数据量上使用Spark
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文首发在云+社区,未经许可,不得转载. 作者:张国鹏 | 腾讯 运营开发工程师 一.前言 Spark作为大数据计算引擎,凭借其快速.稳定. ...
- 日调度万亿次,微服务框架TSF大规模应用——云+未来峰会开发者专场回顾
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 演讲者:张浩 腾讯云中间件产品负责人 背景:众多开发者中,一定经历类似的甜蜜烦恼,就是当线上业务规模越来越大,系统分支发展越来越多的时候,初 ...
- 支撑百亿级应用的 NewSQL
支撑百亿级应用的 NewSQL https://zhuanlan.zhihu.com/newsql/ 项目背景 初次接触 TiDB,是通过同程网首席架构师王晓波先生的分享,当时同程网正在使开发和数据库 ...
- 如何在万亿级别规模的数据量上使用Spark
一.前言 Spark作为大数据计算引擎,凭借其快速.稳定.简易等特点,快速的占领了大数据计算的领域.本文主要为作者在搭建使用计算平台的过程中,对于Spark的理解,希望能给读者一些学习的思路.文章内容 ...
- 如何基于MindSpore实现万亿级参数模型算法?
摘要:近来,增大模型规模成为了提升模型性能的主要手段.特别是NLP领域的自监督预训练语言模型,规模越来越大,从GPT3的1750亿参数,到Switch Transformer的16000亿参数,又是一 ...
- 口护万亿市场杀出的实力派 Oclean欧可林
撰文 |懂懂 编辑 | 秦言 来源:懂懂笔记 在"青年必去的电影节"上,发现了一个跟他们打成一片的智能护齿"新星". 25日,备受关注的第15届FIRST青年电 ...
- 日吞吐万亿,腾讯云时序数据库CTSDB解密
一.背景 随着移动互联网.物联网.大数据等行业的高速发展,数据在持续的以指数级的速度增长,比如我们使用手机访问互网络时的行为数据,各种可穿戴设备上报的状态数据,工厂中设备传感器采集的指标数据,传统互联 ...
随机推荐
- XX-net 部署网络
https://github.com/XX-net/XX-Net/wiki/%E4%BD%BF%E7%94%A8Chrome%E6%B5%8F%E8%A7%88%E5%99%A8 主要步骤有三步:安装 ...
- 前端知识--------HTML内容
HTML介绍 1.web服务本质 import socket sk = socket.socket() sk.bind(('127.o.o.1',8080)) sk.listen() while 1: ...
- form表单的默认提交行为
一 如果<form></form>表单中只有一个<input type="text"/>,则使文本框获取焦点,并单击回车,form会自动提交. ...
- 条款2:尽量以const, enum, inline替换#define
原因: 1. 追踪困难,由于在编译期已经替换,在记号表中没有. 2. 由于编译期多处替换,可能导致目标代码体积稍大. 3. define没有作用域,如在类中定义一个常量不行. 做法: 可以用const ...
- nginx 的 upstream timed out 问题
nginx 作为负载服务,表现为网站访问很慢,有些文件或页面要等待到60s才会返回,我注意到60s就是超时时间,但是超时后返回状态是正常值200,网站可以正常打开,就是会一直等待到超时才打开,而且问题 ...
- 解决mysql无法远程登陆问题
解决这个问题的思路: 一.先确定能过3306端口 二.再检查授权Host是否存在 (新授权记得flush privileges;) 一 步骤 1.首先打开mysql的配置文件,找到这句话,注释掉. ...
- 设置 svn 与 web线上同步
默认你已经配置好了svn服务 1.假设我们的线上网站目录为:/data/www/xxx 2.假设svn的仓库目录为:/data/svn/repo 一.checkout一份svn到线上网站目录 svn ...
- linux 动态库 静态库 函数覆盖
本文讨论了linux动态库 静态库中函数的覆盖问题. 测试目的: 同名函数,分别打成动态库libdync_lib.so与静态库libstatic_lib.a,并把libstatic_lib.a打到另 ...
- [NOI.AC]DELETE(LIS)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABRMAAASJCAYAAABLtYu4AAAgAElEQVR4Xuzdf2xTd74n/PeqI/NsNB ...
- 品味性能之道<四>:管理重于技术
一.性能优化中的角色分工 (1).老外的角色分工 在oracle性能优化方法论中,将IT系统中不同角色需要承担的性能优化工作罗列如下. 各司其职的角色分工 业务分析人员 1.业务需 ...