presto kafka_第1章06节 | 如何快速掌握Presto源码:思路和经验

e312ef4243e1dc03eea5b93b8bdef760.png

1. 两个Presto?

如果你在互联网上搜索Presto,你会发现两个Presto项目:

  1. PrestoDB:https://prestodb.io/,源代码:https://github.com/prestodb/presto
  2. 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


如果想知道两个项目有什么不同,请参考:

  • https://zhuanlan.zhihu.com/p/87621360
  • https://github.com/prestosql/presto/issues/380

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 (如果没有可以创建)

<?xml version="1.0" encoding="UTF-8"?>

之后我们就可以执行命令开始编译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,加快启动速度:

b41e506787e5c8e5d99a22d1ca2c393e.png

在plugin.bundles中,删掉其他的connector pom.xml,只留下以上图中3个即可,方便做测试。

记得运行前,还需要再增加一个步骤,就是把antlr4生成的SQL Parser代码目录generated-sources 设置为Generated Source Root,如下图:

fe84cc72bfb44305d4477ee11b908743.png

接下来在IDEA中配置Application Configuration之后,就可以直接以Debug模式启动PrestoServer了,如下:

5c793460143edf08a24339ab2954df58.png

其中

  • 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 

Idea中启动(可以用debug模式,方便打断点跟踪代码)完成Presto Server后,在浏览器打开

http://127.0.0.1:8080

即可看到Presto WebUI,如下:

ce15a74fc612f302f864075a98a80dcd.png

有一个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的一些开发者,甚至是三个创始人。


本文作者在国内某一线互联网大厂做大数据技术。交流大数据技术(Hadoop、Spark、Flink、Presto、Elasticsearch,..)、互联网大厂内推、技术面试求职指导,微信扫码联系本文作者(Wechat ID:garyelephant),加好友备注“知乎”:

6839137ef7774fff73f7786f755e0b7a.gif
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值