1. 两个Presto?
如果你在互联网上搜索Presto,你会发现两个Presto项目:
- PrestoDB:https://prestodb.io/,源代码:https://github.com/prestodb/presto
- PrestoSQL:https://prestosql.io/,源代码:https://github.com/prestosql/presto
这两个Presto的关系是,PrestoDB是2013年Facebook的三个核心工程师创造和开源出来的,在Facebook内部,它的应用规模是很庞大的(部署了多个集群,总节点数10000+台),这三个工程师一直想把Presto发扬光大,但是一直到了2019年,他们感觉到公司好像不怎么给力,同时期的三个开源大数据技术Spark、Flink、Kafka都已经创建了自己的商业化公司推广到家喻户晓了,如果说哪家公司在力推Presto,可能只有一家叫Teradata的小公司。无奈之下,这三位核心工程师离职加入了刚成立两年的Starburst公司,这家公司Fork了Presto的项目源码,改名为PrestoSQL,创建了自己的代码仓库和官方网站,在做商业化运营的Presto。如果你问笔者该选哪个,笔者更倾向于选择PrestoSQL,因为他近两年的源码迭代速度更快,而且还有三位创始人的支持,相信PrestoSQL的发展前景,所以本专栏中,如果有涉及源码讲解的内容,我们也会使用PrestoSQL的源码作为学习示例。不过事情也不是的,PrestoDB与PrestoSQL也在互相学习,并且会把对方比较好的实现,merge到自己的项目里,所以同时关注一下这两个项目的动态,没有坏处。由于这两个项目的大部分核心代码是完全相同的,所以我们以PrestoSQL来举例并不会妨碍你学习PrestoDB。
如果想知道关于Presto分裂为两个项目的来龙去脉,请参考:https://zhuanlan.zhihu.com/p/55628236
如果想知道两个项目有什么不同,请参考:
2. 如何编译Presto源码
首先从github上clone PrestoSQL源码,将clone好的项目导入到IDEA中:
git clone https://github.com/prestosql/prestosql.io.git
先编译Presto源码:
在编译开始之前,建议国内的读者,先设置一下maven依赖源为阿里提供的maven repository,否则可能会非常慢,如果读者的操作系统是mac(其他操作系统的读者,请自行google查阅设置方法),需要编辑~/.m2/settings.xml (如果没有可以创建)
// ~/.m2/settings.xml 的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<pluginGroups></pluginGroups>
<proxies></proxies>
<servers>
</servers>
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
<profiles>
</profiles>
</settings>
之后我们就可以执行命令开始编译Presto源代码(Presto代码比较多,编译时间可能会超过40分钟):
./mvnw clean install -DskipTests
编译完成后可以在IDE中运行Presto。
3. 如何以Debug模式启动一个单节点的Presto集群
我们这里期望启动一个单节点的Presto集群,用于Debug代码。这个单节点的PrestoServer既承担了Coordinator的角色,也承担了Worker的角色。
提前准备好:
- 操作系统:Mac/Windows
- 推荐源码阅读和编译器:Inteillj IDEA
- JAVA运行环境,至少JDK > 1.8
- PrestoSQL源码已完成编译
对于mac系统的用户,需要首先创建目录/var/data 并且给当前用户赋予读写权限。
修改配置文件presto-main/etc/config.properties,去掉不需要加载的Connector,加快启动速度:
在plugin.bundles中,删掉其他的connector pom.xml,只留下以上图中3个即可,方便做测试。
记得运行前,还需要再增加一个步骤,就是把antlr4生成的SQL Parser代码目录generated-sources 设置为Generated Source Root,如下图:
接下来在IDEA中配置Application Configuration之后,就可以直接以Debug模式启动PrestoServer了,如下:
其中
- Main class设置为:io.prestosql.server.PrestoServer
- VM options设置为:-ea -XX:+UseG1GC -XX:G1HeapRegionSize=32M -XX:+UseGCOverheadLimit -XX:+ExplicitGCInvokesConcurrent -Xmx2G -Dconfig=etc/config.properties -Dlog.levels-file=etc/log.properties -Djdk.attach.allowAttachSelf=true -Dpresto-temporarily-allow-java8=true
如果遇到报错如下,请在vm options中添加:-Dpresto-temporarily-allow-java8=true
Connected to the target VM, address: '127...1:59036', transport: 'socket'
ERROR: Future versions of Presto will require Java 11 after March 2020.
You may temporarily continue running on Java 8 by adding the following
JVM config option:
-Dpresto-temporarily-allow-java8=true
Idea中启动(可以用debug模式,方便打断点跟踪代码)完成Presto Server后,在浏览器打开
http://127.0.0.1:8080
即可看到Presto WebUI,如下:
有一个active的worker,在IDEA中运行时,Presto Coordinator与Presto Worker是同一个进程启动。
启动presto-cli的方法:
java -jar presto-cli/target/presto-cli-*-SNAPSHOT-executable.jar
启动prestso-cli后,我们就可以在这里输入期望执行的SQL。
更详细的请参考这篇,Running Presto In Your IDE https://github.com/prestosql/presto#running-presto-in-your-ide
4. 有哪些学习Presto源码的方法?
建议读者阅读这本书的前提:
- 对OLAP有基本的了解
- 会写常见的SQL
- 熟悉Presto的使用
- 在生产环境有过使用Presto,Spark,Flink SQL的经验
如果读者以上前提都不具备,建议先去完成上述的了解,否则看这本专栏内容将是云里雾里,无法理解。因为此书面向的是Presto或者OLAP SQL分析引擎的进阶和工程师,而不是教授一些过于基础的知识。
除此之外,如果仅仅是看一遍本书,而没有任何实操,笔者可以很负责任的说,读者看完这本书的所获得的知识量和深度是远远不够的。如果读者期望能够深度掌握本专栏的内容,并且实现大数据分布式SQL计算引擎原理的一通百通,无论是Presto,还是Spark或者Flink,笔者都强烈建议读者做到以下几件事:
- 多实践:搭建一套Presto测试集群
- 边 debug 边看源码:在Java编译器中跑起来Presto源码,并结合本书的内容,多去练习Debug源码
- 多总结:尝试把本书的知识点画成脑图,总结成自己的知识体系
- 根据实际业务需求改源码,理解的更透彻。
- 看单元测试,可以帮助理解每个类的使用方式。如看Driver.java 的单元测试类TestDriver.java
- 熟练阅读 VLDB、SIGMOD 等英文文献资料。SIGMOD是数据库方向的三大会议之一(另外两个是VLDB及ICDE)。这些顶会的论文,能够引导我们更理解源码背后的理论支撑以及新发展趋势。再强调一下,虽然VLDB,SIGMOD是数据库顶会,数据库与OLAP并没有的分界线,而且还有很多技术重叠。
Presto的代码写的非常精美,其中部分代码实现,甚至可以完全不做修改,拿到自己的项目中来使用。Presto的部分代码,抽象层级比较多,函数调用栈比较深,或者处理逻辑复杂,容易看着看着就懵了。对于这类的代码,没必要一次就能够看懂。笔者给到的建议是反复至少看十次,先从大面着眼,再从细节着眼。
5. Presto源码结构
讲真心话,像Presto这种来自一线大厂的大型开源项目,抽象和模块化做的都非常好,虽然模块非常多,源码结构式非常清晰的,如下:
presto-accumulo
presto-array
presto-atop
presto-base-jdbc
presto-benchmark
presto-benchmark-driver
presto-benchto-benchmarks
presto-bigquery
presto-blackhole
presto-cassandra
presto-cli
presto-client
presto-docs
presto-elasticsearch
presto-example-http
presto-geospatial
presto-geospatial-toolkit
presto-google-sheets
presto-hive
presto-hive-hadoop2
presto-iceberg
presto-jdbc
presto-jmx
presto-kafka
presto-kinesis
presto-kudu
presto-local-file
presto-main
presto-matching
presto-memory
presto-memory-context
presto-memsql
presto-ml
presto-mongodb
presto-mysql
presto-noop
presto-orc
presto-parquet
presto-parser
presto-password-authenticators
presto-phoenix
presto-plugin-toolkit
presto-postgresql
presto-product-tests
presto-product-tests-launcher
presto-proxy
presto-raptor-legacy
presto-rcfile
presto-record-decoder
presto-redis
presto-redshift
presto-resource-group-managers
presto-server
presto-server-rpm
presto-session-property-managers
presto-spi
presto-sqlserver
presto-teradata-functions
presto-testing
presto-testing-server-launcher
presto-tests
presto-thrift
presto-thrift-api
presto-thrift-testing-server
presto-tpcds
presto-tpch
presto-verifier
以上这些模块,从整体上可以分为四种:
种:核心流程控制:
- presto-main
- presto-parser
第二种:核心API定义:
- presto-spi
第三种:各种Connector的实现,非常多只列举几个:
- Hive Connector:presto-hive
- MySQL Connector:presto-mysql
- Kafka Connector:presto-kafka
- Cassandra Connector :presto-cassandra
- Elasticsearch Connector:presto-elasticsearch
- TPC Connector:presto-tpcds、presto-tpch
第四种:周边工具:
- SQL客户端:presto-cli
- 打包:presto-server,presto-server-rpm
- 列示存储:presto-parquet,presto-orc
- 模式匹配:presto-matching
- Benchmark:presto-benchmark、presto-benchmark-driver
以上种与第二种是Presto源码核心中的核心,看懂了这些源码就相当于看懂了Presto,本专栏后面的内容我们会继续深入与详细的拆解介绍其中的内容,敬请期待。
6. 如何与Presto开源社区建立联系?
PrestoSQL社区,推荐使用Slack作为沟通工具,Slack这个软件,类似于国内的阿里的钉钉、字节跳动的飞书、微软的teams,属于企业/项目协作工具。
访问这个页面,先sign up , 之后验证邮箱,后sign in,即可。
https://prestosql.io/slack.html
注册一个Slack账号,登陆Slack的指定workspace:https://prestosql.slack.com/,就可以了,在这个workspace里面,我们能够联系到Presto的一些开发者,甚至是三个创始人。
来源 https://zhuanlan.zhihu.com/p/262236892