Presto

Presto是一款适用于大数据的分布式SQL查询引擎,支持MongoDB、My SQL、Oracle、Postgre SQL、SQL Server连接器、TPCDS连接器、TPCH连接器,用户可以访问多种数据库查询资源,允许在外部MySQL数据库中查询和创建表,这可以用于在不同系统(如MySQL和Hive)之间或两个不同的MySQL实例之间联接数据,也允许将MongoDB用作Presto中的表;软件提供内置系统访问控制,系统访问控制插件会在任何连接器级别授权之前在全局级别强制执行授权,您可以使用Presto中的内置插件之一,也可以按照“系统访问控制”中的指南提供自己的插件,提供Presto验证程序,Presto Vefier是运行查询和验证正确的工具,它可以用于测试新的Presto版本是否产生正确的查询结果,或者用于测试成对的Presto查询是否具有相同的语义,在每个Presto版本中,都会运行Vefier以确保没有正确回归!

Presto软件功能

1、什么是PRESTO?

Presto是一个开放源代码的分布式SQL查询引擎,用于对大小从GB到PB的各种数据源运行交互式分析查询。

Presto是专为交互式分析而设计和编写的,可在扩展到Facebook之类的组织规模的同时,实现商业数据仓库的速度。

拥有和带动的Presto项目社区由支持 普雷斯托基金会,以开放,中立的治理一个的非营利组织,在托管的Linux基金会®。

2、它能做什么?

Presto允许查询数据存在的地方,包括Hive,Cassandra,关系数据库甚至专有数据存储。一个Presto查询可以合并来自多个来源的数据,从而可以在整个组织中进行分析。

Presto适用于期望响应时间从亚秒到数分钟不等的分析师。Presto打破了使用昂贵的商业解决方案进行快速分析或使用需要大量硬件的慢速“免费”解决方案之间的错误选择。

3、谁使用它?

Facebook使用Presto对多个内部数据存储(包括其300PB数据仓库)进行交互式查询。每天有1000多名Facebook员工使用Presto来运行30,000多个查询,每天总共扫描超过1 PB。

包括Airbnb和Dpbox在内的领先互联网公司都在使用Presto。

Presto软件特色

Presto是一种工具,旨在使用分布式查询来有效查询大量数据。如果您使用TB或PB的数据,则可能会使用与Hadoop和HDFS交互的工具。Presto旨在替代使用MapReduce作业的管道(例如Hive或Pig)查询HDFS的工具的替代方案,但Presto不仅限于访问HDFS。Presto可以并且已经扩展为可以在包括传统关系数据库和其他数据源(例如Cassandra)在内的各种数据源上运行。

Presto旨在处理数据仓库和分析:数据分析,汇总大量数据并生成报告。这些工作负载通常被归类为在线分析处理(OLAP)。

Presto使用说明

Presto定义了一个连接器API,该API允许Presto查询具有连接器实现的任何数据源。现有的连接器API提供了基本的谓词下推功能,允许连接器在基数据源上执行过滤。

但是,现有谓词下推功能存在一定的局限,限制了连接器的功能。可推送内容的表达受到限制,并且连接器根本无法更改计划的结构。

此图显示了计划程序和连接器交互过去的外观:

首先,Presto仅支持通过连接器提供的方法进行谓词下推。如果Presto需要下推一组作(例如pjection/ filter/ aggregation/ limit),则连接器需要支持几种方法:

这增加了创建和连接器的复杂。而且,正如我们稍后将要展示的,我们不仅要下推作,而且还希望将新作添加到查询计划中。当前的计划程序模型确实支持许多有用的连接器驱动的计划更改。

其次,可被下推的谓词和运算符的范围受到限制。只有可以由称为TupleDomain的数据结构表示的谓词才能下推。此数据结构仅支持AND谓词,该谓词确定变量/列是否在值集中(有范围或相等)。因此,没有办法描述诸如’A[1] IN (1, 2, 3)’或的复杂谓词‘A like ‘A Varchar %’’。

一种更灵活的方法是下推当前表示为象语法树(AST)的整个表达式。这种方法的一个问题是,AST会随着时间的推移而发展,例如添加新的语言功能时。此外,AST不包含类型以及执行功能解析的足够。

由于最近添加了动态功能注册,功能现在可以解析为不同的实现。动态函数注册允许用户编写自己的SQL函数。例如,当使用该函数的查询仍在运行时,用户可以在另一个会话中更新SQL函数的定义。如果要在调用时执行功能解析,那么最终可能在同一会话和查询中使用不同的实现。如果要支持实例化视图,则还需要确保数据读取器和写入器之间的函数版本一致。

我们通过将函数解析作为可序列化的形式存储在表达式表示本身中来解决此问题functionHandle。当我们重用包含该函数的表达式时,这可以一致地引用一个函数。

类型也存在类似的问题。连接器不能安全地依元数据来知道变量的类型。描述变量的元数据在执行期间可能不可用或已更改。

我们逐渐提高了Presto计划程序在0.217和0.229版本之间下推更具表现力的作的能力。我们还对连接器进行了相应的更新,使它们可以理解和作计划子树。

将计划子树暴露给连接器

Presto通过首先将其解析为象语法树(AST)来执行SQL查询。AST转换为逻辑计划树,该逻辑计划树表示查询中包含的关系代数。关系代数表示没有经过优化,并且缺少足够的物理布局来执行查询。

Presto使用优化器列表将逻辑计划转换为优化的物理计划。每个计划优化器都可以在整个计划树的子树上运行,并根据启发式或统计将其替换为更优化的子树。优化器可以保存在一组连接器提供手柄执行的物理(例如,ConnectorTableHandle,ConnectorTableLayoutHandle,ConnectorPartitionHandle,…)。

与其他某些SQL引擎不同,Presto并未明确设置逻辑计划和物理计划之间的边界。取而代之的是,有一些关键的优化器可以将逻辑计划转变为物理计划。

PickTableLayout并且AddExchanges是两个比较重要的优化器。

PickTableLayout通过调用连接器提供的API方法,计划谓词下推到表扫描中getTableLayout。它还用于从连接器获取物理布局。getTableLayout返回一个LayoutHandle,连接器将填充有关扫描将返回的数据结构的。Presto稍后将使用LayoutHandle来计划,优化和执行查询。

AddExchanges将数据改组(数据交换)运算符添加到查询执行中。此重要步骤确定如何并行执行查询执行,以及如何重新分配数据以在查询的每个阶段进行处理。Presto中的执行阶段通常是对分区键上的数据进行混洗,这是处理查询计划下一部分所需的。AddExchanges依从连接器返回的句柄来确定要添加到计划中的适当位置和交换类型。

依赖于PickTableLayout执行谓词下推和物理计划都是非常严格的,因为除了基本谓词下推之外,连接器无法修改计划。

现在,Presto允许连接器向Presto引擎提供优化规则,从而允许连接器引入任意优化。为了防止连接器提供的优化程序意外更改另一个连接器的子计划,存在一些限制:

1、暴露于presto-spi模块的PlanNodes。

2、属于连接器的PlanNodes。

满足上述规则的sub max树将被连接器提供的优化规则转换为更优化的形式:

注意,以上规则仅适用于maxSubPlan作为输入的优化器。如果优化器可以生成包含属于另一个连接器的节点的新计划,则连接器很有可能会出现(通常在视图扩展期间)。在这种情况下,TableScan可能正在从虚拟表中读取数据,这些表合并了来自多个不同数据源的数据。该TableScan虚拟表可以扩展到一个新的子树,从双方工会表扫描。扩展后,可以通过它们所属的连接器来处理新生成的计划节点的优化,从而可以实现最优化的子计划。

连接器规则将转换子最大计划树。在谓词下推的情况下(以MySQLConnector示例为例),连接器可以将MySQL可以作为SQL表达式处理的谓词保存在内部,MySQLConnectorLayoutHandle并返回一个TableScan节点。

引擎将在关键计划转换点应用连接器优化规则:

在逻辑计划上运行的所有规则将在AddExchange开始转换为物理计划之前应用一次。此时,我们可以扩展视图并进行许多作。

在优化周期结束时,稍后需要应用一些依赖于物理的优化。例如,我们可能只想将聚合的一部分下推到连接器中,以便仍然受益于并行执行。添加交换节点后,将拆分聚合阶段。

更具描述的表达语言

我们还将新的表示形式替换了基于AST的表达式表示形式RowExpression。RowExpression是完全的,可以在多个系统之间共享。新的表示形式有几种子类型:

安全的内部通讯

可以将Presto群集配置为使用安全通信。Presto节点之间的通信可以使用SSL / TLS进行保护。

内部SSL / TLS配置

SSL / TLS在config.pperties文件中配置。使用相同的属集配置工作节点和协调节点上的SSL / TLS。必须配置集群中的每个节点。尚未配置或配置不正确的节点将无法与集群中的其他节点通信。

要为Presto内部通信启用SSL / TLS,请执行以:

1、禁用HTTP端点。

http-.http.enabled = false

警告

您可以在启用HTTP的同时启用HTTPS。在大多数情况下,这是一个安全漏洞。如果确定要使用此配置,则应考虑使用防火墙将对HTTP终结点的访问限制为仅应允许使用该终结点的那些主机。

2、配置群集以使用群集节点的完全限定域名(fqdn)进行通信。可以通过以下两种方式之一完成此作:

如果DNS服务配置正确,我们可以让节点使用从系统配置()中获取的主机名将自己介绍给协调器。hostname –fqdn

node.internal-address-source = FQDN

也可以手动指定每个节点的标准主机名。每个主机都不同。主机应位于同一域中,以便轻松创建正确的SSL / TLS证书。如:coordinator.example.com,worker1.example.com,worker2.example.com。

node.internal-address = <节点fqdn>

生成Java密钥库文件。每个Presto节点必须能够连接到同一群集中的任何其他节点。可以使用每个主机的标准主机名为每个节点创建唯一的证书,创建一个包含所有主机的所有公钥的密钥库,并为客户端指定它(请参阅下面的步骤8)。在大多数情况下,如下所示在证书中使用通配符会更简单。

4、在Presto群集中分布Java密钥库文件。

5、启用HTTPS端点。

6、将发现u更改为HTTPS。

Discovery.u = https:// <协调器fqdn>:

7、配置内部通信以要求HTTPS。

内部通信。https.required = true

8、配置内部通信以使用Java密钥库文件。

内部通信.https.keystore.path = <密钥库路径>

内部通信.https.keystore.key = <密钥库密码>

与Kerbes的内部SSL / TLS通信

如果启用了Kerbes身份验证,则除了SSL / TLS属外,还要为内部通信指定有效的Kerbes凭据。

internal-communication.kerbes.enabled = true

注意

用于内部Kerbes验证的服务名称和密钥表文件从Kerbes验证属取,在记录的Kerbes,http..thentication.krb5.-name和http..thentication.krb5.keytab 分别。确保在工作程序节点上也已完成Kerbes设置。内部通信的Kerbes主体是通过http..thentication.krb5.-name将其附加了运行Presto的节点的主机名以及Kerbes配置中的默认领域后构建的 。

启用SSL / TLS的能

启用加密会影响能。能下降可能因环境,查询和并发而异。

对于不需要在Presto节点之间传输太多数据的查询(例如),能影响可以忽略不计。SELECT count(*) FROM table

但是,对于需要大量数据在节点之间传输的CPU密集型查询(例如,分布式联接,聚合和窗口函数,它们需要重新分区),对能的影响可能会很大。减速速度可能从10%到100%+不等,具体取决于网络流量和CPU使用率。

高级能调优

在某些情况下,更改随机数的来源将显着提高能。

默认情况下,TLS加密将/dev/urandom系统设备用作熵的来源。该设备的吞吐量有限,因此在具有高网络带宽的环境(例如InfiniBand)上,它可能成为瓶颈。在这种情况下,建议尝试SHA1PRNG通过http-.https.secure-random-algothm在config.pperties协调器和所有工作程序上的属设置随机数生成器算法,将其切换为,

http.https.secure-random-algothm = SHA1PRNG

请注意,此算法从阻止/dev/random设备获取初始种子。对于没有足够熵来播种SHAPRNG算法的环境,可以/dev/urandom 通过将java.secuty.egd属添加到来将源更改为jvm.config:

-Djava.secuty.egd =文件:/ dev / urandom

上一篇 2022-11-28

相关推荐

  • Presto

    Presto是一款适用于大数据的分布式SQL查询引擎,支持MongoDB、My SQL、Oracle、Postgre SQL、SQL Server连接器、TPCDS连接器、TP...
正在提交中,请稍等片刻...

发表回复

请登录后评论...
登录后才能评论

评论列表 (0条)