Apache Presto单机部署及简单上手
什么是Apache Presto?
Apache Presto是一个分布式并行查询执行引擎,针对低延迟和交互式查询分析进行了优化。Presto可以轻松运行查询,甚至无需停机就能从GB级(千兆字节)扩展到PB级(千万亿字节)。
单个Presto查询可以处理来自多个来源的数据,如HDFS,MySQL,Cassandra,Hive等。Presto采用Java构建,容易与其他数据基础架构组件集成。Presto功能强大,因此Airbnb,DropBox,Groupon和Netflix等行业领先的公司正在采用它。
Presto - 特性
Presto具有以下特性 -
简单和可扩展的架构。
可插拔连接器 - Presto支持可插拔连接器,为查询提供元数据和数据。
流水线执行 - 避免不必要的 I/O延迟开销。
用户定义函数 - 分析师可以创建自定义的用户定义函数以轻松迁移。
向量化的柱状处理。
Presto - 优势
Apache Presto的优势如下 -
专门的SQL操作
易于安装和调试
简单的存储抽象
以低延迟快速扩展PB级数据
Presto - 应用程序
Presto支持当今大多数最好的工业应用程序。我们来看一些值得注意的应用程序。
Facebook- Facebook构建了Presto以满足数据分析需求。Presto可以轻松扩展大量数据。
Teradata- Teradata为大数据分析和数据仓库提供端到端解决方案。Teradata对Presto的贡献使更多公司可以更容易地实现所有分析需求。
Airbnb- Presto是Airbnb数据基础架构的组成部分。其数百名员工每天都在使用该技术进行查询。
为什么选择Presto?
Presto支持标准的ANSI SQL,所以它对数据分析师和开发人员来说是非常容易的。它虽然是用Java构建的,却避免了与内存分配和垃圾回收相关的Java代码的典型问题。Presto有一个对Hadoop友好的连接器架构。它允许轻松插入文件系统。
Presto可以在多个Hadoop发行版上运行。另外,Presto可以从一个Hadoop平台触手可及地查询Cassandra,关系型数据库或其他data stores。这种跨平台分析功能使Presto用户可以从GB级到PB级的数据中实现商业价值最大化。
安装部署:(需要JDK8以上)
1、下载presto的tar包
链接: https://prestodb.io/download.html
我这里下载的是最新版 presto-server-0.237.1.tar.gz
2、解压:
spark@spark:~/下载/presto$ ls
presto-cli-0.237.1-executable.jar presto-jdbc-0.237.1.jar presto-server-0.237.1.tar.gz
spark@spark:~/下载/presto$ tar xf presto-server-0.237.1.tar.gz -C /opt/apache/
spark@spark:/opt/apache$ cd presto/
spark@spark:/opt/apache$ mv presto-server-0.237.1 0.237.1
spark@spark:/opt/apache$ mkdir data
spark@spark:/opt/apache/presto$ ls
0.237.1 data
data 用于存储日志、本地元数据等的数据目录。建议在安装目录的外面创建一个数据目录。这样方便Presto进行升级。
3、生成配置
在安装目录中创建一个目录 etc , 加入以下配置:
node.properties | 节点属性 | 特定于每个节点的环境配置 |
jvm.config | JVM Config | Java虚拟机的命令行选项 |
config.properties | 配置属性 | Presto服务器的配置 |
log.properties | 日志级别配置文件 |
节点属性
包含特定于每个节点的配置:
属性 | 解释 |
---|---|
node.environment | 环境的名称。群集中的所有Presto节点必须具有相同的环境名称。 |
node.id | 此Presto安装的唯一标识符。对于每个节点,这必须是唯一的。在重新启动或升级Presto时,此标识符应保持一致。如果在一台计算机上运行多个Presto安装(即同一台计算机上的多个节点),则每个安装必须具有唯一标识符。 |
node.data-dir | 数据目录的位置(文件系统路径)。Presto将在此处存储日志和其他数据。 |
先 touch 一个 /etc/node.properties
然后复制配置进去:
node.environment=production
node.id=presto1
node.data-dir=/opt/presto/data
JVM Config
包含用于启动Java虚拟机的命令行选项列表。该文件的格式是一个选项列表,每行一个。shell不会解释这些选项,因此不应引用包含空格或其他特殊字符的选项。
touch etc/jvm.config
加入以下配置:
-server
-Xmx16G
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError
配置属性:
包含Presto服务器的配置。每个Presto服务器都可以充当协调器和工作器,但是专用一台机器来执行协调工作可以在更大的集群上提供最佳性能。
现在自己测试,不考虑性能。为方便起见,只用单节点,即当coordinator 也当worker。
将以下配置复制加入新建的config.properties
(8080端口容易起冲突,修改为了8099)
coordinator=true
node-scheduler.include-coordinator=true
http-server.http.port=8099
query.max-memory=5GB
query.max-memory-per-node=1GB
query.max-total-memory-per-node=2GB
discovery-server.enabled=true
discovery.uri=http://localhost:8099
(修改为自己的ip或主机名和对应端口)
属性解释如下:
coordinator:允许此Presto实例充当协调器(接受来自客户端的查询并管理查询执行)。
node-scheduler.include-coordinator:允许在协调器上安排工作。对于较大的集群,协调器上的处理工作可能会影响查询性能,因为计算机的资源不可用于调度,管理和监视查询执行的关键任务。
http-server.http.port:指定HTTP服务器的端口。Presto使用HTTP进行内部和外部的所有通信。
query.max-memory:查询可能使用的最大分布式内存量。
query.max-memory-per-node:查询可在任何一台计算机上使用的最大用户内存量。
query.max-total-memory-per-node:查询可在任何一台计算机上使用的最大用户和系统内存量,其中系统内存是读取器,写入程序和网络缓冲区等执行期间使用的内存。
discovery-server.enabled:Presto使用Discovery服务查找群集中的所有节点。每个Presto实例都会在启动时使用Discovery服务注册自己。为了简化部署并避免运行其他服务,Presto协调器可以运行Discovery服务的嵌入式版本。它与Presto共享HTTP服务器,因此使用相同的端口。
discovery.uri:Discovery服务器的URI。因为我们在Presto协调器中启用了Discovery的嵌入式版本,所以它应该是Presto协调器的URI。替换example.net:8080以匹配Presto协调器的主机和端口。此URI不得以斜杠结尾。
如果想按分布式搭建,请参考官网,修改配置:
附上链接: https://prestodb.github.io/docs/current/installation/deployment.html
日志级别配置文件
允许为命名的记录器层次结构设置最小日志级别。每个记录器都有一个名称,通常是使用记录器的类的完全限定名称。记录器具有基于名称中的点的层次结构(如Java包)。例如,请考虑以下日志级别文件:
在etc/log.properties中加入以下配置
com.facebook.presto = INFO
这将 com.facebook.presto.server和com.facebook.presto.hive设置为最低级别。默认的最低级别是INFO (因此上面的示例实际上并没有改变任何东西)。共有四个级别:DEBUG,INFO,WARN和ERROR。
目录属性
通过在目录中创建目录属性文件来注册etc/catalog目录。
touch etc/catalog/hive.properties
加入配置
connector.name=hive-hadoop2
hive.metastore.uri=thrift://example.net:9083 (替换为自己的hive metastore的ip和端口)
hive.config.resources=/etc/hadoop/conf/core-site.xml,/etc/hadoop/conf/hdfs-site.xml (可选,选择hdfs-site.xml和core-site.xml)
更多连接器请参考官网 https://prestodb.github.io/docs/current/connector.html
4、开始运行
安装目录包含启动器脚本bin/launcher。可以通过运行以下命令将Presto作为守护程序启动:
bin / launcher start
启动后,您可以在var/log以下位置找到日志文件:
launcher.log | 此日志由启动程序创建,并连接到服务器的stdout和stderr流。它将包含初始化服务器日志记录时发生的一些日志消息以及JVM生成的任何错误或诊断信息。 |
server.log | 这是Presto使用的主日志文件。如果服务器在初始化期间出现故障,它通常会包含相关信息。它会自动旋转和压缩。 |
http-request.log | 这是HTTP请求日志,其中包含服务器收到的每个HTTP请求。它会自动旋转和压缩。 |
5、命令行界面
Presto CLI提供了一个基于终端的交互式shell,用于运行查询。CLI是一个 自动执行的 JAR文件,这意味着它的行为类似于普通的UNIX可执行文件。
下载 presto-cli-0.237.1-executable.jar,将其重命名为presto,并增加执行权限,并绑定调度器端口
spark@spark:~$ mv presto-cli-0.237.1-executable.jar presto-cli
// 登录presto命令行
spark@spark:~$ presto-cli --server localhost:8099 --catalog hive --schema default
presto:default> show schemas;
Schema
--------------------
ads
default
dwd
dws
information_schema
ods
(6 rows)
Query 20200707_082935_00020_t2rf6, FINISHED, 1 node
Splits: 19 total, 19 done (100.00%)
0:00 [6 rows, 67B] [24 rows/s, 273B/s]
presto:ods> select t3.dept_no, t3.dept_name, count(distinct t1.emp_no) emp_cnt from salaries t1 join dept_emp t2 on t1.emp_no = t2.emp_no join departments t3 on t3.dept_no = t2.dept_no group by t3.dept_no,t3.dept_name;
dept_no | dept_name | emp_cnt
---------+--------------------+---------
d003 | Human Resources | 17786
d006 | Quality Management | 20117
d009 | Customer Service | 23580
d001 | Marketing | 20211
d002 | Finance | 17346
d008 | Research | 21126
d007 | Sales | 52245
d004 | Production | 73485
d005 | Development | 85707
(9 rows)
WARNING: COUNT(DISTINCT xxx) can be a very expensive operation when the cardinality is high for xxx. In most scenarios, using approx_distinct instead would be enough
Query 20200707_082942_00021_t2rf6, FINISHED, 1 node
Splits: 136 total, 136 done (100.00%)
0:07 [3.18M rows, 105MB] [480K rows/s, 15.9MB/s]
有一点点不同,hive中的database,在这里叫schema。所以查看数据库时,就得用show schemas;
6、Web UI
localhost:8099
7、HIVE比较
hive> select t3.dept_no,
> t3.dept_name,
> count(distinct t1.emp_no) emp_cnt
> from salaries t1
> join dept_emp t2 on t1.emp_no = t2.emp_no
> join departments t3 on t3.dept_no = t2.dept_no
> group by t3.dept_no,t3.dept_name;
......
MapReduce Jobs Launched:
Stage-Stage-7: Map: 1 Cumulative CPU: 17.7 sec HDFS Read: 98787566 HDFS Write: 81922368 SUCCESS
Stage-Stage-3: Map: 1 Reduce: 1 Cumulative CPU: 167.49 sec HDFS Read: 81934405 HDFS Write: 207 SUCCESS
Total MapReduce CPU Time Spent: 3 minutes 5 seconds 190 msec
OK
d001 Marketing 20211
d002 Finance 17346
d003 Human Resources 17786
d004 Production 73485
d005 Development 85707
d006 Quality Management 20117
d007 Sales 52245
d008 Research 21126
d009 Customer Service 23580
Time taken: 131.157 seconds, Fetched: 9 row(s)
8、SPARK SQL 比较
spark-sql> select t3.dept_no,
> t3.dept_name,
> count(distinct t1.emp_no) emp_cnt
> from salaries t1
> join dept_emp t2 on t1.emp_no = t2.emp_no
> join departments t3 on t3.dept_no = t2.dept_no
> group by t3.dept_no,t3.dept_name;
d007 Sales 52245
d004 Production 73485
d002 Finance 17346
d003 Human Resources 17786
d001 Marketing 20211
d009 Customer Service 23580
d008 Research 21126
d005 Development 85707
d006 Quality Management 20117
Time taken: 9.079 seconds, Fetched 9 row(s)
速度显而易见。