返回顶部
首页 > 资讯 > 精选 >Facebook的数据库查询引擎Presto在美团有哪些应用
  • 288
分享到

Facebook的数据库查询引擎Presto在美团有哪些应用

2023-06-10 05:06:13 288人浏览 薄情痞子
摘要

这篇文章主要讲解了“Facebook的数据库查询引擎Presto在美团有哪些应用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Facebook的数据库查询引擎Presto在美团有哪些应用”吧

这篇文章主要讲解了“Facebook的数据库查询引擎Presto在美团有哪些应用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Facebook的数据库查询引擎Presto在美团有哪些应用”吧!

Facebook的数据仓库存储在少量大型hadoop/hdfs集群Hive是Facebook在几年前专为Hadoop打造的一款数据仓库工具。在以前,Facebook的科学家和分析师一直依靠Hive来做数据分析。但Hive使用mapReduce作为底层计算框架,是专为批处理设计的。但随着数据越来越多,使用Hive进行一个简单的数据查询可能要花费几分到几小时,显然不能满足交互式查询的需求。Facebook也调研了其他比Hive更快的工具,但它们要么在功能有所限制要么就太简单,以至于无法操作Facebook庞大的数据仓库。

2012年开始试用的一些外部项目都不合适,他们决定自己开发,这就是Presto。2012年秋季开始开发,目前该项目已经在超过 1000名Facebook雇员中使用,运行超过30000个查询,每日数据在1PB级别。Facebook称Presto的性能比Hive要好上10倍多。2013年Facebook正式宣布开源Presto。

本文首先介绍Presto从用户提交sql到执行的这一个过程,然后尝试对Presto实现实时查询的原理进行分析和总结,最后介绍Presto在美团的使用情况。

Presto架构
Facebook的数据库查询引擎Presto在美团有哪些应用

Presto查询引擎是一个Master-Slave的架构,由一个Coordinator节点,一个Discovery Server节点,多个Worker节点组成,Discovery Server通常内嵌于Coordinator节点中。Coordinator负责解析SQL语句,生成执行计划,分发执行任务给Worker节点执行。Worker节点负责实际执行查询任务。Worker节点启动后向Discovery Server服务注册,Coordinator从Discovery Server获得可以正常工作的Worker节点。如果配置了Hive Connector,需要配置一个Hive MetaStore服务为Presto提供Hive元信息,Worker节点与HDFS交互读取数据。

Presto执行查询过程简介
既然Presto是一个交互式的查询引擎,我们最关心的就是Presto实现低延时查询的原理,我认为主要是下面几个关键点,当然还有一些传统的SQL优化原理,这里不介绍了。

完全基于内存的并行计算
流水线
本地化计算
动态编译执行计划
小心使用内存和数据结构
类BlinkDB的近似查询
GC控制
为了介绍上述几个要点,这里先介绍一下Presto执行查询的过程

提交查询
用户使用Presto Cli提交一个查询语句后,Cli使用Http协议与Coordinator通信,Coordinator收到查询请求后调用SqlParser解析SQL语句得到Statement对象,并将Statement封装成一个QueryStarter对象放入线程池中等待执行。
Facebook的数据库查询引擎Presto在美团有哪些应用

SQL编译过程
Presto与Hive一样,使用Antlr编写SQL语法,语法规则定义在Statement.g和StatementBuilder.g两个文件中。
如下图中所示从SQL编译为最终的物理执行计划大概分为5部,最终生成在每个Worker节点上运行的LocalExecutionPlan,这里不详细介绍SQL解析为逻辑执行计划的过程,通过一个SQL语句来理解查询计划生成之后的计算过程。
Facebook的数据库查询引擎Presto在美团有哪些应用

样例SQL:

代码如下:

select c1.rank, count(*) from dim.city c1 join dim.city c2 on c1.id = c2.id where c1.id > 10 group by c1.rank limit 10;


Facebook的数据库查询引擎Presto在美团有哪些应用

上面的SQL语句生成的逻辑执行计划Plan如上图所示。那么Presto是如何对上面的逻辑执行计划进行拆分以较高的并行度去执行完这个计划呢,我们来看看物理执行计划。

物理执行计划
逻辑执行计划图中的虚线就是Presto对逻辑执行计划的切分点,逻辑计划Plan生成的SubPlan分为四个部分,每一个SubPlan都会提交到一个或者多个Worker节点上执行。

SubPlan有几个重要的属性planDistribution、outputPartitioning、partitionBy属性。

PlanDistribution表示一个查询Stage的分发方式,逻辑执行计划图中的4个SubPlan共有3种不同的PlanDistribution方式:Source表示这个SubPlan是数据源,Source类型的任务会按照数据源大小确定分配多少个节点进行执行;Fixed表示这个SubPlan会分配固定的节点数进行执行(Config配置中的query.initial-hash-partitions参数配置,默认是8);None表示这个SubPlan只分配到一个节点进行执行。在下面的执行计划中,SubPlan1和SubPlan0 PlanDistribution=Source,这两个SubPlan都是提供数据源的节点,SubPlan1所有节点的读取数据都会发向SubPlan0的每一个节点;SubPlan2分配8个节点执行最终的聚合操作;SubPlan3只负责输出最后计算完成的数据。
OutputPartitioning属性只有两个值HASH和NONE,表示这个SubPlan的输出是否按照partitionBy的key值对数据进行Shuffle。在下面的执行计划中只有SubPlan0的OutputPartitioning=HASH,所以SubPlan2接收到的数据是按照rank字段Partition后的数据。
Facebook的数据库查询引擎Presto在美团有哪些应用

完全基于内存的并行计算
查询的并行执行流程
Presto SQL的执行流程如下图所示

Cli通过HTTP协议提交SQL查询之后,查询请求封装成一个SqlQueryExecution对象交给Coordinator的SqlQueryManager#queryExecutor线程池去执行
每个SqlQueryExecution线程(图中Q-X线程)启动后对查询请求的SQL进行语法解析和优化并最终生成多个Stage的SqlStageExecution任务,每个SqlStageExecution任务仍然交给同样的线程池去执行
每个SqlStageExecution线程(图中S-X线程)启动后每个Stage的任务按PlanDistribution属性构造一个或者多个RemoteTask通过HTTP协议分配给远端的Worker节点执行
Worker节点接收到RemoteTask请求之后,启动一个SqlTaskExecution线程(图中T-X线程)将这个任务的每个Split包装成一个PrioritizedSplitRunner任务(图中SR-X)交给Worker节点的TaskExecutor#executor线程池去执行
Facebook的数据库查询引擎Presto在美团有哪些应用

上面的执行计划实际执行效果如下图所示。

Coordinator通过HTTP协议调用Worker节点的 /v1/task 接口将执行计划分配给所有Worker节点(图中蓝色箭头)
SubPlan1的每个节点读取一个Split的数据并过滤后将数据分发给每个SubPlan0节点进行Join操作和Partial Aggr操作
SubPlan1的每个节点计算完成后按GroupBy Key的Hash值将数据分发到不同的SubPlan2节点
所有SubPlan2节点计算完成后将数据分发到SubPlan3节点
SubPlan3节点计算完成后通知Coordinator结束查询,并将数据发送给Coordinator
Facebook的数据库查询引擎Presto在美团有哪些应用

源数据的并行读取
在上面的执行计划中SubPlan1和SubPlan0都是Source节点,其实它们读取HDFS文件数据的方式就是调用的HDFS InputSplit api,然后每个InputSplit分配一个Worker节点去执行,每个Worker节点分配的InputSplit数目上限是参数可配置的,Config中的query.max-pending-splits-per-node参数配置,默认是100。

分布式的Hash聚合
上面的执行计划在SubPlan0中会进行一次Partial的聚合计算,计算每个Worker节点读取的部分数据的部分聚合结果,然后SubPlan0的输出会按照group by字段的Hash值分配不同的计算节点,最后SubPlan3合并所有结果并输出

流水线
数据模型
Presto中处理的最小数据单元是一个Page对象,Page对象的数据结构如下图所示。一个Page对象包含多个Block对象,每个Block对象是一个字节数组,存储一个字段的若干行。多个Block横切的一行是真实的一行数据。一个Page最大1MB,最多16*1024行数据。
Facebook的数据库查询引擎Presto在美团有哪些应用

节点内部流水线计算
下图是一个Worker节点内部的计算流程图,左侧是任务的执行流程图。

Worker节点将最细粒度的任务封装成一个PrioritizedSplitRunner对象,放入pending split优先级队列中。每个

Worker节点启动一定数目的线程进行计算,线程数task.shard.max-threads=availableProcessors() * 4,在config中配置。

每个空闲的线程从队列中取出一个PrioritizedSplitRunner对象执行,如果执行完成一个周期,超过最大执行时间1秒钟,判断任务是否执行完成,如果完成,从allSplits队列中删除,如果没有,则放回pendingSplits队列中。

每个任务的执行流程如下图右侧,依次遍历所有Operator,尝试从上一个Operator取一个Page对象,如果取得的Page不为空,交给下一个Operator执行。
Facebook的数据库查询引擎Presto在美团有哪些应用

节点间流水线计算
下图是ExchangeOperator的执行流程图,ExchangeOperator为每一个Split启动一个HttpPageBufferClient对象,主动向上一个Stage的Worker节点拉数据,数据的最小单位也是一个Page对象,取到数据后放入Pages队列中
Facebook的数据库查询引擎Presto在美团有哪些应用

本地化计算
Presto在选择Source任务计算节点的时候,对于每一个Split,按下面的策略选择一些minCandidates

优先选择与Split同一个Host的Worker节点
如果节点不够优先选择与Split同一个Rack的Worker节点
如果节点还不够随机选择其他Rack的节点
对于所有Candidate节点,选择assignedSplits最少的节点。

动态编译执行计划
Presto会将执行计划中的ScanFilterAndProjectOperator和FilterAndProjectOperator动态编译为Byte Code,并交给JIT去编译为native代码。Presto也使用了Google Guava提供的LoadingCache缓存生成的Byte Code。
Facebook的数据库查询引擎Presto在美团有哪些应用

上面的两段代码片段中,第一段为没有动态编译前的代码,第二段代码为动态编译生成的Byte Code反编译之后还原的优化代
码,我们看到这里采用了循环展开的优化方法。

循环展开最常用来降低循环开销,为具有多个功能单元的处理器提供指令级并行。也有利于指令流水线的调度。

小心使用内存和数据结构
使用Slice进行内存操作,Slice使用Unsafe#copyMemory实现了高效的内存拷贝,Slice仓库参考:https://GitHub.com/airlift/slice

Facebook工程师在另一篇介绍ORCFile优化的文章中也提到使用Slice将ORCFile的写性能提高了20%~30%,参考:https://code.facebook.com/posts/229861827208629/scaling-the-facebook-data-warehouse-to-300-pb/

类BlinkDB的近似查询
为了加快avg、count distinct、percentile等聚合函数的查询速度,Presto团队与BlinkDB作者之一Sameer Agarwal合作引入了一些近似查询函数approx_avg、approx_distinct、approx_percentile。approx_distinct使用HyperLogLog Counting算法实现。

GC控制
Presto团队在使用hotspot java7时发现了一个JIT的BUG,当代码缓存快要达到上限时,JIT可能会停止工作,从而无法将使用频率高的代码动态编译为native代码。

Presto团队使用了一个比较Hack的方法去解决这个问题,增加一个线程在代码缓存达到70%以上时进行显式GC,使得已经加载的Class从perm中移除,避免JIT无法正常工作的BUG。

美团如何使用Presto
选择presto的原因
2013年我们也用过一段时间的impala,当时impala不支持线上1.x的hadoop社区版,所以搭了一个CDH的小集群,每天将大集群的热点数据导入小集群。但是hadoop集群年前完成升级2.2之后,当时的impala还不支持2.2 hadoop版本。而Presto刚好开始支持2.x hadoop社区版,并且Presto在Facebook 300PB大数据量的环境下可以成功的得到大量使用,我们相信它在美团也可以很好的支撑我们实时分析的需求,于是决定先上线测试使用一段时间。

部署和使用形式
考虑到两个原因:1、由于Hadoop集群主要是夜间完成昨天的计算任务,白天除了日志写入外,集群的计算负载较低。2、Presto Worker节点与DataNode节点布置在一台机器上可以本地计算。因此我们将Presto部署到了所有的DataNode机器上,并且夜间停止Presto服务,避免占用集群资源,夜间基本也不会有用户查询数据。

Presto二次开发和BUG修复
年后才正式上线Presto查询引擎,0.60版本,使用的时间不长,但是也遇到了一些问题:

美团的Hadoop使用的是2.2版本,并且开启了Security模式,但是Presto不支持Kerberos认证,我们修改了Presto代码,增加了Kerberos认证的功能。
Presto还不支持SQL的隐式类型转换,而Hive支持,很多自助查询的用户习惯了Hive,导致使用Presto时都会出现表达式中左右变量类型不匹配的问题,我们增加了隐式类型转换的功能,大大减小了用户SQL出错的概率。
Presto不支持查询lzo压缩的数据,需要修改hadoop-lzo的代码。
解决了一个having子句中有distinct字段时查询失败的BUG,并反馈了Presto团队 https://github.com/facebook/presto/pull/1104
所有代码的修改可以参考我们在github上的仓库 https://github.com/MTDATA/presto/commits/mt-0.60

实际使用效果
这里给出一个公司内部开放给分析师、PM、工程师进行自助查询的查询中心的一个测试报告。这里选取了平时的5000个Hive查询,通过Presto查询的对比见下面的表格。
Facebook的数据库查询引擎Presto在美团有哪些应用

感谢各位的阅读,以上就是“Facebook的数据库查询引擎Presto在美团有哪些应用”的内容了,经过本文的学习后,相信大家对Facebook的数据库查询引擎Presto在美团有哪些应用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Facebook的数据库查询引擎Presto在美团有哪些应用

本文链接: https://lsjlt.com/news/259505.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Facebook的数据库查询引擎Presto在美团有哪些应用
    这篇文章主要讲解了“Facebook的数据库查询引擎Presto在美团有哪些应用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Facebook的数据库查询引擎Presto在美团有哪些应用”吧...
    99+
    2023-06-10
  • mysql的数据库引擎有哪些特点
    MySQL的数据库引擎主要有以下几种特点: InnoDB引擎:InnoDB是MySQL默认的事务安全引擎,支持事务、行级锁以及外...
    99+
    2024-04-09
    mysql 数据库
  • AmazonAurora支持的数据库引擎有哪些
    Amazon Aurora支持的数据库引擎主要有MySQL和PostgreSQL。MySQL兼容性版本是5.6和5.7,同时还提供了...
    99+
    2024-04-09
    AmazonAurora 数据库
  • MySQL数据库存储引擎的分类有哪些
    这篇文章主要讲解了“MySQL数据库存储引擎的分类有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL数据库存储引擎的分类有哪些”吧!1、简介My...
    99+
    2024-04-02
  • 数据库中的查询方式有哪些
    数据库中的查询方式有以下几种:1. SQL查询语句:使用结构化查询语言(SQL)编写查询语句,包括SELECT、INSERT、UPD...
    99+
    2023-08-14
    数据库
  • thinkphp5查询数据库的方法有哪些
    本篇内容介绍了“thinkphp5查询数据库的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、使用模型进行查询模型是利用Thin...
    99+
    2023-07-06
  • sqlite数据库查询的方法有哪些
    sqlite数据库查询的方法主要有以下几种: SELECT语句:用于从数据库中检索数据。可以使用条件和排序来过滤和排序数据。 ...
    99+
    2024-04-09
    sqlite
  • MySQL数据库的存储引擎以及常用命令有哪些
    这篇文章主要介绍了MySQL数据库的存储引擎以及常用命令有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。  MySQL数据库的存储引擎有...
    99+
    2024-04-02
  • Facebook有哪些大数据处理架构及应用的软件
    这篇文章主要讲解了“Facebook有哪些大数据处理架构及应用的软件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Facebook有哪些大数据处理架构及应用的软件”吧!Facebook大数据...
    99+
    2023-06-10
  • MySQL数据库存储引擎主要有哪些特点及用处
    不知道大家之前对类似MySQL数据库存储引擎主要有哪些特点及用处的文章有无了解,今天我在这里给大家再简单的讲讲。感兴趣的话就一起来看看正文部分吧,相信看完MySQL数据库存储引擎主要有哪些特点及用处你一定会...
    99+
    2024-04-02
  • SQLServer数据库有哪些链接查询的方式
    本篇内容主要讲解“SQLServer数据库有哪些链接查询的方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SQLServer数据库有哪些链接查询的方式”吧! ...
    99+
    2024-04-02
  • 数据库查询性能需注意的有哪些
    这篇文章主要介绍“数据库查询性能需注意的有哪些”,在日常操作中,相信很多人在数据库查询性能需注意的有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”数据库查询性能需注意的有...
    99+
    2024-04-02
  • Laravel8优化数据库查询的技巧有哪些
    本篇内容介绍了“Laravel8优化数据库查询的技巧有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 检索大型数据集本提示主要侧重于...
    99+
    2023-07-04
  • 聚合函数在跨数据库查询中的应用
    在跨数据库查询中,聚合函数可以帮助我们对不同数据库中的数据进行统计和汇总。例如,我们可以通过聚合函数计算不同数据库中某个字段的平均值、总和、最大值、最小值等。这样就可以方便地获取跨数据库的数据统计信息,而不需要将数据先导入到同一个数据库中再...
    99+
    2024-08-03
    sql server
  • 数据库在计算机应用中的作用有哪些
    这篇文章将为大家详细讲解有关数据库在计算机应用中的作用有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。数据库在计算机应用中的作用是:1、实现数据共享;2、减少数据的冗余度;3、数据的独立性;4、数据实...
    99+
    2023-06-06
  • 数据库常用的索引类型有哪些
    常用的数据库索引类型包括:1. B-树索引:B-树(Balanced Tree)是一种平衡的多路搜索树,常用于关系型数据库中的索引结...
    99+
    2023-09-05
    数据库
  • 如何进行sqlserver isnull在数据库查询中的应用
    这篇文章给大家介绍如何进行sqlserver isnull在数据库查询中的应用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。isnull在数据库查询中的应用,特别是再语句连接的时候需要...
    99+
    2024-04-02
  • 数据库Join的应用场景有哪些
    数据库Join的应用场景有以下几种:1. 数据库查询:在进行复杂查询时,使用Join可以将多个表连接起来,通过关联字段匹配数据,以获...
    99+
    2023-09-27
    join 数据库
  • redis数据库的应用场景有哪些
    Redis数据库有以下应用场景:1. 缓存:由于Redis具有高速读取和写入的能力,可以用作缓存数据库,将热门的数据存储在Redis...
    99+
    2023-09-21
    redis数据库
  • HBase数据库的应用场景有哪些
    大规模数据存储和管理:HBase适用于存储和管理大规模数据集,如互联网应用中的用户数据、日志数据等。 实时数据分析和处理:H...
    99+
    2024-03-11
    Hbase
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作