ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Prestodb:RaptorX:构建速度提高10倍的Presto

2021-02-21 22:32:57  阅读:327  来源: 互联网

标签:10 缓存 Presto cache hive 01 2021 RaptorX


Prestodb:RaptorX:构建速度提高10倍的Presto

2021年2月4日

脸谱网:

阿米特·杜塔(Amit Dutta),巴尔迪普·希拉(Baldeep Hira),比斯瓦比什(Biswapesh Chattopadhyay),詹姆士·孙(Jaliang Sun),谭嘉亮,王珂,林柳,娜文·切鲁库里(Nikhil Collooru),彼得·纳,罗希特·贾因(Rohit Jain),萨克舍姆·萨赫杰夫(Sakky Sachdev),谢尔盖·佩尔辛(Sergey Pershin),石轩范,瓦伦·贾杰拉 阿尔卢西奥:范斌,贾加文,李浩远

Twitter:罗振晓

Pinterest:鹿牛

RaptorX是一个内部项目名称,旨在大大提高查询延迟,使其超出Vanilla Presto的能力范围。这篇博客文章介绍了分层缓存工作,这是RaptorX的关键构建块。有了缓存的支持,我们可以将查询性能提高10倍。这种新架构可以击败像Raptor这样的以性能为导向的连接器,并具有继续使用分类存储的额外好处。

分解存储的问题(Problems with Disaggregated Storage)

分解存储是整个行业朝着扩展存储和独立计算的趋势。它可以帮助云提供商降低成本。Presto本质上支持这种架构。可以从Presto服务器外部的远程存储节点流式传输数据。

但是,存储计算分解也给查询延迟带来了新的挑战,因为当网络饱和时,通过有线方式扫描大量数据将受到IO限制。而且,元数据路径也将通过导线来检索数据的位置。元数据RPC的几次往返可以很容易地将延迟提高到一秒以上。下图以橙色显示了Hive连接器的IO路径,每个路径都可能成为查询性能的瓶颈。
在这里插入图片描述

Presto架构

RaptorX:构建分层缓存解决方案

从历史上看,为解决网络饱和问题,Presto具有内置的Raptor连接器,可将数据从远程存储加载到本地SSD以进行快速访问。但是,此解决方案与拥有共享的计算/存储节点没有什么不同,这与存储-计算分解的想法背道而驰。不利之处很明显:要么浪费CPU,因为Worker中的SSD已满,要么浪费CPU,如果我们受CPU限制。因此,我们启动了RaptorX项目。

RaptorX是一个内部项目,旨在将Presto的查询性能提高至少10倍。分层缓存是RaptorX成功的关键。当存储节点与计算节点分离时,缓存特别有用。RaptorX的目标不是创建一个新的连接器或产品,而是一个内置的解决方案,以便现有工作负载可以从中无缝受益,而无需迁移。我们专门针对许多工作负载使用的现有Hive连接器。

下图显示了缓存解决方案的体系结构。我们具有缓存的分层层,在本文的其余部分中将详细介绍:

  • Metastore版本缓存:我们在协调器中缓存表/分区信息。鉴于元数据是易变的(例如Iceberg或Delta Lake),则对信息进行版本控制。我们仅将版本与Metastore同步,并在版本过时时获取更新的元数据。
  • 文件列表缓存:从远程存储分区目录缓存文件列表。
  • 片段结果缓存:将部分计算的结果缓存在叶子Worker的本地SSD上。需要修剪技术来简化查询计划,因为它们始终在变化。
  • 文件句柄和页脚缓存:在叶子worker内存中缓存打开的文件描述符和条带/文件页脚信息。这些数据通常在读取文件时经常访问。
  • Alluxio数据缓存:在叶子worker的本地SSD上缓存具有1MB对齐块的文件段。该库是从Alluxio的缓存服务构建的。
  • 相似性调度程序:一种调度程序,它根据文件路径向特定worker发送粘性请求,以最大程度地提高缓存命中率。
  • 在这里插入图片描述
    RaptorX架构

Metastore版本缓存

Presto协调器会缓存表元数据(模式,分区列表和分区信息),以避免长时间getPartitions调用Hive Metastore。但是,Hive表元数据是可变的。需要版本控制以确定缓存的元数据是否有效。为此,协调器将版本号附加到每个缓存键值对。收到读取请求时,协调器会要求Hive Metastore获取分区信息(如果根本没有缓存)或与Hive Metastore进行确认,以确认所缓存的信息是最新的。尽管无法避免往返Hive Metastore,但是与获取整个分区信息相比,版本匹配相对便宜。

文件列表缓存

Presto协调器将文件列表缓存在内存中,以避免长时间listFile调用远程存储。这只能应用于密封目录。对于开放分区,Presto将跳过缓存这些目录以确保数据新鲜度。开放分区的一个主要用例是满足近实时摄取和服务的需求。在这种情况下,提取引擎(例如微型批次)将继续将新文件写入打开的分区,以便Presto可以读取近乎实时的数据。压缩,Metastore更新或用于近实时摄取的复制之类的更多详细信息不在本说明的范围之内。

片段结果缓存

运行叶阶段的PrestoWorker可以决定将部分计算的结果缓存在本地SSD上。这是为了防止对多个查询重复计算。最典型的用例是使用扫描,过滤,项目和/或聚合的一级在叶阶段缓存计划片段。

例如,假设用户发送以下查询,其中ds是一个分区列:

SELECT SUM(col) FROM T WHERE ds BETWEEN '2021-01-01' AND '2021-01-03'

为每个部分计算总和2021-01-01,2021-01-02和2021-01-03分区(或更精确地相应文件)上形成“片段结果的”叶子的Worker被缓存。假设用户发送另一个查询:

SELECT sum(col) FROM T WHERE ds BETWEEN '2021-01-01' AND '2021-01-05'

随后,叶Worker将直接获取片段结果为2021-01-01,2021-01-02以及2021-01-03从缓存中,只是计算部分总和2021-01-04和2021-01-05。

请注意,片段结果基于叶查询片段,由于用户可以添加或删除过滤器或投影,因此该片段的灵活性很高。上面的示例显示我们仅使用分区列就可以轻松处理过滤器。为了避免由于频繁更改非分区列过滤器而导致的高速缓存未命中,我们引入了基于分区统计的修剪。考虑以下查询,其中时间是非分区列:

SELECT SUM(col) FROM T
WHERE ds BETWEEN '2021-01-01' AND '2021-01-05'
AND time > now() - INTERVAL '3' DAY

请注意,now()该函数的值一直在变化。如果叶子Worker根据now()的绝对值缓存计划片段,则几乎没有机会命中缓存。但是,如果谓词time > now() - INTERVAL '3' DAY对于大多数分区而言都是“宽松”条件,则可以在计划时间中从计划中剥离谓词。例如,如果今天是2021-01-04,我们知道partition ds = 2021-01-04,则谓词time > now() - INTERVAL '3' DAY始终为true。

更一般地,考虑下面的图中包含谓词和3个分区(A,B,C)与示出的统计信息的最小值和最大值。当partition stats域与谓词域(例如partition A)没有任何重叠时,我们可以直接修剪该分区,而无需将拆分发送给worker。如果分区统计信息完全由谓词域(例如Partition C)包含,则我们不需要此谓词,因为它对于此特定分区始终成立,因此在进行计划比较时可以剥离谓词。对于与谓词有些重叠的其他分区,我们必须使用给定的过滤器扫描该分区。
在这里插入图片描述
谓词修剪

文件描述符和页脚缓存

Presto worker将文件描述符缓存在内存中,以避免长时间openFile调用远程存储。同样,worker将常见的列文件和条带页脚缓存在内存中。当前支持的文件格式为ORC,DWRF和Parquet。之所以将此类信息缓存在内存中,是因为页脚的命中率很高,因为它们是数据本身的索引。

Alluxio数据缓存

在先前的文章中已经介绍了Alluxio数据缓存。弃用Raptor连接器是其主要功能。Presto Worker在读取时会将原始格式(压缩并可能加密)的远程存储数据缓存在本地SSD上。如果将来有读取请求涵盖了在本地SSD上可以找到的范围,则该请求将直接从本地SSD返回结果。缓存库是与Alluxio和Presto开源社区共同努力而建立的。

缓存机制将每个读取对齐为1MB块,其中1MB可配置为适应不同的存储功能。例如,假设Presto发出了一个以偏移量0开头的3MB长度的读取,然后Alluxio缓存检查磁盘上是否已经存在0-1MB,1-2 MB和2-3 MB的块,并且仅提取未缓存的块。清除策略基于LRU。它从最长时间未访问的磁盘中删除块。Alluxio数据缓存向Hive连接器公开了一个标准的Hadoop File System接口,将请求的块透明地存储在高性能,高度并发且容错的存储引擎中,该引擎旨在为Facebook规模的工作负载提供服务。

在这里插入图片描述
Alluxio数据缓存

软亲和力调度

为了最大程度地提高工作线程的高速缓存命中率,协调器需要将同一文件的请求调度到同一工作线程。因为很有可能文件的一部分已经缓存在该特定工作线程上。调度策略是“软”的,这意味着如果目标worker太忙或不可用,则调度程序将回退到其辅助选择worker进行缓存,或者在必要时仅跳过缓存。同以前的职位有调度策略的详细说明。调度策略可确保缓存不在关键路径上,但仍可以提高性能。

性能表现

RaptorX缓存已在Facebook内完全部署并经过了测试。为了将性能与Vanilla Presto进行比较,我们在114节点集群上运行了TPC-H基准测试。每个Worker都有一个1TB本地SSD,每个任务配置4个线程。我们在远程存储中准备了比例因子为100的TPC-H表。下图显示了Presto和Presto与分层缓存之间的比较。
在这里插入图片描述

Alluxio数据缓存

从基准来看,像Q1,Q6,Q12-Q16,Q19和Q22这样的扫描繁重或聚合繁重的查询都将延迟提高了10倍以上。甚至Q2,Q5,Q10或Q17之类的重连接查询也将延迟提高了3倍至5倍。

用户指南

为了完全启用此功能,需要为Workers提供本地SSD。要在本文中打开缓存的各个层,请相应地调整以下配置。

Scheduling(/catalog/hive.properties):

hive.node-selection-strategy=SOFT_AFFINITY
Metastore版本缓存(/catalog/hive.properties):

hive.partition-versioning-enabled=true
hive.metastore-cache-scope=PARTITION
hive.metastore-cache-ttl=2d
hive.metastore-refresh-interval=3d
hive.metastore-cache-maximum-size=10000000

List files cache(/catalog/hive.properties):

hive.file-status-cache-expire-time=24h
hive.file-status-cache-size=100000000
hive.file-status-cache-tables=*

Data cache(/catalog/hive.properties):

cache.enabled=true
cache.base-directory=file:///mnt/flash/data
cache.type=ALLUXIO
cache.alluxio.max-cache-size=1600GB

Fragment result cache(/config.properties和/catalog/hive.properties):

fragment-result-cache.enabled=true
fragment-result-cache.max-cached-entries=1000000
fragment-result-cache.base-directory=file:///mnt/flash/fragment
fragment-result-cache.cache-ttl=24h
hive.partition-statistics-based-optimization-enabled=true

File and stripe footer cache (/catalog/hive.properties):

对于ORC或DWRF:

hive.orc.file-tail-cache-enabled=true
hive.orc.file-tail-cache-size=100MB
hive.orc.file-tail-cache-ttl-since-last-access=6h
hive.orc.stripe-metadata-cache-enabled=true
hive.orc.stripe-footer-cache-size=100MB
hive.orc.stripe-footer-cache-ttl-since-last-access=6h
hive.orc.stripe-stream-cache-size=300MB
hive.orc.stripe-stream-cache-ttl-since-last-access=6h

对于 Parquet:

hive.parquet.metadata-cache-enabled=true
hive.parquet.metadata-cache-size=100MB
hive.parquet.metadata-cache-ttl-since-last-access=6h

原文地址:[https://prestodb.io/blog/2021/02/04/raptorx](https://prestodb.io/blog/2021/02/04/raptorx)

标签:10,缓存,Presto,cache,hive,01,2021,RaptorX
来源: https://blog.csdn.net/weixin_45091011/article/details/113924683

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有