绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
如何快速掌握Presto源码:思路和经验
2022-02-14 14:44:09

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


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


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

分享好友

分享这个小栈给你的朋友们,一起进步吧。

Presto
创建时间:2022-02-08 14:13:32
Presto
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 飘絮絮絮丶
    专家
戳我,来吐槽~