一个Presto衔接器是衔接Presto引擎与外部目录的插件。Presto衔接器可用于各种数据源,包括联系型数据库、NoSQL数据库和文件体系。

在本章中,您将学习怎么完结自界说衔接器。首要,咱们将描绘由Presto供给的服务供给者接口(SPI)的概念,该接口界说了在Presto中构建自界说衔接器、类型、函数和体系拜访操控的接口。

然后,咱们将重视衔接器的概念以及它在Presto中的完结办法。接下来,您将学习怎么完结自界说衔接器和一种依据Apache Thrift的代替完结,该完结能够在Presto和由Thrift支撑的任何言语编写的外部服务器之间进行通讯,例如Python、PHP等。

最后,咱们将专注于Apache Pinot,这是一个实时分布式数据存储,以及怎么将其衔接到Presto。

服务供给者接口(Service Provider Interface,简称SPI)

SPI(Service Provider Interface)是一个你能够运用的接口,用于经过第三方组件扩展结构。如图3-1所示,Presto完结了自己的SPI。Presto SPI坐落Presto服务器内部,担任办理Presto中心与外部服务供给者之间的通讯。

《Learning and Operating Presto 》第三章:衔接器

一个期望与Presto通讯的服务供给者有必要完结一个插件模块,该模块与Presto SPI进行交互。然后,Presto SPI经过API将由服务供给者完结的功用供给给Presto中心。

最流行的Presto插件包括衔接器、类型、函数和体系拜访操控。在本节的其余部分,咱们将对每个插件进行概述。有关更多具体信息,请参阅Presto文档。

  • 衔接器

衔接器使Presto能够与外部体系进行数据读写交互。正如咱们将看到的,衔接器担任向Presto揭露表元数据,如形式、表和列界说,以及将来自外部数据源的数据映射到Presto数据类型。

  • 类型

类型是一种插件,答应您在SQL言语中完结自界说数据类型。Presto现已界说了许多内置类型,例如BOOLEAN、INTEGER、VARCHAR等。并非一切衔接器都需要完结给定的数据类型。

  • 函数

Presto供给许多用于拜访数据的函数。示例函数包括数学函数、聚合函数、字符串函数等。经过编写自己的函数插件,您能够扩展可用函数的集合。

  • 体系拜访操控

Presto界说了一些拜访操控战略,答应您在Presto集群中界说具有不同特权的不同人物。您能够编写自界说插件来指定体系拜访操控。咱们将在第7章中要点重视这个方面。

衔接器架构

图3-2显现了Presto与衔接器之间调用的流程。当客户端在Presto中运转查询时,Presto和谐器经过检索每个衔接器的有关目录的有用元数据(Metadata API)来解析和剖析查询(Parser/Analyzer)。元数据包括可用表的列表、列界说等信息。然后,Presto和谐器经过询问Data Location API获取要发送给作业节点的各个块,规划怎么运转查询(Planner),优化查询,并界说怎么在作业节点之间分发查询(Scheduler)。作业节点在收到其块后经过查询目录(经过Data Stream API)来运转任务。查询的成果被安排并发送回和谐器,和谐器将其发送给客户端。

《Learning and Operating Presto 》第三章:衔接器

抢手衔接器

Presto供给许多衔接器,用于不同类型的目录,包括联系型和非联系型数据库、实时数据源以及其他目标存储体系,如Hadoop分布式文件体系(HDFS)。可用衔接器的列表不断增加;有关支撑的衔接器的更多具体信息,请参阅Presto文档。在本书中,咱们将要点重视三个衔接器:Thrift、Apache Pinot和Apache Hudi。咱们将在本章中介绍Thrift和Apache Pinot,而在第5章中介绍Apache Hudi。由于其重要性,咱们将在本章的一个独自部分中描绘Apache Pinot。表3-1供给了本书中运用的衔接器的扼要描绘。

《Learning and Operating Presto 》第三章:衔接器

在第2章中,咱们了解了怎么将衔接器插入Presto。只需在Presto装置目录的目录中增加一个名为mycatalog.properties的新装备文件到您的目录中。每个装备文件有必要至少界说目录称号(例如,connector.name=tpch)。

Thrift

Apache Thrift是一个用于构建可扩展跨言语服务的软件结构。描绘Apache Thrift及其架构超出了本书的规模。有关更多具体信息,您能够参阅Thrift的官方文档。但是,关于咱们的意图,只需知道Apache Thrift包括一个编译器,该编译器以接口界说言语(IDL)中界说的一些抽象数据类型作为输入。然后,编译器将生成与输入相关联的存根代码,支撑的任何言语,例如Python、PHP、Java等。运用生成的存根代码来完结您服务所需的任务。

假如您想要完结跨渠道的应用程序,Apache Thrift是一个十分有用的工具,由于它答应轻松创立相互通讯的服务和应用程序,而不受言语或渠道的限制。Thrift还专为高性能而设计,实际上十分易于运用和十分灵敏,由于您能够将其用于各种用处。

结合Thrift和Presto使您能够轻松地从Thrift支撑的任何言语调用Presto,使其成为开发可扩展、跨言语应用程序的抱负解决方案

Presto完结了Thrift衔接器,您能够像运用其他衔接器一样运用它。指向Presto和谐器的etc/catalogs/目录,并创立一个名为thrift.properties的文件,具有以下最小装备:

connector.name=my-thrift-connector
presto.thrift.client.addresses=host:port,host:port

除了衔接器称号外,还要界说由Thrift编译器生成的存根代码的主机地址列表。有关一切支撑的特点列表,请参阅Presto文档。

要完结Thrift服务,请从书的GitHub存储库(03/thrift/PrestoThriftService.thrift)下载Presto IDL服务,并将其放在文件体系的任何方位。然后运转以下指令生成存根代码:

thrift --gen java PrestoThriftService.thrift

该指令将在Java中生成存根代码。将关键字java更改为您喜爱的言语,以生成该言语的代码。您能够从书的GitHub存储库(03/thrift/thrift-stub-java目录)下载Java中的存根代码。

获得存根代码后,依据外部目录的要求完结服务。能够运用PrestoDB GitHub存储库上的presto-thrift-testing-server模块作为参阅。

编写自界说衔接器

假设您有一个专有数据库,而且期望将其衔接到Presto,但不幸的是,一切可用的Presto衔接器都与您的数据库不兼容。在这种情况下,最好的挑选是完结自己的衔接器,将您的数据库直接映射到Presto。

在本节中,您将学习怎么从头开端为Presto构建一个自界说衔接器。在高层次上,衔接器由四个首要组件组成:

  1. 插件和模块
  2. 装备
  3. 元数据
  4. 输入/输出

为了评论构成衔接器的组件,咱们将运用“示例HTTP衔接器”。这是一个根本的衔接器,经过HTTP读取CSV文件。您能够在PrestoDB GitHub存储库的presto-example-http模块下检查其源代码。

先决条件

由于Presto是用Java编写的,因而您有必要运用Java编写自界说衔接器。此外,由于Presto是作为规范Maven项目完结的,为了使您的衔接器项目正常作业,请装置Apache Maven。还要下载Presto JAR文件并将其包括在项目库中。可挑选运用IDE编辑代码。在本书中,咱们将运用IntelliJ IDEA。咱们建议运用IDE,由于它能够简化Maven项意图办理。假如您不运用IDE,请确保手动设置一切环境,包括JDK和所需的库。

要创立一个新项目,请发动IntelliJ IDEA或您喜爱的IDE,然后挑选File > New > Project > New Project。然后,填写表单,挑选Maven作为构建体系,然后单击Create。现在,将Presto库增加到您的项目中。假如您没有装置任何JDK,请挑选JDK > Download JDK,然后挑选版别1.8。

创立项目后,将Presto库增加到项目中。单击窗口左边的项目称号,然后挑选Open Module Settings > Libraries > > Java。从文件体系中挑选Presto JAR文件,然后单击OK。项目或许还需要其他外部库。经过挑选Open Module Settings > Libraries > > From Maven,然后搜索所需的库来增加它们。

要在IntelliJ IDEA中加载“示例HTTP衔接器”,请下载Presto源代码,并经过挑选File > New > Project > New Project from existing sources > Import project from external model > Maven 来加载它。

插件和模块

插件和模块指定了构成您衔接器的尖端类,使得Presto能够初始化您的目录。在“示例HTTP衔接器”中,参与此等级的首要类包括ExamplePlugin、ExampleConnectorFactory、ExampleModule、ExampleConnector和ExampleHandleResolver,如图3-3所示。

在图中,插件和模块等级触及的类显现为黑色方框。灰色方框显现了由这些类创立、装备、指向或回来的类。

《Learning and Operating Presto 》第三章:衔接器

ExamplePlugin

ExamplePlugin这个类完结了Presto Plugin接口,该接口告知Presto此插件具有哪些功用。由于这个示例是一个衔接器,ExamplePlugin只完结了getConnectorFactory()办法,并回来ExampleConnectorFactory。假如此插件完结了其他功用,如函数和类型,您应该经过其他办法在这里完结它们。

ExampleConnectorFactory

ConnectorFactory是一个基础接口,旨在为特定供给程序创立衔接器。ExampleConnectorFactory类完结了Presto ConnectorFactory接口,并供给以下根本类:

  • getName():回来衔接器的称号,例如 example-http。衔接器称号在Presto装置中唯一标识此衔接器。在创立Presto目录时,请运用此处界说的衔接器称号,如第2章所述。
  • getHandleResolver():创立一个新的ExampleHandleResolver目标,告知Presto运用哪些类来处理此衔接器。
  • create():创立运转衔接器所需的模块。

Presto运用Google Guice进行依靠注入。解说这个项目(以及一般的依靠注入)超出了本书的规模,但简而言之,您界说衔接器所需的模块(咱们将在下面看到),然后运用注入器创立其实例。Guice剖析模块以及需要哪些类,依据需要创立实例。Guice在发动时报告任何缺失的依靠联系,然后程序崩溃。有关更多具体信息,请参阅Guice项目文档。

ExampleModule

这个类完结了经过Google Guice界说的Module接口。在configure()办法中,您有必要装备运用Google Guice的任何类,如下所示:

public void configure(Binder binder)
{
  binder.bind(ExampleConnector.class).in(Scopes.SINGLETON);
  // 其他装备...
}

ExampleConnector

这个类完结了Presto Connector接口,并排出了衔接器支撑的功用。Presto运用以下四个目标实例化此类:LifeCycleManager,以及MetaData、SplitManager和RecordSetProvider接口的自界说完结。

ExampleConnector类完结了回来实例化目标的办法,以及开端业务和封闭业务的办法:

public class ExampleConnector implements Connector
{
 @Inject
 public ExampleConnector(
         LifeCycleManager lifeCycleManager,
         ExampleMetadata metadata,
         ExampleSplitManager splitManager,
         ExampleRecordSetProvider recordSetProvider){...}
 public ConnectorTransactionHandle
    beginTransaction(IsolationLevel isolationLevel, boolean readOnly){...}
 public ConnectorMetadata
    getMetadata(ConnectorTransactionHandle transactionHandle){...}
 public ConnectorSplitManager getSplitManager(){...}
 public ConnectorRecordSetProvider getRecordSetProvider(){...}
 public final void shutdown(){...}
}

在结构函数前的@Inject装修符告知Google Guice将该类增加到注入的依靠项中。

ExampleHandleResolver

这个类完结了Presto ConnectorHandleResolver接口,被Presto用于确认完结的处理程序。最少,用户有必要供给以下处理程序的完结:ConnectorTableHandle、ConnectorTableLayoutHandle、ColumnHandle、ConnectorTransactionHandle 和 ConnectorSplit。这些类稍后在本节中会有更具体的解说。

关于每个完结的处理程序,ExampleHandleResolver有必要界说一个回来它的办法:

@Override
public Class<? extends ConnectorTableHandle> getTableHandleClass()
{
    return ExampleTableHandle.class;
}

装备

装备包括用于指定目录装备的类,例如外部数据库的URL和凭据,以及会话特点。一般,您会看到与装备相关的三种Presto类:衔接器特点(ExampleConfig)、会话特点(SessionProperties)和表特点(TableProperties)。

ExampleConfig

衔接器特点供给由您的衔接器运用的静态信息,一般是衔接信息,如URI和登录信息。ExampleConfig类界说了在Presto的目录装备文件(例如example-http.properties)中运用的设置和获取特点的办法。

Example HTTP衔接器界说了ExampleConfig类以完结衔接器的特点。例如,要设置名为metadata-uri的特点,ExampleConfig类界说了以下办法:

@Config("metadata-uri")
public ExampleConfig setMetadata(URI metadata)
{
  this.metadata = metadata;
  return this;
}

@Config注解指定了要在example-http.properties中设置的特点称号,而getter上的其他注解能够对值强制执行限制。例如,@NotNull告知Presto此装备值不能为空,或许@Size(min = 1)强制用户不能设置小于1的任何值。

SessionProperties

会话特点是由用户为每个客户端会话指定的项目,一般用于依据用户想要运转的查询类型调整装备设置或启用试验性功用。经过Shell设置会话特点如下:

SET SESSION connectorname.propertyname = 'value';

Example HTTP衔接器没有界说任何会话特点。但是,为了了解会话特点的作业原理,咱们界说了一个简单的会话特点LOG_VERBOSITY,假如设置为true,则启用日志。

ExampleSessionProperties的结构函数创立了一切可用特点的列表。每个特点都有一个称号、描绘、SQL数据类型、Java数据类型、默认值、会话特点是否隐藏以及编码器/解码器函数。例如,创立LOG_VERBOSITY会话特点如下:

PropertyMetadata<Boolean> s1 = booleanProperty(
 LOG_VERBOSITY,
 "Set to true to enable log verbosity.",
 true,
 false);

您能够运用PropertyMetadata结构函数创立特点。为了检查是否启用LOG_VERBOSITY会话特点,ExampleSessionProperties界说了以下办法:

public static boolean isLogVerbosityEnabled(ConnectorSession session)
{
  return session.getProperty(LOG_VERBOSITY, Boolean.class);
}

TableProperties

表特点是附加到您外部体系的特定表的特点,例如用于指定表怎么分区的特点。表特点类的结构类似于会话特点(检查Hive衔接器界说的HiveTableProperties的示例,以了解其结构)。

在WITH子句中运用表特点进行表界说:

CREATE TABLE foo (a BIGINT)
WITH
(
 myTableProperty = 'value',
 myOtherTableProperty = 'othervalue'
);

元数据

元数据包括界说数据模型的类,以及向Presto揭露数据模型的处理程序。此外,为了办理数据模型及其处理程序,您有必要完结两个类:Metadata 和 Client。图3-4显现了在Example HTTP衔接器的元数据等级触及的首要类。

《Learning and Operating Presto 》第三章:衔接器

ExampleClient包括一个表明数据模型的Supplier映射。咱们将在本章后面看到数据模型的具体信息。ExampleMetadata包括对ExampleClient的指针,并在需要时创立ExampleTableLayoutHandle、ExampleTableHandle和ExampleColumnHandle的新实例。

数据模型

Presto运用联系模型表明数据;因而,每个Presto衔接器有必要经过联系模型揭露数据,尽管衔接器供给的数据的原始表明或许是不同的。联系模型以形式、表和列的形式表明数据。每个形式能够有一个或多个表,每个表能够有一个或多个列。每个表的实际数据能够存储在一个或多个物理目标中。

在您的衔接器中,您有必要至少界说Table和Column类作为带有@JsonCreator注解的一般Java目标(POJOs)。这个注解被Presto用于将POJO序列化为JSON目标,在和谐器和作业节点之间传递。

处理程序

为了使Presto拜访数据模型的类,您还有必要完结它们的相关处理程序,这些处理程序是Presto在其处理中运用的类,例如解析、计划等:TableHandle、ColumnHandle 和 TableLayoutHandle。

图3-5显现了在Example HTTP衔接器中检索表处理程序的调用流程。

《Learning and Operating Presto 》第三章:衔接器

用户经过调用ExampleMetadata目标的getTableHandle()办法发动流程,指定要检索ExampleTableHandle的形式和表名。存储指向ExampleClient目标的指针的ExampleMetadata目标将此调用转换为对ExampleClient目标的getTable()办法的调用。ExampleClient目标提取ExampleTable并将其回来给ExampleMetadata目标,以检查回来的目标是否为null。假如不为null,ExampleMetadata目标将创立ExampleTableHandle的新实例并将其回来给客户端。

ExampleMetadata

该类完结了ConnectorMetadata接口,该接口包括将形式、表和列信息暴露给Presto的一切办法。依据您将外部体系建模为Presto的联系模型的办法,完结这些办法中的每一个。

ExampleClient

该类完结了获取形式、表和列界说的功用。在Example HTTP衔接器中,由于它是一个示例衔接器,该类的完结相当轻量级。在实际的衔接器中,您的客户端一般会对外部体系进行API调用,将其元数据模型映射到Presto的联系元数据模型。如图3-4所示,ExampleClient保护一个映射来表明目录的逻辑结构。

输入/输出

输入/输出指的是从外部体系读取和/或将数据写入Presto的类。

在概念上,要从表中读取记载,首要将表扫描拆分为多个可由Presto作业节点并行运转的拆分目标。然后,关于每个拆分,为拆分创立一个记载集,记载集包括一个游标,该游标迭代传递给Presto的数据行。

图3-6显现了在Example HTTP衔接器的输入/输出等级触及的首要类,这些类仅完结了读取操作。

《Learning and Operating Presto 》第三章:衔接器

ExampleSplitManager创立了N个ExampleSplit目标,其间N是表中源的数量。关于每个拆分,ExampleRecordSetProvider创立一个新的ExampleRecordSet。每个ExampleRecordSet目标保护一个指向其关联的ExampleSplit的指针。此外,每个ExampleRecordSet目标创立一个新的ExampleRecordCursor目标,执行从表中进行的原始读取操作。

ExampleSplitManager

该类完结了ConnectorSplitManager接口,具有一个办法getSplits(),该办法指定了怎么将衔接器供给的表拆分为多个能够由Presto作业节点并行读取的部分。此办法的输入包括ConnectorSession(可用于拜访会话特点)、正在扫描的TableLayoutHandle和上下文。Presto获取getSplits()办法回来的拆分,并将它们传递给RecordSetProvider。

ExampleSplit

该类完结了ConnectorSplit接口,与整个表的特定块相关联。与元数据类一样,它是一个包括形式、表和要读取的URI的Jackson POJO目标。

ExampleRecordSetProvider 和 ExampleRecordSet

这个ExampleRecordSetProvider完结了ConnectorRecordSetProvider接口,并经过getRecordSet()办法从给定的拆分创立一个RecordSet。它还包括一个列的列表,这些列估计将从表中读取并出现在记载集中。这些列的列表或许是用户经过SELECT *等办法挑选的列。

ExampleRecordSet完结了RecordSet接口,用于实例化一个ExampleRecordCursor,该游标在拆分上进行迭代以供给数据行。

ExampleRecordCursor

这个类完结了RecordCursor接口,执行原始的读取操作。Example HTTP衔接器读取CSV文件。因而,ExampleRecordCursor类有必要完结迭代文件的列和行以回来所需值的办法。

当实例化一个ExampleRecordCursor目标时,它将源文件的一切行加载到字符串迭代器中:

public ExampleRecordCursor(
  List<ExampleColumnHandle> columnHandles,
  ByteSource byteSource)
{
  ...
  lines = byteSource.asCharSource(UTF_8).readLines().iterator();
  ...
}

依据要执行的操作,ExampleRecordCursor迭代此迭代器以提取所需的信息。例如,在读取CSV文件时,运用以下办法前进到下一个方位:

public boolean advanceNextPosition()
{
    if (!lines.hasNext()) {
        return false;
    }
    String line = lines.next();
    fields = LINE_SPLITTER.splitToList(line);
    return true;
}

LINE_SPLITTER目标是ExampleRecordCursor的静态成员,简单地分隔行的列:

private static final Splitter LINE_SPLITTER = Splitter.on(",").trimResults();

布置您的衔接器

要布置您的衔接器,请运用Maven运用presto-plugin打包构建您的项目。要装备pom.xml文件,请检查presto-example-http项意图pom.xml文件,并将其用作起点,依据需要修正项目称号和依靠项。 构建项目有两种挑选:运用指令行或运用IntelliJ。当运用指令行中的Maven时,只需从项目目录运转以下指令:mvn package。假如运用IntelliJ,请按照以下过程操作:

  1. 在项目右侧打开Maven Projects侧边栏。
  2. 挑选您的项目并导航到生命周期部分。
  3. 双击package。

构建完结后,将生成的target文件夹及其内容复制到Presto装置插件目录。然后,在etc/catalogs目录中增加衔接器的目录,并重新发动Presto。

Apache Pinot

Apache Pinot,简称Pinot,是一个实时分布式在线剖析处理(OLAP)数据存储,旨在供给超低延迟的剖析,即使在处理极高吞吐量时也是如此。您能够运用Pinot吸取各种数据源,包括实时数据源(如Apache Kafka)和批量数据源(如Hadoop HDFS)。在实时剖析场景中,Pinot是数据湖架构的组件之一,一般衔接到Amazon S3存储桶。咱们将在第5章介绍怎么设置数据湖架构。

本章要点介绍Apache Pinot,由于它十分适合触及高维数据的实时用例。此外,Pinot的快速查询才能使其成为Presto的抱负数据源。因而,当Pinot和Presto一同运用时,它们供给了一个强壮的渠道,用于对大规模数据集进行快速高效的剖析查询。

Presto供给了与Pinot的衔接器。在本节中,咱们将看到怎么装备Pinot与Presto一同运用。本书不包括Pinot及其架构的具体说明。您能够参阅Pinot的官方文档获取更多具体信息。

设置和装备Presto

Pinot既不供给完整的ANSI SQL支撑,也不供给类似ODBC/JDBC的规范数据库拜访API支撑。衔接Pinot到Presto弥补了这个缺乏,由于用户能够运用Presto功用拜访Pinot,包括ANSI SQL和ODBC/JDBC支撑。

此外,将Presto衔接到Pinot有两个优点:

  1. 能够在Pinot中运用相同的SQL代码,也能够在数据湖架构或其他数据源中运用。例如,您或许期望在新的实时数据上运转查询,然后在湖屋中的历史数据上运转相同的查询(即“一条SQL规则它们一切”)。
  2. 跨Pinot和另一个数据源的联合查询供给更多的相关性或洞察力。

设置Pinot

咱们将Pinot装备为在第2章中布置的Kubernetes集群的一个节点。为了在本地机器中保留资源,咱们将在单个节点上布置Pinot。在实际的生产环境中,Pinot会布置在一个节点集群中。 本节中运用的代码坐落目录03/presto-and-pinot中,其间包括Pinot装备文件和Presto装备文件。

装备Pinot

Pinot由四个首要模块组成:操控器(controller)、代理(broker)、服务器(servers)和Zookeeper。每个模块的具体描绘超出了本书的规模。关于本书而言,知道这些模块在一个集群中安排,而且操控器是和谐器,类似于Presto中的Presto和谐器即可。

要在本地机器上布置Pinot,请按照官方Pinot文档的说明进行。但是,假如您的机器上没有满足的资源(至少16 GB的RAM)同时运转Pinot和Presto,请按照本节中的过程进行操作。该过程描绘了怎么在单个Pod中布置一切Pinot模块(pinot-deployment.yaml):

apiVersion: v1
kind: ReplicationController
metadata:
  name: pinot
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: pinot
    spec:
      containers:
        - name: pinot
          image: apachepinot/pinot:latest
          command: ["/opt/pinot/bin/pinot-admin.sh"]
          args: ["QuickStart", "-type", "batch"]
          ports:
            - containerPort: 9000
          resources:
            requests:
              memory: "2Gi"
            limits:
              memory: "2Gi"

运用ReplicationController来布置Pinot集群。在装置了apachepinot/pinot:latest镜像之后,脚本会运转指令/opt/pinot/bin/pinot-admin.sh QuickStart -type batch,该指令装置一切组件并向数据库增加一些示例表。有关具体信息和示例,请参阅官方文档。依据您机器的要求,调整资源在resources部分的设置。

运用Presto装备Pinot

为了使Presto与Pinot合作运用,将Pinot增加为Presto装备中的新目录。在presto-config-map.yaml中增加一个新条目:

 pinot.properties: |
    connector.name=pinot
    pinot.controller-urls=pinot:9000
    pinot.controller-rest-service=pinot:9000

请参阅Presto文档获取额定的装备选项。

为了在和谐器和作业节点中运用Pinot目录,将以下条目增加到presto-coordinator.yaml和presto-workers.yaml中的volumeMount:

 containers:
 - name:
   volumeMounts:
    - name: pinot
      mountPath: "/opt/presto/etc/catalog/pinot.properties"
      subPath: pinot.properties
 ...
volumes:
 - name: pinot
   configMap:
     name: presto-config
     items:
     - key: "pinot.properties"
       path: "pinot.properties"

Presto-Pinot查询实例

现在装备现已完结,咱们将运转两个样例查询。运用Presto和谐器中供给的Presto客户端来运转查询。

首要,列出Pinot中一切可用的表:

presto> show tables from pinot.default;
          Table
-------------------------
 airlinestats
 baseballstats
 billing
 dimbaseballteams
 githubcomplextypeevents
 githubevents
 starbucksstores
(7 rows)

运用baseballstats表进行下一个查询。为了了解Presto怎么运转查询,请在查询之前运用EXPLAIN运算符。例如,要列出表中每个球员称号重复的次数,请运转以下查询:

EXPLAIN
SELECT playerName, count(1)
FROM pinot.default.baseballStats
GROUP BY playerName;

该指令生成一个包括对Presto组件的嵌套调用的长日志。Presto将查询从上层(TableScan)传达到底层(PinotColumnHandle和GeneratedPinotQuery)。以下代码片段显现了伪代码中的调用流程:

TableScan ->
 TableHandle ->
  expectedColumnHandles ->
   PinotColumnHandle{columnName="playerName", ...}
   PinotColumnHandle{columnName="count", ...}
  layout ->
   PinotTableHandle ->
    expectedColumnHandles ->
     PinotColumnHandle{columnName="playerName", ...}
     PinotColumnHandle{columnName="count", ...}
     pinotQuery ->
      GeneratedPinotQuery
      {
       query=SELECT "playerName", count(*)
             FROM baseballStats
             GROUP BY "playerName"
             LIMIT 10000,
       }

总结

在本章中,您学习了怎么在Presto中完结自界说衔接器,既运用Presto SPI,又运用Thrift。

SPI要求您运用Java编写自界说衔接器,经过完结不同的类,包括四个首要组件:插件和模块、装备以及输入/输出。关于每个组件,您有必要完结一些类,这些类使您的目录与Presto中心之间进行通讯。尽管您的原始目录不是联系型的,但您的自界说衔接器有必要运用联系型数据模型来揭露数据。

此外,您学习了怎么运用Apache Thrift编写自界说衔接器,这是一个使开发人员能够构建可扩展的跨言语服务的软件结构。经过Thrift衔接器,Presto能够与运用Java以外的言语编写的外部服务进行通讯。

您还学习了怎么将Apache Pinot(一个实时分布式OLAP数据存储)衔接到Presto。您在Kubernetes上设置了一个运转Pinot实例的计算机,并将其与您在第2章布置的Presto集群衔接起来。

在第4章中,您将学习一些衔接客户端到Presto的高档技术。