关于presto:如何挖掘闲置硬件资源的潜力PrestoDB缓存加速实践小结

用户体验的谋求是有限的,而老本是无限的,如何均衡? 用户体验很重要,降本也很重要。做技术的都晓得,加机器堆资源能够解决绝大多数的用户感觉慢的问题,但要加钱。没什么用户体验是开发不了的,但要排期,实质也要钱。在老本无限,包含机器资源和开发人力都无限的状况下,如何晋升用户体验呢? 对于大数据查问引擎来说,用户体验的第一优先级是快,天下文治唯快不破。而缓存技术是很好的抉择,能够无效达到咱们的目标。 硬件上,咱们能够开掘服务器闲置资源的后劲。因为在cpu利用率的评估体系下,服务器的内存,本地磁盘可能有闲暇资源,可能挖掘出一些可用资源为咱们所用。 技术上,抉择开源社区大规模实际过的、有胜利案例的,收费的计划,能够升高开发成本,事倍功半。 PrestoDB社区的缓存计划就是一个很好的抉择。曾经在Meta公司(原Facebook)大规模落地实际过了,Uber也有落地;有源码和技术分享的材料;Alluxio社区也提供了很多反对。基于种种原因,咱们抉择应用该技术进行查问减速,官网Blog链接:https://prestodb.io/blog/2021/02/04/raptorx。 但即便有胜利案例,在外部落地时也会遇到各种问题,在不减少机器资源的前提下,查问工夫tp95提速超过1倍,其余查问速度指标也有50%到1倍的晋升。具体成果会在《从PrestoSQL到PrestoDB-Presto计算引擎版本升级小结》一文中具体介绍,详见链接:https://mp.weixin.qq.com/s/bPn8ncT_AXcPXbfAy6bAQw PrestoDB的查问机制PrestoDB查问数据的大略流程如图所示。缓存计划实质是将从内部服务获取的数据缓存在内存和本地硬盘中,缩小和内部零碎的交互,以提供更好的查问体验。 因为把有限的内部数据拉到了本地,缓存要思考数据有效性,容量管制,以及如何监控缓存的成果,即统计命中率。 利用缓存Hive MetaStore缓存查问一个一般的hive分区表,至多会有以下的读取元数据操作:获取表信息,获取满足过滤条件的分区名列表,依据分区的数量拆成几个并发线程,每个线程通过批量接口获取10到100个分区的分区信息。 当离线集群规模达到几千上万台,hive表会十分多,查问量也十分大。即便物理上拆分了若干个mysql数据库,若干个metastore服务,在拜访高峰期查问hive metastore也是一个较为耗时的操作。 下图是某集群获取表操作的均匀响应工夫(绿线)和p99响应工夫(橙线),能够看到即便是根本的获取表信息操作,在拜访顶峰时延时也会很高(Presto拜访元数据的默认超时工夫是10秒,超过10秒会重试三次,所以指标下限就是10秒)。 应用元数据缓存能够进步查问速度,缩小metastore的交互,升高meastore的拜访压力,但须要思考时效性问题,即如何感知元数据变动。 元数据缓存是PrestoDB晚期版本就有的性能,之前曾经在线上应用了。实现基于guava cache,将hive metastore的表,分区等元数据信息缓存在内存中,通过刷新工夫,过期工夫和缓存实体的下限数的配置来控制数据的有效性和容量下限。 对一个元数据实体来说,第一次查问会先从近程获取,之后从缓存中读取。当元数据被缓存的工夫达到刷新工夫,再次申请还是会从缓存中读取,但会启动异步线程从近程获取并更新缓存,这样能够兼顾查问性能和数据有效性。当数据被缓存的工夫超过过期工夫,再次申请会梗塞,直到从近程获取并更新缓存。当缓存实体达到下限(按实体类型各自计算),再次写入缓存会删掉最旧的。以前应用PrestoSql的时候,遇到过同步缓存的线程死锁,起因是同步元数据的代码里有获取其余元数据实体缓存的逻辑,比方loadPartitionByName会先调用getTable办法,如果表缓存过期了且同步线程用满了就可能产生死锁。PrestoDB新版本不会在同步代码里获取其余实体的缓存,所以没有这个问题。 在PrestoDB新版本中,新加了两个参数,设置只缓存分区信息,和查看分区版本性能。 前者是进步缓存的有效性,不缓存库,表这些轻量级的元数据信息,只缓存分区信息。后者是在获取分区名列表时,会获取带版本的分区名信息,应用分区缓存前先比拟分区的版本,版本统一才应用缓存。 但查看分区版本须要hive metastore有对应的接口,该性能并没有奉献给hive社区,PrestoDB社区版是用不了的。而只缓存分区信息,其实设计目标是配合查看分区版本来应用,独自应用仍然存在数据不统一的问题。思考到业务高峰期的申请延时,所以咱们决定缓存包含表信息在内的所有元数据。那元数据有变动时如何保障有效性呢?上面具体分析一下: 当元数据的变动是Presto引擎引起的,Presto能够主动清理掉发生变化元数据的缓存。还能够通过jconsole调用jmx接口清理掉缓存。除此之外,元数据过期只能等刷新和过期工夫,以及容量下限主动清理掉最旧的。 因为咱们hive表次要是Spark批工作写入的,所以Presto引擎无奈感知到元数据的变动。所以对表信息缓存来说,如果批改了表字段,如果存在缓存,可能要过段时间能力感知。对于分区名列表缓存,如果增加了新分区,也可能要过段时间能力感知。而如果分区产生了数据回溯,因为咱们的批工作没有写入分区的具体统计信息,并且咱们未开启应用分区元数据统计信息预过滤性能,所以分区元数据缓存不受影响。 综上所示,缓存了的表,分区名列表元数据要等缓存过期能力刷新。所以咱们须要严格保障元数据有效性的集群,比方做批工作数据品质校验的,就不开启元数据缓存。心愿进步查问性能承受短时间有效性延时的,开启缓存且只缓存10分钟。 在实践中,咱们遇到了业务方本人也缓存查问后果,引起缓存工夫放大的问题。当新增一个分区后,有时会较长时间能力查问到。为了解决该问题,咱们提供了清理指定表分区缓存的http接口,业务零碎本人晓得新增了,在清理本人查问后果缓存的同时也会调用接口清理Presto的分区缓存。这样就不会有缓存放大的问题了。 另外,在应用中还发现一个表分区太多引起的缓存刷新问题。 获取分区信息个别调用partitionCache的getAll办法一次获取一批partitons,但达到refreshAfterWrite工夫后,再次获取分区信息,partitionCache的getAll会触发线程池异步的批量调用load。如果分区很多,会产生大量申请单个分区的getPartition申请,给hive metastore造成了较大负载压力。有些业务查问的分区会越来越多,甚至一次要查7,8千个分区。因为由一次100个分区的批量接口变成了调用100次1个分区接口,这种表的分区缓存刷新会极大影响metastore的性能,造成所有拜访metastore的申请都变慢。见下图大量获取分区引起的查问毛刺。 这个问题实质是,google guava的refreshAfterWrite机制和loadAll办法有抵触,即后盾刷新机制和全量加载是有抵触的,为反对后盾刷新,全量加载进化为批量的load一个。 详见guava社区探讨:https://github.com/google/guava/issues/1975,guava社区至今未解决。 所以咱们在推动用户做数据治理,缩小查问分区数的同时,敞开了refreshAfterWrite性能,这样就不会有大量的getPartition申请了。 要留神的是一旦配置了超时工夫ttl,refresh-interval就不可为空了。能够将两者配置的一样来敞开后盾刷新性能。优化后的成果见下图,能够看到查问工夫大幅升高了,毛刺也缩小了。 将来咱们会持续优化,将获取分区列表和其余元数据的配置离开,分区列表是批操作不开启后盾刷新,其余元数据缓存开启。 数据文件列表缓存hive.file-status-cache前缀的配置,能够依据目录key缓存目录下的数据文件信息列表,反对配置作用于哪些表,对s3这种对象存储提速会更显著。 只有确定分区不会回溯重写数据的表能力配置这个,否则查问可能会报错。实际中发现咱们无奈做这个假如,所以未配置这个缓存。 本地数据缓存应用alluxio缓存HDFS数据。技术介绍能够浏览上面的链接: https://mp.weixin.qq.com/s/2txWX40aOZVcyfxRL8KLKA 应用时要留神几点:√ 首先,应用社区的PrestoDB版本,开启本地缓存性能,读数据会报错。起因是援用的社区版alluxio在schema中定义未定义file类型,而本地缓存的文件是file类型,须要在alluxio的源码里加上file类型,从新打包。√ 其次,PrestoDB为实现hdfs本地缓存,用反射形式批改了FileSystem cache的实现,所以配置里禁用FileSystem cache,运行时会报错。而对于har类型的归档文件,是必须要敞开cache,设置fs.har.impl.disable.cache=true的,否则har文件的读取会报错。须要批改PrestoDB获取FileSystem的代码。√ 再就是要思考调度的一致性,同一个数据块的查问尽量调用同一个worker节点,否则会占用太多本地存储,命中率还不高。监控发现在高峰期缓存命中率只有30%,须要优化调度参数。在调度章节会具体介绍。本地缓存个别放在ssd或更快的本地存储里。因为咱们服务器的ssd磁盘存储小的只有120GB,所以alluxio本地存储只配置了60G,但成果仍然很可观,单机的命中率有84%左右: 5分钟命中率图上面介绍一些有用的alluxio缓存实践经验: √ 指标名后缀对立指标项的名字相似,com.facebook.alluxio:name=Client.CacheShadowCacheBytesHit.presto-test-001_docker,type=counters,带着hostName后缀。而咱们的采集和展现规定须要指标名统一。所以设置presto启动参数alluxio.user.app.id=presto,来对立指标名。 √ 应用ShadowCache简略来说,这个性能是假如有有限的本地存储时,缓存命中率能达到多少。 Alluxio提供了一个Shadow Cache性能,能够应用布隆过滤器记录计算引擎拜访过哪些数据以及总数据量的大小。每次计算引擎拜访数据,都统计一次是否命中shadow cache中的数据。联合shadow cache和Alluxio的命中率能够检测业务是否适宜应用缓存。 统计shadow cache的命中率,如果较低,则阐明业务场景中极少会拜访反复数据,那么是不适宜应用缓存的。 如果shadow cache的命中率高,但Alluxio缓存的命中率低,阐明业务场景适宜应用缓存,然而以后Alluxio缓存的空间过小了。因为在数据文件被反复拜访时,之前存入Alluxio的缓存,曾经因为缓存满了而被淘汰了,所以反复拜访时将得不到任何减速。那么此时加大Alluxio缓存空间,即换个大硬盘,会获得更好的减速收益。 shadow cache命中率统计见下图: ...

May 19, 2023 · 1 min · jiezi

关于presto:探究Presto-SQL引擎4统计计数

作者:vivo互联网用户经营开发团队 -  Shuai Guangying 本篇文章介绍了统计计数的基本原理以及Presto的实现思路,准确统计和近似统计的细节及各种优缺点,并给出了统计计数在具体业务应用的倡议。 系列文章: 探索Presto SQL引擎(1)-巧用Antlr探索Presto SQL引擎(2)-浅析Join探索Presto SQL引擎(3)-代码生成一、背景 学习Hadoop时接触的第一个样例就是word count,即统计文本中词的数量。各种BI、营销产品中不可或缺的模块就是统计报表。在常见的搜寻分页模块,也须要提供总记录数。 统计在SQL引擎中堪称最根底、最外围的能力之一。可能因为它太根底了,就像排序一样,咱们经常会漠视它背地的原理。通常的计数是非常简单的,例如统计文本行数在linux零碎上一个wc命令就搞定了。 除了通常的计数,统计不反复元素个数的需要也十分常见,这种统计称为基数统计。对于Presto这种分布式SQL引擎,计数的实现原理值得深入研究,特地是基数统计。对于一般计数和基数计数,最典型的例子莫过于PV/UV。 二、基数统计次要算法 在SQL语法外面,基数统计对应到count(distinct  field)或者aprox_distinct()。通常做准确计数统计须要用到Set这种数据结构。通过Set不仅能够取得数量信息,还能不重不漏地获取每一个元素。 Set外部有两种实现实现原理:Hash和Tree。 在海量数据的前提下,Hash和Tree有一个致命的问题:内存耗费,而且随着数据量级的增长,内存耗费也是线性增长。 面对Set内存耗费的问题,通常有两种思路: 一种是选取其余内存占用更小的数据结构,例如bitmap;另一种是放弃准确,从数学上寻求近似解,典型的算法有Linear Count和HyperLogLog。2.1 Bitmap 在数据库畛域Bitmap并不是新事物,个别用作索引,称为位图索引。所谓位图索引,就是用一个bit位向量来记录某个字段值是否存在于对应的记录。它有一个前置条件:记录要有永恒的编号,相似于从1开始的自增主键。 2.1.1 位图向量的构建 举个例子,假如表user记录如下: 这是很典型的一张数据库表。对于表中的字段,如何构建位图索引呢?以age字段为例: S1: 确定字段的取值汇合空间:  {30,40,50}  一共3个选项。S2: 顺次为每个选项构建一个长度为6的bit向量,失去一个3*6的位图。3示意字段age的取值基数,6示意记录数。 S3:  基于表设置位图相应向量值。例如:age=30的记录id别离为{1,2,6},那么在向量1,2,6地位置为1,其余置为0。失去110001。 同理,对于name字段,其向量位图为: 能够看出,如果对于数据表的一个字段,如果记录数为n且字段的取值基数为m,那么会失去一个m*n的位图。 2.1.2 位图向量的利用 有了位图向量,该如何应用呢?假如查问SQL为 select count(1) from user where age=40; 则取age字段位图中age=40的向量:110001。统计其中1的个数,即可失去最终后果。 假如查问SQL更简单一些: select count(1) from user where age=40 and name='baz' 则取age字段位图中age=40的向量:110001和name='foo'的向量:100100。两个向量进行交加运算: 最初统计后果为1。  对于Bitmap的思维,笔者认为最奇妙的一点就是通过位运算实现了汇合运算。如下图所示: 在不同的业务场景中,这里的汇合能够赋予不同的业务含意。 2.1.3 位图向量的长处 ...

November 1, 2022 · 1 min · jiezi

关于presto:技能速成教你10分钟内在电脑上配置运行Hive-Metastore和Presto

作者:范斌;Alluxio开创成员、开源社区副总裁To 初学者: 本教程将领导初学者在本地服务器上通过搭建Presto和Hive Metastore来查问S3上的数据。Presto是用于打算和执行查问的SQL引擎,S3为表分区文件提供存储服务,而Hive Metastore是为Presto拜访表模式和地位信息提供catalog服务。本教程将展现如何一步一步装置并配置Presto和Hive MetaStore,从而查问存储在私有S3 bucket中的数据。 第一步:下载和启动Hive MetaStore本教程中咱们下载并应用 [apache-hive-2.3.7-bin.tar.gz],点击下载并解压Hive的二进制压缩包。 $ cd /path/to/tutorial/root$ wget https://downloads.apache.org/hive/hive-2.3.7/apache-hive-2.3.7-bin.tar.gz$ tar -zxf apache-hive-2.3.7-bin.tar.gz$ cd apache-hive-2.3.7-bin咱们只须要启动Hive Metastore来为Presto提供诸如表模式和分区地位等的catalog信息。 如果你是第一次启动Hive Metastore,请筹备好相应的配置文件和环境,同时初始化(initialize)一个新的Metastore。 $ export HIVE_HOME=`pwd`$ cp conf/hive-default.xml.template conf/hive-site.xml$ mkdir -p hcatalog/var/log/$ bin/schematool -dbType derby -initSchema须要配置Hive来拜访S3,能够在conf/hive-env.sh中增加以下几行。同时,Hive须要相应的jar包来拜访带有“s3a://”地址的文件,还须要AWS凭证来拜访S3 bucket(包含私有S3 bucket)。 export HIVE_AUX_JARS_PATH=${HADOOP_HOME}/share/hadoop/tools/lib/aws-java-sdk-core-1.10.6.jar:${HADOOP_HOME}/share/hadoop/tools/lib/aws-java-sdk-s3-1.10.6.jar:${HADOOP_HOME}/share/hadoop/tools/lib/hadoop-aws-2.8.4.jarexport AWS_ACCESS_KEY_ID=<Your AWS Access Key>export AWS_SECRET_ACCESS_KEY=<Your AWS Secret Key>如果你的Hadoop安装包中没有上述jar包,你也能够从maven central下载: <aws-java-sdk-core-1.10.6.jar>、<aws-java-sdk-s3-1.10.6.jar>、<hadoop-aws-2.8.4.jar> 启动Hive Metastore,它将在后盾运行并监听端口9083(默认端口)。 $ hcatalog/sbin/hcat_server.sh startStarted metastore server init, testing if initialized correctly...Metastore initialized successfully on port[9083].为了验证MetaStore是否在运行,请在 hcatalog/var/log/门路下查看Hive Metastore日志。 第二步:下载并启动Presto服务器在本教程中咱们以[0.237.1版本]服务器为例,点击链接,关上Presto服务器装置页面,下载并解压通过预编译的(pre-build),服务器压缩包。 ...

September 27, 2022 · 2 min · jiezi

关于presto:金山云团队分享-关于Presto如何与Alluxio搭配的测试

导语金山云-企业云团队(赵侃、李金辉)在交互查问场景下对Presto与Alluxio相结合进行了一系列测试,并总结了一些Presto搭配Alluxio应用的倡议。本次测试未应用对象存储,计算引擎与存储间的网络延时也比拟低。如果存储IO耗时和网络耗时较大时,Alluxio减速收益应会更显著。 测试目标验证影响Alluxio减速收益的各种因素记录Alluxio在合适条件下的减速体现总结Alluxio的应用倡议 测试环境集群部署架构图计算引擎应用Presto,数据源为Hive,Alluxio作为缓存。共搭建2个集群:Presto+Alluxio集群,Hadoop集群。 Presto+Alluxio集群配置机器:4台 linux虚拟机cpu/内存:32核 64G磁盘:60GB SSD + 200GB SSD网络:万兆带宽要害配置: Hadoop集群配置机器:5台 linux虚拟机cpu/内存:16核 32G磁盘:60GB HDD + 1200GB HDD网络:万兆带宽 测试用数据集列表测试应用的数据是tpc-ds规范数据集。因测试须要,咱们导入了多份不同大小的数据集。每份数据集里的表构造是完全相同的,区别是表中的数据量不同,局部表之间的分区也不雷同。 Alluxio强悍的减速体现首先咱们来看看,当提供了绝对合适的条件,Alluxio的具体减速体现。 以下查问的数据集是tpc-ds数据集tpcds_bin_partitioned_orc_100,整个数据集的大小为23.4G。以下执行的SQL是在tpc-ds提供的sql中选取7条满足条件的,试验中对7条SQL各重复查问10次,记录每次查问的耗时。每次查问之间距离8~10秒,给Alluxio的异步缓存肯定工夫,尽量进步下一次查问的命中率。 试验后果展现• 重点阐明 ○ 耗时的单位为ms。○ “avg”列的值是第2次查问至第10次查问耗时的平均数。○“first”列的值就是第1次查问的耗时。“减速收益”列的计算形式是:(first - avg) / first。 试验后果剖析第一次查问时,因为数据还没有被缓存,耗时是最高的,往后数据逐步被异步缓存入Alluxio,查问耗时逐步递加,等全量数据进入Alluxio缓存,此时减速收益达到最高,查问耗时最低且进行递加。咱们能够看到相较于耗时最大的first,avg的值有大幅度的升高,耗时仅有原来的20%~30%。从“减速收益”列来看能够更量化的评估减速收益。上面咱们验证一下对于影响Alluxio减速收益的具体因素。在上面的试验中,能够看到Alluxio在更适宜的环境下,甚至能够把查问耗时缩小到原来的5%。 影响减速收益的重要因素依据测试的后果,联合官网文档形容,总结出几点因素会对Alluxio减速收益产生影响。上面咱们就来看看这些因素重点阐明:这里说的Alluxio减速收益,指的是查问的耗时在减速后比减速前快了多少,并不单单是指IO那局部的耗时快了多少。更具象化的形容,它指的是单个查问在减速后的耗时比减速前升高了百分之多少。因素一:查问的Hive表的底层数据文件的大小和减速收益正相干 论断:查问的数据文件在小于约2MB时,文件越小,Alluxio减速收益越低。因文件过小,所以每个文件是一个split。Presto解析每个split创立driver,调度driver执行,这段耗时是不能被减速的,而operator扫描的数据太小,那么磁盘IO的耗时在整个耗时中占比就会较低,Alluxio对查问的减速收益就会升高。 在本次测试所应用的环境中,每个数据文件小于约50KB时,在查问的整体耗时上,减速收益会比拟低。 数据文件大于约2MB时,文件大小对减速收益的影响绝对不那么显著。 这个2MB和50KB只是在本环境中察看到的一个大略阈值,在不同环境中可能会有不同的体现。 验证:用一条简略的SQL进行测试【a. 试验用例阐明】 测试方法采纳雷同的SQL去查问5个tpcds数据集中的同名表,保障SQL复杂度雷同、表构造雷同,分区表的分区数雷同,仅仅是数据文件大小不同。 这里用一条简略的SQL语句重复屡次查问,记录每次查问的耗时。 select * from web_sales where ws_wholesale_cost=1。where条件字段ws_wholesale_cost并不是分区字段,所以会触发全表扫描。 在presto看到仅被划分出2个stage 本次试验查问的web_sales表在5个数据集中的相干元数据 ○ 对于分区表,因为数据文件较小,每个文件就是一个split。○ 为了有更清晰的比照,也引入了非分区表的查问,非分区表的数据文件数较少,每个数据文件大小均在100MB以上,Presto会依照HDFS文件块大小来划分split,每个split中的数据大略是28~38MB左右。 【b. 试验后果展现】 【c. 试验后果剖析】 ○ 当每个split的数据小于2MB时,减速收益会显著低一些。数据越小,减速收益越低,split的数据达到几十KB时,减速就很强劲了。○ 咱们看到当每个split的数据达到2MB时,减速收益和30MB的区别不大,阐明数据大于2MB后,数据大小对减速的影响就不大了。○ 上面咱们换一条SQL、换一张表再验证一次,能够看到论断是一样的。 验证:用tpcds中的Query55进行测试【a. 试验用例阐明】 query55中蕴含聚合、排序、大小表join,复杂度个别,presto会为其划分7个stage query55查问的事实表为store_sales。 store_sales表的相干元数据 【b.试验后果展现】 【c. 试验后果剖析】 ○ 论断跟上一次试验统一,当split的数据只有百来K的时候,减速收益比拟强劲,仅20%。○ split的数据大于2M以上,数据大小对减速收益的影响较小。 ...

June 23, 2022 · 1 min · jiezi

关于presto:技能速成教你10分钟内在电脑上配置运行Hive-Metastore和Presto

作者:范斌;Alluxio开创成员、开源社区副总裁To 初学者:本教程将领导初学者在本地服务器上通过搭建Presto和Hive Metastore来查问S3上的数据。Presto是用于打算和执行查问的SQL引擎,S3为表分区文件提供存储服务,而Hive Metastore是为Presto拜访表模式和地位信息提供catalog服务。本教程将展现如何一步一步装置并配置Presto和Hive MetaStore,从而查问存储在私有S3 bucket中的数据。 第一步:下载和启动Hive MetaStore本教程中咱们下载并应用 [apache-hive-2.3.7-bin.tar.gz],点击下载并解压Hive的二进制压缩包。 $ cd /path/to/tutorial/root$ wget https://downloads.apache.org/hive/hive-2.3.7/apache-hive-2.3.7-bin.tar.gz$ tar -zxf apache-hive-2.3.7-bin.tar.gz$ cd apache-hive-2.3.7-bin咱们只须要启动Hive Metastore来为Presto提供诸如表模式和分区地位等的catalog信息。 如果你是第一次启动Hive Metastore,请筹备好相应的配置文件和环境,同时初始化(initialize)一个新的Metastore。 $ export HIVE_HOME=`pwd`$ cp conf/hive-default.xml.template conf/hive-site.xml$ mkdir -p hcatalog/var/log/$ bin/schematool -dbType derby -initSchema须要配置Hive来拜访S3,能够在conf/hive-env.sh中增加以下几行。同时,Hive须要相应的jar包来拜访带有“s3a://”地址的文件,还须要AWS凭证来拜访S3 bucket(包含私有S3 bucket)。 export HIVE_AUX_JARS_PATH=${HADOOP_HOME}/share/hadoop/tools/lib/aws-java-sdk-core-1.10.6.jar:${HADOOP_HOME}/share/hadoop/tools/lib/aws-java-sdk-s3-1.10.6.jar:${HADOOP_HOME}/share/hadoop/tools/lib/hadoop-aws-2.8.4.jarexport AWS_ACCESS_KEY_ID=<Your AWS Access Key>export AWS_SECRET_ACCESS_KEY=<Your AWS Secret Key>如果你的Hadoop安装包中没有上述jar包,你也能够从maven central下载: <aws-java-sdk-core-1.10.6.jar>、<aws-java-sdk-s3-1.10.6.jar>、<hadoop-aws-2.8.4.jar>启动Hive Metastore,它将在后盾运行并监听端口9083(默认端口)。 $ hcatalog/sbin/hcat_server.sh startStarted metastore server init, testing if initialized correctly...Metastore initialized successfully on port[9083].为了验证MetaStore是否在运行,请在 hcatalog/var/log/门路下查看Hive Metastore日志。 第二步:下载并启动Presto服务器在本教程中咱们以[0.237.1版本]服务器为例,点击链接,关上Presto服务器装置页面,下载并解压通过预编译的(pre-build),服务器压缩包。 $ cd /path/to/tutorial/root$ wget https://repo1.maven.org/maven2/com/facebook/presto/presto-server/0.237.1/presto-server-0.237.1.tar.gz$ tar -zxf presto-server-0.237.1.tar.gz$ cd presto-server-0.237.1创立一个蕴含根本Presto配置的配置文件: etc/config.properties。 ...

June 17, 2022 · 2 min · jiezi

关于presto:Meta公司新探索-利用Alluxio数据缓存降低Presto延迟

概要速览Meta公司(前“Facebook公司”,下文统称“Meta”)的Presto团队始终在与Alluxio 单干为Presto提供开源数据缓存计划。该计划被用于Meta的多个用例,来升高从诸如HDFS等远端数据源扫描数据产生的查问提早。试验证实,应用Alluxio数据缓存后,查问提早和IO扫描都失去了显著优化。 咱们发现,Meta架构环境中的多个用例都得益于Alluxio数据缓存。以Meta的一个外部用例为例,其各分位的查问提早别离降落了33%(P50)、54%(P75)和48%(P95)。此外,远端数据源扫描数据的IO性能晋升了57%。 Presto架构Presto的架构容许存储和计算独立扩大,然而扫描远端存储中的数据可能会产生低廉的操作老本,也难以达到交互式查问的低提早要求。 Presto worker只负责对从独立(通常是远端)数据源扫描的数据执行查问打算片段,而不会存储任何远端数据源的数据,因而计算能够进行弹性扩大。 上面的架构图清晰地展现了从远端HDFS读取数据的门路。每个worker都会独立地从远端数据源中读取数据,本文将只探讨对远端数据源读取操作的优化。 Presto +数据缓存架构为了解决用例的亚秒级提早问题,咱们决定进行多种优化,其中一个重要的优化就是实现数据缓存。数据缓存作为一种传统的优化形式,能让工作数据集更凑近计算节点,缩小对远端存储的拜访,从而升高提早并节约IO开销。 其中的艰难在于,如果从远端数据源拜访PB级别的数据时没有固定拜访模式的话,如何能实现无效的数据缓存,此外,无效数据缓存的另一个要求是在Presto等分布式环境中实现数据的亲和性。 增加数据缓存性能后,Presto的架构如下所示: 对于数据缓存,前面会有更具体的阐明。 软亲和调度Presto目前的调度器在调配分片时曾经把worker的负载纳入考量,因而该调度策略使得工作负载在worker之间平均调配。但从数据本地性的角度来看,分片是随机调配的,不能保障任何亲和性,而亲和性恰好是实现无效数据缓存的必备条件。对Coordinator而言,每次把分片调配给同一个worker至关重要,因为该worker可能曾经缓存了分片所需的数据。 上图阐明了亲和性调度是如何给worker调配分片的。 执行软亲和调度策略时,会尽可能将同一个分片调配给同一个worker。软亲和调度器应用分片的哈希值来为分片抉择一个首选worker,软亲和调度器: ✓ 为分片计算其首选worke。如果首选worker有短缺的可用资源,那么调度器会把该分片调配给首选worker。✓ 如果首选worker处于繁忙状态,那么调度器就会抉择一个备选worker,如果该备选worker有短缺的可用资源,调度器就会把分片调配给它。✓ 如果备选worker也处于繁忙状态,那么调度器就会把分片调配给以后最闲暇的worker。 确定一个节点是否繁忙可通过两项配置来定义: ✓ 单节点最大分片数:node-scheduler.max-splits-per-node✓ 单任务最大待定分片(pending split)数: node-scheduler.max-pending-splits-per-task 当某一节点上的分片数超过上述任一配置的限度时,该节点就被视为繁忙节点。能够看出,节点亲和性对于缓存的有效性至关重要。如果没有节点亲和性,同一分片可能会在不同的工夫被不同的worker解决,这会导致冗余的分片数据缓存。 出于这个起因,如果亲和性调度器没能把分片调配给首选worker或者备选worker(因均处于繁忙状态),调度器就会向被调配的worker发出信号,让其不要缓存分片数据。这意味着只有分片的首选或备选worker才会缓存该分片的数据。 数据缓存Alluxio文件系统是一个常常用作Presto分布式缓存服务的开源数据编排零碎。为了在架构中实现亚秒级的查问提早,咱们心愿进一步升高Presto和Alluxio之间的通信开销。因而, Alluxio和Presto的外围团队进行单干, 从Alluxio服务中倒退出一个单节点的嵌入式缓存库。 具体而言,Presto worker通过规范的HDFS接口查问位于同一个JVM内的Alluxio本地缓存。当缓存命中时,Alluxio本地缓存间接从本地磁盘读取数据,并将缓存数据返回给Presto;否则,Alluxio将拜访远端数据源,并将数据缓存在本地磁盘上,以便后续查问。该缓存对Presto来说是齐全通明的。一旦缓存呈现问题(如本地磁盘产生故障),Presto还能够间接从远端数据源读取数据,该工作流程如下图所示: 本地缓存的外部形成和配置Alluxio数据缓存是位于Presto worker节点上的库,它提供了一种与HDFS兼容的接口“AlluxioCachingFileSystem” ,作为Presto worker进行所有数据拜访操作的次要接口。Alluxio数据缓存蕴含的设计选项有: 根本缓存单元依据Alluxio的教训以及Meta团队晚期的试验,以固定的数据块大小来进行数据读写和清理是最无效的。为了缩小元数据服务的存储和服务压力,Alluxio零碎中默认的缓存数据块大小为64MB。因为咱们采纳的Alluxio数据缓存只须要在本地治理数据和元数据,所以咱们大大调低了缓存的粒度,把默认缓存粒度设置成大小为1MB的 “page(页面)”。 缓存地位和层级Alluxio本地缓存默认将数据缓存到本地文件系统。每个缓存page作为独自的文件存储在目录下,目录构造如下:<BASE_DIR>/LOCAL/1048576/<BUCKET>/<PAGE> ✓ BASE_DIR是缓存存储的根目录,能够通过Presto的配置项 “cache.base-directory ”来设置。✓ LOCAL示意缓存存储类型为LOCAL(本地)。Alluxio也反对RocksDB作为缓存存储。✓ 1048576:代表数据块的大小为1MB。✓ BUCKET作为各种页面文件的bucket的目录。之所以创立bucket是为了确保繁多目录下不会有太多的文件,否则可能会导致性能很差。✓ PAGE代表以页面ID命名的文件。在Presto中,ID是文件名的md5哈希值。 线程并发每个Presto worker蕴含一组线程,每个线程执行不同的查问工作,但共享同一块数据缓存。因而,该Alluxio数据缓存须要具备跨线程的高并发度,以提供高吞吐量。也就是说,数据缓存须要容许多个线程并发地获取同一个page,同时还能在革除缓存数据时确保线程平安。 缓存复原当worker启动(或重启)时,Alluxio本地缓存会尝试复用曾经存在于本地缓存目录中的缓存数据。如果缓存目录构造是兼容的,则会复用已缓存数据。 监控Alluxio在执行各种缓存相干操作时,会输入各种JMX指标。通过这些指标,系统管理员能够轻松地监控整个集群的缓存应用状况。 基准测试咱们以运行在某个生产集群上的查问来进行基准测试,该集群被当作测试集群来应用。 查问数:17320集群大小:600个节点单节点最大缓存容量:460GB革除策略:LRU 缓存数据块大小:1MB, 意味着数据按1MB的大小读取、存储和革除。 查问执行工夫优化(单位:毫秒): 从表格中能够看出,查问提早有显著改善,其中P50的查问提早升高了33%,P75升高了54%,P95升高了48%。 开销节俭✓ Master分支执行过程的总数据读取大小:582 TB✓ 缓存分支执行过程的总数据读取大小:251 TB 节俭的扫描数据量:57%缓存命中率在试验过程中,缓存命中率根本稳固地放弃在较高的程度,少数工夫维持在 0.9 和 1 之间。两头可能是因为新查问扫描大量新数据的起因呈现了一些降落。咱们须要增加一些其余算法来防止出现拜访不太频繁的数据块相较于拜访频繁的数据块更容易被缓存的状况。 如何应用?应用数据缓存前,咱们要做的第一件事就是启用软亲和调度策略,数据缓存不反对随机节点调度策略。 要启用软亲和调度策略,在coordinator 中须要进行如下配置: ...

June 10, 2022 · 1 min · jiezi

关于presto:探究Presto-SQL引擎3代码生成

vivo 互联网服务器团队- Shuai Guangying探索Presto SQL引擎 系列:第1篇《探索Presto SQL引擎(1)-巧用Antlr》介绍了Antlr的根本用法以及如何应用Antlr4实现解析SQL查问CSV数据,在第2篇《探索Presto SQL引擎(2)-浅析Join》联合了Join的原理,以及Join的原理,在Presto中的思路。 本文是系列第3篇,介绍基于 Antlr 实现where条件的解析原理,并比照了间接解析与代码生成实现两种实现思路的性能,经试验基于代码生成的实现相比间接解析有 3 倍的性能晋升。 一、背景问题业务开发过程中,应用SQL进行数据筛选(where关键词)和关联(join关键词)是编写SQL语句实现业务需要最常见、最根底的能力。 在海量数据和响应工夫双重压力下,看似简略的数据筛选和关联在实现过程中面临十分多技术细节问题,在钻研解决这些问题过程中也诞生了十分乏味的数据结构和优化思维。比方B树、LSM树、列式存储、动静代码生成等。 对于Presto SQL引擎,布尔表达式的判断是实现where和join解决逻辑中十分根底的能力。 本文旨在探索 where 关键词的实现思路,探索where语句外部实现的基本思路以及性能优化的根本思维。以where语句为例:where筛选反对and 、or 和 not 三种根底逻辑,在三种根底逻辑的根底上,反对基于括号自定义优先级、表达式外部反对字段、函数调用。看似简略,实则别有洞天。值得深刻开掘学习。 二、应用 Antlr 实现 where 条件过滤对于Presto查问引擎,其整体架构如下: 其中,Parser&Analyzer就是Antlr的用武之地。任何的SQL语句,必须通过Parser&Analyzer这一步,所谓一夫当关万夫莫开。对于Antlr的背景及根底操作等内容,在《探索Antlr在Presto 引擎的利用》一文已有形容,不再赘述。 本文仍然采纳驱动Antlr的三板斧来实现SQL语句对where条件的反对。 对于where条件,首先拆解where条件最简略的构造: and 和or作为组合条件筛选的根本构造。 6大比拟运算符(大于,小于,等于,不等于,大于或等于,小于或等于)作为根本表达式。接下来就是应用 Antlr 的规范流程。 2.1 定义语法规定应用antlr定义语法规定如下 (该规定基于presto SQL语法裁剪,残缺定义可参考presto SelectBase.g4文件): querySpecification : SELECT selectItem (',' selectItem)* (FROM relation (',' relation)*)? (WHERE where=booleanExpression)? ;... booleanExpression : valueExpression predicate[$valueExpression.ctx]? #predicated | NOT booleanExpression #logicalNot | left=booleanExpression operator=AND right=booleanExpression #logicalBinary | left=booleanExpression operator=OR right=booleanExpression #logicalBinary ; predicate[ParserRuleContext value] : comparisonOperator right=valueExpression #comparison ; ...

June 7, 2022 · 7 min · jiezi

关于presto:探究Presto-SQL引擎2浅析Join

作者:vivo互联网技术-Shuai Guangying在《探索Presto SQL引擎(1)-巧用Antlr》中,咱们介绍了Antlr的根本用法以及如何应用Antlr4实现解析SQL查问CSV数据,更加深刻了解Presto查问引擎反对的SQL语法以及实现思路。 本次带来的是系列文章的第2篇,本文梳理了Join的原理,以及Join算法在Presto中的实现思路。通过实践和实际的联合,能够在了解原理的根底上,更加深刻了解Join算法在OLAP场景下的工程落地技巧,比方火山模型,列式存储,批量解决等思维的利用。 一、背景在业务开发中应用数据库,通常会有标准不容许过多表的Join。例如阿里巴巴开发手册中,有如下的规定: 【强制】超过三个表禁止Join。须要Join的字段,数据类型必须相对统一;多表关联查问时,保障被关联的字段须要有索引。阐明:即便双表Join也要留神表索引、SQL性能。在大数据数仓的建设中,只管咱们有星型构造和雪花构造,然而最终交付业务应用的大多是宽表。 能够看出业务应用数据库中的一个矛盾点:咱们须要Join来提供灵便的关联操作,然而又要尽量避免多表和大表Join带来的性能问题。这是为什么呢? 二、Join的基本原理在数据库中Join提供的语义是十分丰盛的。简略总结如下: 通常了解Join的实现原理,从Cross Join是最好的切入点,也就是所谓的笛卡尔积。对于汇合进行笛卡尔积运算,了解非常简单,就是穷举两个汇合中元素所有的组合状况。在数据库中,汇合就对应到数据表中的所有行(tuples),汇合中的元素就对应到单行(tuple)。所以实现Cross Join的算法也就跃然纸上了。 实现的代码样例如下: List<Tuple> r = newArrayList( new Tuple(newArrayList(1,"a")), new Tuple(newArrayList(2,"b"))); List<Tuple> s = newArrayList( new Tuple(newArrayList(3,"c")), new Tuple(newArrayList(4,"d"))); int cnt =0;for(Tuple ri:r){ for(Tuple si:s){ Tuple c = new Tuple().merge(ri).merge(si); System.out.println(++cnt+": "+ c); }}/** * out: 1: [1, a, 3, c] 2: [1, a, 4, d] 3: [2, b, 3, c] 4: [2, b, 4, d] */能够看出实现逻辑非常简单,就是两个For循环嵌套。 2.1 Nested Loop Join算法在这个根底上,实现Inner Join的第一个算法就顺其自然了。十分直白的名称:Nested Loop,实现关键点如下: ...

April 18, 2022 · 3 min · jiezi

关于presto:揭秘Presto+Alluxio-的N个核心黑魔法

能够给大家先简略介绍一下Presto,因为可能很多人是第一次接触这些大数据平台的技术。那Presto是什么呢? 其实它就是能查问大量、海量数据的一个SQL数据库,SQL数据库大家曾经见了很多了,MySQL、oracle这些都是SQL数据库。很多人可能也有领会,SQL是个很不便的查问数据的语言。那为什么要有Presto呢?首先如果你应用MySQL,oracle的话,你会发现它查一些小规模的数据,如果能够很容易命中的话,它是很快的。但如果说你要查海量的数据,比如说有几亿条或者几十亿条的时候,性能就一直的降落,而且如果你要做一个全表的扫描的话,这个对它们来说就是个劫难,可能它就会变得十分的慢。那这时候就有了Presto分布式的SQL大数据查问引擎,这就是Bin(范斌——Alluxio开创成员和VP of Open Source)之前提到的计算和存储拆散的计算引擎,它就不再像咱们传统的数据库那样治理存储,Presto不治理存储,它把存储交给了第三方平台,能够是HDFS也能够是GCS也能够是S3,什么都能够。Presto只管计算,那这样的一个状况下,咱们能够离开的scale up&down,而后达到解决海量数据的目标。 那当初是一个什么状况?我口说无凭,大家能够看网上的一些材料,互联网巨头的数据都是海量的,都是几十亿人的应用,这些互联网公司都是广泛采纳Presto来进行数据的查问,那这个大略是一个什么量呢?一个根本的Presto集群,可能是200~400的服务器的Presto集群,它一秒钟能够解决几十个B,也就是几百亿行的数据,如果看这种生产环境的Presto,咱们能够看到Presto一秒钟能够解决几百亿行的数据,这真的非常适合有海量数据的状况下来运行SQL的查问。方才也提到了, Presto是计算和存储拆散,大家都晓得互联网,尽管上网感觉如同到哪都很快,但其实是有间隔的。比如说明天咱们这个直播,大家可能看到,咱们两个人的视频就没有那么晦涩,为什么?因为咱们间隔有点远,从美国的硅谷到中国传输间隔很长,有很多的网关路由器,延时就在增长,而Presto没有本人的数据,要查问任何货色,都要把要查的数据集给读出来,都要给load进来,一行一行地扫描一遍,那速度就很依赖于网络传输的速度,其实这也是Presto的瓶颈之一。咱们能够把Alluxio和Presto或者其余的计算引擎部署到一起,它起到一个中间层的作用,就是说计算引擎只从Alluxio拿数据,而后Alluxio负责从理论的存储来拿数据。比如说咱们最右边的这个例子,这个是当初很多新兴的互联网公司或者新的守业公司最罕用的一个架构,它从守业第一天或者公司建设第一天起,数据就是齐全的上云,本人不必建数据中心了,这是当初十分常见的一个模式。那数据都在云上,计算怎么办?从云上拿数据其实一方面是费用高,另外一方面是速度可能会慢,那怎么办?咱们就通过Alluxio做一层缓存机制,如果数据在Alluxio集群里边,那咱们从Alluxio能够拿到,如果说没在,咱们的计算引擎也不必关怀,让Alluxio去云上把数据拿回来,起到一个提速的作用。 那有些敌人说咱们公司没上云,就是有一些数据中心。但很多公司的数据中心一个中央也放不下,很多公司可能是在北京有数据中心,西安有数据中心,杭州有数据中心,比如说西安的共事想跑一条计算,想跑一个SQL的查问,那怎么办?这个数据可能在杭州是吧?这又是一个异地的过程。它也是能够用Alluxio,Alluxio跟计算部署到一起,比如说计算Presto集群,500台服务器在西安,那咱们同样把Alluxio跟它部署到一起。计算引擎到Alluxio来拿数据,Alluxio负责到异地的数据中心来拿数据,而且有了这个架构之后,能够反对多个异地的数据中心,反正就是到Alluxio找数据,Alluxio负责帮你把数据给拿回来。这是两头的一个状况。那最左边这个状况其实是我亲身经历的一种状况。这个公司原本数据都是在本人数据中心里的Hadoop上,然而可能是机器不够用了,公司想上云那怎么办?因为云上的机器可能会更便宜,而且要新机器会更容易。其实很多公司会想是不是要把数据往云上copy一份,或者比如说计算是在云上的,那我是不是把数据往云上copy,然而这个费用或者说老本、耗时都会很大那怎么办?咱们云上的计算集群能够部署一个Alluxio,同样的情理做到提速。这个图就解决了长距离的,间隔增大了或者说异地的这种状况。当然咱们前面也会有一些具体的例子和数据,能够看到Alluxio会有减速,而且也不便拜访的这么一个过程。咱们上云也好,或者应用第三方的存储服务也好,对咱们的计算引擎也是一个挑战。其实对Presto和Spark还好,因为各种的object store基本上都还反对,然而如果说贵公司要是有很多种存储技术的话,那这个问题就有点麻烦了,能够通过Alluxio来做一个形象层,帮你集中管理、集中应用各种存储形式。因为当初很多公司也是有价格上的策略,可能不违心只局限于一种云的服务,对吧?或者它这个数据可能S3也放一点,GCP上也放一点,对吧?那其实就存在Bin方才提到的数据孤岛的问题,数据哪里都有,怎么办?真正的数据的使用者,不是那么关怀数据在哪,他只关怀这种逻辑层面上的数据的查问和拜访,并不关怀数据底层是一种什么模式存在的。所以说通过Alluxio来做一层形象,做一个隔离,这也加重计算引擎方面的累赘。那咱们搞这么一个形象层,一个layer在两头,有什么益处?那第一个益处就是快,为什么会快?因为后面提到了互联网也是有间隔的,网络有间隔,那咱们的Alluxio作为一个缓存层,它离计算引擎更近,甚至能够部署在一台机器上,数据的拜访读取的延时就会变得很低。其实快就解决了很多问题,如果有保护过大数据计算引擎的敌人就会晓得,速度一快整个零碎的吞吐量也会回升,稳定性也会回升,各方面都会有进步。其实快也不是速度这么简略,它还提供速度的稳定性。不晓得大家有没有遇到过,你用Presto的时候,同一条查问,可能明天须要5分钟,今天再运行一下两小时,它不稳固,为什么不稳固?一部分是网络延时的起因,一部分也是因为Presto有调度的问题,其余用户比拟多,或者你的优先级被调低了,所以不稳固。那这个不稳固带来很多劫难,咱们管它叫SLA。如果说你的用户是集体,他可能是个数据工程师或者是数据分析师,他原本一天要运行比如说10条SQL的查问,因为他要出报表,那他这个数不稳固,两小时没进去,可能要重试一下或怎么样,当天工作实现不了。如果说客户端是一个服务,如果延时不稳固,超过下限的话,那这个问题就更重大了。因为任何客户端都会有一个超时的设定,它间接就失败了。而且方才也提到了网络I/O是一个瓶颈,如果有Alluxio,它能帮你挡掉一些网络的传输,加重网络的累赘,带宽腾出来又能够干很多事,对Presto来说各种SQL的各种join的连贯,会变得更快。而且咱们不单是有这个看起来像是缓存的服务,而且咱们还有一些元数据的服务,叫 catalog service,而后咱们还有一些数据转换的服务。因为其实有的时候有些数据格式并不是那么利于查问,那能够做一些转换,比如说把csv转换成parquet,就更加利于计算引擎来做查问和剖析。这个图就是在讲Presto和Alluxio怎么工作,先看一下Presto没有Alluxio之前本人怎么工作。其实任何一个Presto查问分两步走,第一步先去Hive Metastore拿元数据。你不是给我一个table吗?那我就要看看这个table存在哪,这个元数据会给它一系列的地位,一个很长的列表,可能几百个,几千个甚至几万个几十万个都有可能,其实就是一些文件或者门路。Presto拿到这一系列门路之后,这里也没有什么黑魔法,就是Presto把这些数据给读出来,做计算看哪些数据合乎你的要求。 当咱们有了Alluxio之后,咱们会让元数据返回一个Alluxio地址,因为原本你可能是S3,HDFS,当初就是Alluxio了,咱们前面有个真正的黑魔法,待会再讲。那它给咱们一个Alluxio的table的门路,而后Presto就会拿这个门路去找Alluxio。你之前会把S3也好,HDFS也好,把它给挂载到了Alluxio,Alluxio晓得你要的是这个货色,因为咱们有元数据服务,而后咱们就晓得你是要这个文件,那Alluxio就会看,如果说我有,我就给你,我没有我去找底下的存储,把你要的数据给拿到。这里咱们其实有两个改变,一个就是元数据这里会有URL的变动,而后另外一个工作就是咱们须要挂载实在的存储,可能当初有些人会感觉这个如同有点麻烦,那么等下还会有个黑魔法。咱们也是在最近的这一两个版本中,退出了一个叫Transparent URI和主动挂载的性能,当初咱们不麻烦这个元数据和Hive Metastore给咱们一个更新了的地址,原来你是S3还是HDFS,你还是给我这个,所以说对于Hive Metastore来说,它齐全能够对Alluxio无感知。那等于说Presto还是拿到了S3的地址,咱们不必批改代码,咱们批改一下Presto的配置,把FS的默认实现换成Alluxio本人实现。就是当他看到这个是S3的,他会去Alluxio找,它会有一个主动挂载的机制,当时也会有一些配置,然而就一两行的配置加上之后,他本人到对应的S3 bucket上,把这个数据给挂载好。但对于咱们的Hive Metastore也好,对于咱们的这个Presto用户也好,都是无感知,因为它看起来这个表如同还在S3上或者在HDFS上,但实际上是到Alluxio这边走了一遭,如果说咱们这个缓存有命中,Alluxio有这个数据了,它就会有十分好的提速成果。 那咱们从用户角度会看到什么? 因为我后面讲了,Presto是存储和计算拆散的,它并不太治理存储空间,你在Presto建表的时候,建这种external table时,那其实在干嘛?它就是指定一个门路,通知Presto或者通知Hive Metastore,咱们这里建个表,这个表就是在某一个地位。那如果说你有了Alluxio的话,其实你在建表的时候就通知Presto,这个表是在这个中央,咱们是一个Alluxio打头的就好了。前面的这些工作全是其实都是由Presto和Alluxio来做的,用户的批改就曾经是非常少了。那有了Transparent URI后,其实批改能够更少,咱们都不必改原来的建表脚本,如果你原来有表,你是建在这个S3上,就不必动了,但如果你没建,你能够用这个命令,跟以前那个一般的S3也好还是HDFS也好都是截然不同的。而后你就在里边查问就好,你写任何一个SQL查问,你都不必管它的门路在哪,表一旦建好,对于一般的数据工程师或者数据设计师也好,他们晓得这个table内容其实就够用了,就能够从table拿到数据。那咱们再来就是略微介绍一下咱们的一些实在案例,让大家对咱们的提速过程有一个直观的意识。因为我也是亲自经营保护Presto好些年,我感觉我收到的最大的埋怨也好,投诉也好,就是你们怎么这么慢?这个查问我一天都没跑完,我一天工作都被你耽搁了。那怎么办?如果你也是在保护Presto,或者你们公司有Presto的话,试一试咱们的Alluxio caching,在进行一些简略的配置和优化之后,你会看到几倍的提速。这里顺便写是I/O密集型的查问,但如果说你真的经营Presto的话,你会发现大多数query都是I/O密集型拜访。咱们以前做了一个统计,90%的工夫都是花在扫表下面的,那应用Alluxio会给这些查问一个十分丑陋的提速。 而后你看这里特意强调小文件,这个小文件其实咱们前面还会有另外的直播,会讲这个元数据方面。它为什么会强调小文件,其实小文件的瓶颈,就有一部分从扫表变成了元数据的获取,因为后面讲了元数据给你一个文件列表,如果文件特地小,同样的数据量外面文件就会特地多,那它这个中央工夫就会耗费比拟长。对于这个案例,如果咱们没有开元数据缓存的话,其实提速没有5点几倍,如同是1点几倍还是多少倍,咱们开了这个元数据缓存之后,提速5.9倍。有趣味的敌人能够关注咱们的后续直播,咱们会有一个catalog service的直播。 那么这个是怎么实现的呢? 能够看咱们的左边的这个图,数据还是在这个S3上没有变动,对吧?这个图走漏很多信息,能够看到Alluxio和Presto有一个一一对应的关系。其实咱们就是这么部署的,咱们把每一个Presto worker和每一个Alluxio worker部署到一起,为什么部署到一起?这里我要提一下,这两个货色真的是天作之合,因为它资源的应用是错位的,Presto会比拟强调对CPU的应用,它要很多的CPU,它要很多的内存,然而Alluxio对CPU要的不多,对内存也没要多少,但它对磁盘要的很多。那你想一个物理机器,正好把它俩放一起。有敌人说这两个货色如同都要网络,怎么办?他俩在一起的话,如果能命中缓存,就不须要从里面拿,如果说没命中,那它俩也只有进来拿一份就好了,其实这个总量上还是没有晋升,如果缓存命中率高,其实网络的压力是大幅降落的,所以它俩单干就能够达到查问提速的成果。这个我的项目是咱们跟Facebook脸书的单干,这也是BIN跟我始终在跟的一个我的项目。其实这个数据有点激进,从他们最近一次跟咱们的讲座来看,他们是取得了10倍以上的晋升。那这个技术跟后面略有不同,后面是一个分布式的缓存的设计,那这里咱们管它叫Presto worker的local cache,略有不同,能够了解为一二级的缓存。那这个也是一样的逻辑,咱们如果命中了,咱们就本地拿给它,如果没命中就到近程去拿。这个我的项目在脸书曾经失去十分宽泛的应用,数以万计的服务器都在应用,具体的数字我可能不不便走漏,这些服务器都是应用咱们的local cache来做提速,而且咱们还会有不少的后续工作,其实咱们还有很大的后劲。 它的特点是,在图上也能看到local cache是运行在和Presto worker雷同的JVM外面。Presto读文件,无论从HDFS读也好,从S3读也好,你都读一个文件,那咱们有这个cache file system,就能够从咱们这边来读这个文件,也会有一个十分好的成果。从这个数据也能看到咱们进步了查问工夫的稳定性,咱们对p50,就是这个中位数进步33%,对p95,就是说95%的工夫的查问是48。慢的查问可能会有更好的成果,而且咱们还加重了很多网络的累赘,这个其实是很胜利的一个标记。他们的服务的稳定性和速度都失去很好的晋升。咱们还有更多的例子都在这里,十分多的公司都在跟咱们单干,他们都获得了称心的成果,这只是一部分,很多公司也还在跟咱们继续的单干,大家能够看底下这两个链接取得更多的信息,谢谢大家。

February 18, 2022 · 1 min · jiezi

关于presto:架构创新丨PrestoAlluxio-概览白皮书发布

为了满足当下和将来的需要,很多公司一直降级数据平台并开发可扩大的解决方案。从现有的实际来看,尽管Presto具备解决海量数据的能力,但其在跨工作流的数据拜访方面优化有余。因而,数据平台工程师还须要寻找其余的计划来解决数据冗余、易出错、性能迟缓、不稳固和高老本的问题。 为了解决这些挑战,咱们提出了一个翻新架构,倡议搭配部署Presto和Alluxio。Alluxio是一个数据编排平台,连贯计算框架和底层存储系统的。Presto和Alluxio的协同工作可实现对立、弱小、高性能、低提早和低成本的剖析架构。该架构不仅有利于剖析,而且有利于数据工作流各阶段的工作,包含数据导入、剖析和建模。这个架构反对跨本地、私有云、混合云和多云环境中的多个存储系统进行疾速 SQL 查问。 寰球泛滥公司曾经利用Alluxio来降级其以后的Presto平台,包含Facebook、TikTok、美国艺电(Electronic Arts)、沃尔玛、腾讯、康卡斯特(Comcast)等。他们把Alluxio 集成到Presto技术栈中,实现了很多好处。以下将介绍为何以及如何搭配应用Presto+Alluxio。

February 17, 2022 · 1 min · jiezi

关于presto:Presto-在字节跳动的内部实践与优化

在字节跳动外部,Presto 次要撑持了 Ad-hoc 查问、BI 可视化剖析、近实时查问剖析等场景,日查问量靠近 100 万条。本文是字节跳动数据平台 Presto 团队-软件工程师常鹏飞在 PrestoCon 2021 大会上的分享整顿。在字节跳动外部,Presto 次要撑持了 Ad-hoc 查问、BI 可视化剖析、近实时查问剖析等场景,日查问量靠近 100 万条。 • 功能性方面:齐全兼容 SparkSQL 语法,能够实现用户从 SparkSQL 到 Presto 的无感迁徙;• 性能方面:实现 Join Reorder,Runtime Filter 等优化,在 TPCDS1T 数据集上性能绝对社区版本晋升 80.5%;• 稳定性方面:首先,实现了多 Coordinator 架构,解决了 Presto 集群单 Coordinator 没有容灾能力的问题,将容灾复原工夫管制在 3s 以内;其次实现了基于 histogram 的动态规定和基于运行时状态的动静规定,能够无效进行集群的路由和限流;• 可运维性方面:实现了 History Server 性能,能够反对实时追踪单个 Query 的执行状况,总体察看集群的运行状况。 字节跳动 OLAP 数据引擎平台 Presto 部署应用状况过来几年,字节跳动的 OLAP 数据引擎经验了百花齐放到逐步收敛,再到畛域细分精细化经营优化的过程。 存储方面离线数据次要存储在 HDFS,业务数据以及线上日志类数据存储在 MQ 和 Kafka。 计算引擎依据业务类型不同,Presto 撑持了 Ad-hoc 查问、局部 BI 报表类查问,SparkSQL 负责超大体量简单剖析及离线 ETL、Flink 负责流式数据荡涤与导入。 ...

January 7, 2022 · 2 min · jiezi