有多种设置Presto的方法。在本章的第一部分,您将看到如何手动安装Presto。我们不会过多讨论手动安装,因为本章的真正目标是在本地构建一个小集群,模拟一个真实的生产环境。 接下来,您将了解如何在Docker上安装Presto以及如何在Kubernetes中设置本地集群。最后,您将学习如何在Presto中运行您的第一个查询,重点是如何列出目录和模式,并查询表。
本章假定您对Docker、Kubernetes和使用命令行有一些熟悉。即使您不熟悉,您仍然应该能够按照说明一步步进行,并成功运行一个工作的部署。
Presto 手动安装
要在本地计算机上设置Presto,您可以按照Presto官方文档中描述的过程进行操作。由于Presto是用Java编写的,您应该注意Presto支持的Java具体版本。Presto需要Java 8。Oracle JDK和OpenJDK都得到支持。
在Docker上运行Presto
本地Presto实例非常适合开发和故障排除。您可以使用裸机或虚拟机设置具有多个节点的完整生产集群。然而,您将需要自己管理这些节点的监控、可用性、可扩展性和部署。这就是容器和Kubernetes发挥作用的地方。
在本节中,我们将在Docker上安装和运行Presto,在下一节中,我们将使用相同的容器二进制文件和完整集群的Kubernetes部署配置来设置一个几乎可以用于生产的集群。
在Docker上运行Presto在作为独立节点运行Presto时很有用,不连接到其他外部组件,比如用于访问控制的Apache Ranger。相反,如果您需要更复杂的网络,您必须配置更复杂的场景,例如基于Kubernetes。在本书中,我们将使用Presto Docker作为基本容器,并使用Kubernetes来设置一个容器网络。
安装Docker
要运行容器,您需要安装Docker的一个版本。我们已经测试了本书中描述的代码,适用于Docker 4.2.0版本,但最新版本也应该可以工作。Docker需要至少4 GB的RAM。但是,我们建议至少8 GB的RAM以提高Presto的性能。您可以在Windows或Mac上使用Docker Desktop,也可以在Linux上使用Docker Engine。确保通过docker login登录到Docker注册表或其他注册表(如ECR),以便能够发布您创建的镜像供使用。
Presto Docker 镜像
首先,如果您尚未克隆仓库,请执行以下操作:
bash
git clone https://github.com/alod83/Learning-and-Operating-Presto.git
本节中使用的代码位于目录02/presto-docker中,该目录包含以下文件以及README.md文件:
-
Dockerfile
- Docker的配置文件
-
etc/
- 包含Presto配置文件的目录
在本节的其余部分,我们将描述Dockerfile和etc/目录的内容,这将允许您自定义Presto安装。如果您想使用默认配置安装Presto,可以直接跳到"在Docker上构建和运行Presto"。
Dockerfile
Dockerfile基于CentOS 7,安装了Presto服务器和Presto客户端以及其他依赖和工具。Dockerfile的组织结构如下。 首先,定义基本镜像、参数(包括要下载的Presto版本)和Presto服务器和客户端二进制文件的URL:
bash
FROM centos:7
ARG PRESTO_VERSION
ARG PRESTO_BIN=https://repo1.maven.org/maven2/com/\
facebook/presto/presto-server/${PRESTO_VERSION}/\
presto-server-${PRESTO_VERSION}.tar.gz
ARG PRESTO_CLI_BIN=https://repo1.maven.org/maven2/com/\
facebook/presto/presto-cli/${PRESTO_VERSION}/\
presto-cli-${PRESTO_VERSION}-executable.jar
接下来,安装安装Presto所需的软件:
sql
RUN yum update -y &&\
yum install -y wget ca-certificates tar less\
yum install -y java-1.8.0-openjdk\
yum clean all
创建/opt目录,您将在其中安装Presto。然后,下载Presto服务器和客户端二进制文件,并将它们移动到/opt目录:
bash
RUN mkdir -p /opt
RUN wget --quiet ${PRESTO_BIN}
RUN tar -xf presto-server-${PRESTO_VERSION}.tar.gz -C /opt
RUN rm presto-server-${PRESTO_VERSION}.tar.gz
RUN ln -s /opt/presto-server-${PRESTO_VERSION} /opt/presto
RUN wget --quiet "${PRESTO_CLI_BIN}"
RUN mv presto-cli-${PRESTO_VERSION}-executable.jar /usr/local/bin/presto
RUN chmod +x /usr/local/bin/presto
RUN mkdir /opt/presto/data
RUN mkdir /opt/presto/log
现在,将您本地文件系统中etc/目录的内容复制到Docker镜像中的etc/目录:
bash
COPY etc /opt/presto/etc
最后,指定运行Presto的命令:
css
CMD ["/opt/presto/bin/launcher", "run"]
etc/ 目录
etc/ 目录包含Presto的配置文件。在本节中,我们将看到如何设置一个在本地运行Presto的基本配置。该场景使用一个协调器和一个工作节点。在"在Docker上构建和运行Presto"中,您将学习如何为类似生产环境的配置Presto。目前,所描述的配置足以开始并熟悉Presto。 etc/ 目录包含以下基本文件和目录:
- node.properties
- jvm.config
- config.properties
- log.properties
- catalog/
您可以按照描述使用配置文件,或尝试修改它们以根据需要自定义Presto配置。我们将在本书的后续章节中详细分析配置文件。
node.properties
一个节点是Presto的一个实例,而这个文件是特定于该节点的配置。以下代码片段显示了您必须在 node.properties 中定义的最小属性:
ini
node.environment=presto_local
node.id=1a674699-500c-414c-b480-9ac0df416403
node.data-dir=data
最少需要的属性包括:
- node.environment 此配置指定环境的名称。Presto集群中的所有节点必须具有相同的环境名称。
- node.id Presto安装的唯一标识符。同一Presto安装中的所有节点必须共享相同的node.id值,它在重新启动和升级之间必须保持一致。您可以将此ID生成为通用唯一标识符(UUID)。
- node.data-dir 此配置指定Presto将存储日志和其他数据的数据目录。
jvm.config
Presto是用Java编写的,因此您可以使用此配置文件来存储传递给Java虚拟机(JVM)的命令行选项。要开始使用Presto,我们将使用以下选项:
diff
-server
-Xms3G
-Xmx3G
-Djdk.attach.allowAttachSelf=true
-server选项选择Java HotSpot Server VM。-Xms3G -Xmx3G选项为JVM预分配3 GB的内存(最小值和最大值设置为相同的值)。-Djdk.attach.allowAttachSelf=true选项是为了避免启动错误,允许进程附加到JVM以从受仪器化的对象中获取信息。 我们将在第6章更详细地讨论这个配置文件。
config.properties
使用此文件指定Presto服务器的配置。一个节点可以配置为协调器、工作节点或两者兼而有之。我们将使用以下配置部署Presto协调器的本地Presto:
ini
coordinator=true
node-scheduler.include-coordinator=true
http-server.http.port=8080
memory.heap-headroom-per-node=0.5GB
query.max-memory=1GB
query.max-memory-per-node=0.5GB
query.max-total-memory-per-node=2GB
discovery-server.enabled=true
discovery.uri=http://localhost:8080
以下是各属性的解释:
coordinator
:将值设置为true将允许此Presto节点接受客户端请求并管理客户端连接。node-scheduler.include-coordinator
:将值设置为true将允许在协调器上调度工作。通常,在生产环境中不希望将其设置为true,因为协调和查询执行将竞争相同的资源。我们将在第3章详细讨论调度的细节。http-server.http.port
:这是用于节点间和外部通信的HTTP端口。query.max-memory
:这是查询在整个Presto集群上可以利用的用户内存的最大量。如果查询超过此内存限制,Presto将自动终止其执行。query.max-memory-per-node
:这是查询在工作节点上可以使用的用户内存的最大量。如果查询在任何节点上超过此内存限制,Presto将自动终止其执行。query.max-total-memory-per-node
:这是查询在工作节点上可以使用的用户和系统内存总和的最大量。如果查询在任何节点上超过此内存限制,Presto将自动终止其执行。我们将在第6章中了解系统和用户内存的概念。discovery-server.enabled
:Presto集群中的所有节点在启动时将自动向发现服务注册。为了避免运行额外的服务,Presto协调器可以运行嵌入式版本的发现服务。这将允许您为所有Presto机器设置单个端口,使部署更简单。discovery.uri
:这是发现服务器的URI。因为我们在Presto协调器中启用了嵌入式版本的发现,所以这应该是Presto协调器的URI。URI必须与Presto协调器的主机和端口匹配。此URI不能以斜杠结尾。
log.properties
日志记录对于了解服务器正在执行的操作和解决问题至关重要。有四个级别:DEBUG、INFO、WARN和ERROR。根据需要,您可以指定其他包以适当的日志级别。要开始使用,您可以使用以下配置:
ini
com.facebook.presto=INFO
通过将com.facebook.presto包的级别设置为INFO,您可以在启动时查看节点的所有设置,以及进行故障排除所需的任何相关信息。我们将在第6章中涵盖更多有关这些设置的内容。
catalog/<connector>.properties
此目录包含您的Presto配置中每个连接器的配置。正如在第1章中简要介绍的那样,Presto使用连接器从不同的数据源访问数据。连接器是使最终用户的SQL on Anything范例成为可能的因素。 Presto使用数据源的本机接口来查询和处理数据;例如,对于关系数据库,连接器将使用JDBC从源访问数据,而对于非关系源,如S3、Elastic等,连接器将使用适当的SDK/API。
因此,连接器可以使用SQL、RESTful API、HTTP或任何其他专有通信机制与底层数据源进行交互 - 所有这些都发生在幕后。连接器将底层数据访问为您抽象成数据库、模式、表和SQL结构,即使底层源没有数据库、模式或表的概念。作为通过Presto查询数据的用户,您只需要知道如何编写SQL查询;连接器负责其余的工作。我们将在第3章中更详细地讨论连接器。
连接器在Presto和目录之间建立连接。您可以使用SQL查询目录。连接器抽象了与数据源进行交互的底层复杂性 - 这不重要,无论它是平面文件、NoSQL数据库、API还是关系数据库。
通过在etc/catalog目录中创建一个目录属性文件,您可以注册一个目录。例如,要挂载TPC-H目录,可以创建一个tpch.properties文件,其中包含以下内容以将tpch连接器挂载为tpch目录:
ini
connector.name=tpch
构建并在Docker上运行Presto
现在您已经准备好通过在终端中运行以下命令来构建Docker镜像:
css
bashCopy code
docker build --build-arg PRESTO_VERSION=0.276.1 . -t prestodb:latest
您需要将要安装的PRESTO_VERSION作为参数传递给Docker命令。在编写本文时,Presto的最新版本是0.276.1。 然后,运行构建的镜像:
css
bashCopy code
docker run --name presto prestodb:latest
Presto服务器将启动。您应该在标准输入和标准错误中看到许多日志和信息。如果在这些日志和信息之后,您看到以下消息,就表示服务器正在运行:
ini
bashCopy code
INFO main com.facebook.presto.server.PrestoServer
======== SERVER STARTED ========
要测试Presto服务器是否正常运行,您可以打开一个新的终端,并连接到Docker容器中的Presto客户端:
bash
bashCopy code
docker exec -it presto presto
现在您已连接到Presto客户端,可以运行查询,例如,显示目录列表:
css
sqlCopy code
presto> show catalogs;
查询将生成以下输出:
sql
sqlCopy code
Catalog
-------
system
tpch
(2 rows)
Query 20220919_085038_00001_j5vrm, FINISHED, 1 node
Splits: 19 total, 19 done (100.00%)
0:22 [0 rows, 0B] [0 rows/s, 0B/s]
查询的输出显示有两个目录,system和tpch。这证明Presto已正确加载tpch目录。
Presto沙盒
到目前为止,我们已经介绍了如何从头开始构建基本的Presto Docker容器。如果您需要为您的场景安装更多的包或库,您可以使用Docker Presto沙盒容器。 Presto沙盒已经配备了配置许多场景所需的所有库,例如我们将在第5章中看到的数据湖仓库。要使用Presto沙盒运行Presto容器,请参阅文档。
在Kubernetes上部署Presto
图2-1展示了我们将在本地机器上部署的集群。我们将使用两个数据源,TPC-H和一个MySQL数据库。我们将部署一个单独的协调器和两个工作者,每个工作者代表Kubernetes中的一个Pod。这个场景每个节点至少需要4GB的RAM,所以如果你的机器内存或存储能力不足,你可以将工作者的数量减少到一个。你也可以创建一个包含Presto客户端的新Pod,但这会消耗大量资源。在本章中,为了减少在本地计算机上使用的资源数量,我们将使用协调器中提供的Presto客户端。
Kubernetes简介
在本章中,我们将使用在整个章节中使用的本地集群,因此您需要在本地计算机上安装Kubernetes。有各种各样的Kubernetes版本;使用哪种版本的Kubernetes并不重要。所有与Kubernetes的交互都通过kubectl进行,因此请确保您已经安装了Kubernetes客户端。您可以在此处找到有关您的操作系统的说明。
在本书中,我们将使用由Docker Desktop提供的Kubernetes版本。要安装它,首先必须安装Docker Desktop,如前一节所述,然后可以按照以下步骤启用Kubernetes:
- 启动Docker Desktop并访问仪表板。
- 单击窗口右上角的设置按钮。
- 从左侧边栏菜单中选择Kubernetes,然后选择"启用Kubernetes",最后单击"应用并重新启动"按钮。