Fork me on GitHub

Presto Install & Deploy [安装部署]

Presto是什么?
Presto是一个开源的分布式SQL查询引擎,适用于交互式分析查询,数据量支持GB到PB字节
Presto的设计和编写完全是为了解决像Facebook这样规模的商业数据仓库的交互式分析和处理速度的问题

Presto可以做什么?
Presto支持在线数据查询,包括Hive, Cassandra, 关系数据库以及专有数据存储。 一条Presto查询可以将多个数据源的数据进行合并,可以跨越整个组织进行分析
Presto以分析师的需求作为目标,他们期望响应时间小于1秒到几分钟。 Presto终结了数据分析的两难选择,要么使用速度快的昂贵的商业方案,要么使用消耗大量硬件的慢速的“免费”方案。

(摘自Presto中文网)



测试环境

1
2
3
Ubuntu Server 14.04 x64
JDK 1.8+
Presto 0.151

Presto安装

下载Presto

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# 下载
wget https://repo1.maven.org/maven2/com/facebook/presto/presto-server/0.151/presto-server-0.151.tar.gz

# 解压
tar -zxvf presto-server-0.151.tar.gz

# 目录结构(apt-get install tree)
tree -L 2
.
├── bin
│   ├── launcher
│   ├── launcher.properties
│   ├── launcher.py
│   └── procname
├── lib
│   ├── aether-api-1.13.1.jar
│   ├── aether-connector-asynchttpclient-1.13.1.jar
│   ├── aether-connector-file-1.13.1.jar
│   ├── aether-impl-1.13.1.jar
│   ├── aether-spi-1.13.1.jar
│   ├── aether-util-1.13.1.jar
│   ├── annotations-2.0.3.jar
│   ├── antlr4-runtime-4.5.1.jar
│   ├── aopalliance-1.0.jar
│   ├── asm-all-5.0.4.jar
│   ├── async-http-client-1.6.5.jar
│   ├── bootstrap-0.131.jar
│   ├── bval-core-0.5.jar
│   ├── bval-jsr303-0.5.jar
│   ├── cglib-nodep-2.2.2.jar
│   ├── commons-beanutils-core-1.8.3.jar
│   ├── commons-lang3-3.1.jar
│   ├── commons-math3-3.2.jar
│   ├── concurrent-0.131.jar
│   ├── configuration-0.131.jar
│   ├── discovery-0.131.jar
│   ├── discovery-server-1.25.jar
│   ├── event-0.131.jar
│   ├── fastutil-6.5.9.jar
│   ├── guava-18.0.jar
│   ├── guice-4.0.jar
│   ├── guice-multibindings-4.0.jar
│   ├── hk2-api-2.4.0-b34.jar
│   ├── hk2-locator-2.4.0-b34.jar
│   ├── hk2-utils-2.4.0-b34.jar
│   ├── http2-client-9.3.11.M0.jar
│   ├── http2-common-9.3.11.M0.jar
│   ├── http2-hpack-9.3.11.M0.jar
│   ├── http2-http-client-transport-9.3.11.M0.jar
│   ├── http2-server-9.3.11.M0.jar
│   ├── http-client-0.131.jar
│   ├── http-server-0.131.jar
│   ├── jackson-annotations-2.4.4.jar
│   ├── jackson-core-2.4.4.jar
│   ├── jackson-databind-2.4.4.jar
│   ├── jackson-dataformat-smile-2.4.4.jar
│   ├── jackson-datatype-guava-2.4.4.jar
│   ├── jackson-datatype-jdk7-2.4.4.jar
│   ├── jackson-datatype-jdk8-2.4.4.jar
│   ├── jackson-datatype-joda-2.4.4.jar
│   ├── jackson-datatype-jsr310-2.4.4.jar
│   ├── javassist-3.18.1-GA.jar
│   ├── javax.annotation-api-1.2.jar
│   ├── javax.inject-1.jar
│   ├── javax.servlet-api-3.1.0.jar
│   ├── javax.ws.rs-api-2.0.1.jar
│   ├── jaxrs-0.131.jar
│   ├── jcl-over-slf4j-1.7.12.jar
│   ├── jersey-client-2.22.2.jar
│   ├── jersey-common-2.22.2.jar
│   ├── jersey-container-servlet-2.22.2.jar
│   ├── jersey-container-servlet-core-2.22.2.jar
│   ├── jersey-guava-2.22.2.jar
│   ├── jersey-media-jaxb-2.22.2.jar
│   ├── jersey-server-2.22.2.jar
│   ├── jetty-alpn-client-9.3.11.M0.jar
│   ├── jetty-client-9.3.11.M0.jar
│   ├── jetty-http-9.3.11.M0.jar
│   ├── jetty-io-9.3.11.M0.jar
│   ├── jetty-jmx-9.3.11.M0.jar
│   ├── jetty-security-9.3.11.M0.jar
│   ├── jetty-server-9.3.11.M0.jar
│   ├── jetty-servlet-9.3.11.M0.jar
│   ├── jetty-util-9.3.11.M0.jar
│   ├── jgrapht-core-0.9.0.jar
│   ├── jmx-0.131.jar
│   ├── jmx-http-0.131.jar
│   ├── jmx-http-rpc-0.118.jar
│   ├── jmxutils-1.19.jar
│   ├── joda-time-2.8.2.jar
│   ├── jol-core-0.2.jar
│   ├── joni-2.1.5.1.jar
│   ├── json-0.131.jar
│   ├── leveldb-0.7.jar
│   ├── leveldb-api-0.7.jar
│   ├── log-0.131.jar
│   ├── log4j-over-slf4j-1.7.12.jar
│   ├── logback-core-1.0.13.jar
│   ├── log-manager-0.131.jar
│   ├── maven-aether-provider-3.0.4.jar
│   ├── maven-artifact-3.0.4.jar
│   ├── maven-compat-3.0.4.jar
│   ├── maven-core-3.0.4.jar
│   ├── maven-embedder-3.0.4.jar
│   ├── maven-model-3.0.4.jar
│   ├── maven-model-builder-3.0.4.jar
│   ├── maven-plugin-api-3.0.4.jar
│   ├── maven-repository-metadata-3.0.4.jar
│   ├── maven-settings-3.0.4.jar
│   ├── maven-settings-builder-3.0.4.jar
│   ├── netty-3.7.0.Final.jar
│   ├── node-0.131.jar
│   ├── osgi-resource-locator-1.0.1.jar
│   ├── plexus-cipher-1.7.jar
│   ├── plexus-classworlds-2.4.jar
│   ├── plexus-component-annotations-1.5.5.jar
│   ├── plexus-container-default-1.5.5.jar
│   ├── plexus-interpolation-1.14.jar
│   ├── plexus-sec-dispatcher-1.3.jar
│   ├── plexus-utils-2.0.6.jar
│   ├── presto-bytecode-0.151.jar
│   ├── presto-client-0.151.jar
│   ├── presto-main-0.151.jar
│   ├── presto-parser-0.151.jar
│   ├── presto-spi-0.151.jar
│   ├── re2j-td-1.4.jar
│   ├── resolver-1.3.jar
│   ├── slf4j-api-1.7.12.jar
│   ├── slf4j-jdk14-1.7.12.jar
│   ├── slice-0.22.jar
│   ├── stats-0.131.jar
│   ├── trace-token-0.131.jar
│   ├── units-0.131.jar
│   ├── validation-api-1.1.0.Final.jar
│   ├── wagon-provider-api-2.2.jar
│   └── xbean-reflect-3.4.jar
├── NOTICE
├── plugin
│   ├── atop
│   ├── blackhole
│   ├── cassandra
│   ├── example-http
│   ├── hive-cdh4
│   ├── hive-cdh5
│   ├── hive-hadoop1
│   ├── hive-hadoop2
│   ├── jmx
│   ├── kafka
│   ├── localfile
│   ├── ml
│   ├── mongodb
│   ├── mysql
│   ├── postgresql
│   ├── raptor
│   ├── redis
│   ├── teradata-functions
│   └── tpch
└── README.txt

Presto配置

在安装目录中创建一个etc目录。 在这个etc目录中放入以下配置信息:

1
mkdir etc
  • node.properties

    • 节点配置:每个节点的环境信息
  • jvm.config

    • JVM 配置:JVM的命令行选项
  • config.properties

    • 参数配置:Presto server的参数信息
  • log.properties

    • 日志信息:配置输出日志级别
  • catalog目录:

    • configuration forConnectors(数据源)的配置信息

node.properties

包含针对于每个节点的特定的配置信息,一个节点就是在一台机器上安装的Presto实例

1
2
3
4
5
vim etc/node.properties

node.environment=production
node.id=ffffffff-ffff-ffff-ffff-ffffffffffff
node.data-dir=/var/presto/data
  • node.environment:集群名称,所有在同一个集群中的Presto节点必须拥有相同的集群名称

  • node.id:每个Presto节点的唯一标示。每个节点的node.id都必须是唯一的。在Presto进行重启或者升级过程中每个节点的node.id必须保持不变。如果在一个节点上安装多个Presto实例(例如:在同一台机器上安装多个Presto节点),那么每个Presto节点必须拥有唯一的node.id

  • node.data-dir:数据存储目录的位置(操作系统上的路径),Presto将会把日期和数据存储在这个目录下


jvm.config

包含一系列在启动JVM的时候需要使用的命令行选项。这份配置文件的格式是:一系列的选项,每行配置一个单独的选项。由于这些选项不在shell命令中使用。 因此即使将每个选项通过空格或者其他的分隔符分开,java程序也不会将这些选项分开,而是作为一个命令行选项处理

Presto会将查询编译成字节码文件,因此Presto会生成很多class,因此我们我们应该增大Perm区的大小(在Perm中主要存储class)并且要允许Jvm class unloading

1
2
3
4
5
6
7
8
9
10
11
vim etc/jvm.config

-server
-Xmx4G
-XX:+UseConcMarkSweepGC
-XX:+ExplicitGCInvokesConcurrent
-XX:+CMSClassUnloadingEnabled
-XX:+AggressiveOpts
-XX:+HeapDumpOnOutOfMemoryError
-XX:OnOutOfMemoryError=kill -9 %p
-XX:ReservedCodeCacheSize=150M

config.properties

包含了Presto server的所有配置信息。 每个Presto server既是一个coordinator也是一个worker。但是在大型集群中,处于性能考虑,建议单独用一台机器作为 coordinator

新版本中已经不使用一下配置: task.max-memory=1GB

改为:query.max-memory=1GB和query.max-memory-per-node=1GB

1
2
3
4
5
6
7
8
9
10
11
vim etc/config.properties

# coordinator最小配置

coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8080
query.max-memory=2GB
query.max-memory-per-node=1GB
discovery-server.enabled=true
discovery.uri=http://example.net:8080
1
2
3
4
5
6
7
8
9
vim etc/config.properties

# worker最小配置

coordinator=false
http-server.http.port=8080
query.max-memory=2GB
query.max-memory-per-node=1GB
discovery.uri=http://example.net:8080
1
2
3
4
5
6
7
8
9
10
11
vim etc/config.properties

# 最小伪分布式,coordinator和worker在一台机

coordinator=true
node-scheduler.include-coordinator=true
http-server.http.port=8080
query.max-memory=2GB
query.max-memory-per-node=1GB
discovery-server.enabled=true
discovery.uri=http://example.net:8080
  • coordinator:指定是否运维Presto实例作为一个coordinator(接收来自客户端的查询情切管理每个查询的执行过程)

  • node-scheduler.include-coordinator:是否允许在coordinator服务中进行调度工作。对于大型的集群,在一个节点上的Presto server即作为coordinator又作为worke将会降低查询性能。因为如果一个服务器作为worker使用,那么大部分的资源都不会被worker占用,那么就不会有足够的资源进行关键任务调度、管理和监控查询执行

  • http-server.http.port:指定HTTP server的端口。Presto 使用 HTTP进行内部和外部的所有通讯

  • query.max-memory:一个提交计划在所有worker节点上占用的内存上限

  • query.max-memory-per-node:一个查询在一个机器上可使用的内存上限

  • discovery-server.enabled:Presto 通过Discovery 服务来找到集群中所有的节点。为了能够找到集群中所有的节点,每一个Presto实例都会在启动的时候将自己注册到discovery服务。Presto为了简化部署,并且也不想再增加一个新的服务进程,Presto coordinator 可以运行一个内嵌在coordinator 里面的Discovery 服务。这个内嵌的Discovery 服务和Presto共享HTTP server并且使用同样的端口

  • discovery.uri:Discovery server的URI。由于启用了Presto coordinator内嵌的Discovery 服务,因此这个uri就是Presto coordinator的uri。修改example.net:8080,根据你的实际环境设置该URI。注意:这个URI一定不能以“/“结尾


log.properties

在这个配置文件中允许你根据不同的日志结构设置不同的日志级别。每个logger都有一个名字(通常是使用logger的类的全标示类名). Loggers通过名字中的“.“来表示层级和集成关系

默认就是INFO,四个级别 DEBUG, INFO, WARN and ERROR

1
2
3
vim etc/log.properties

com.facebook.presto=INFO

数据源Catalog Properties

Presto通过connectors访问数据。这些connectors挂载在catalogs上。 connector 可以提供一个catalog中所有的schema和表

  • 创建catalog目录
1
mkdir etc/catalog
  • 创建jmx连接器
1
2
3
vim etc/catalog/jmx.properties

connector.name=jmx

运行Presto

  • 后台进程启动
1
bin/launcher start
  • 前台运行, 日志和相关输出将会写入stdout/stderr
1
bin/launcher run

启动成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
......
......
......
2016-08-21T21:56:25.396+0800 INFO main com.facebook.presto.metadata.CatalogManager -- Loading catalog etc/catalog/jmx.properties --
2016-08-21T21:56:25.675+0800 INFO main Bootstrap PROPERTY DEFAULT RUNTIME DESCRIPTION
2016-08-21T21:56:25.675+0800 INFO main Bootstrap jmx.dump-period 10.00s 10.00s
2016-08-21T21:56:25.675+0800 INFO main Bootstrap jmx.dump-tables [] []
2016-08-21T21:56:25.675+0800 INFO main Bootstrap jmx.max-entries 86400 86400
2016-08-21T21:56:25.675+0800 INFO main Bootstrap
2016-08-21T21:56:25.894+0800 INFO main io.airlift.bootstrap.LifeCycleManager Life cycle starting...
2016-08-21T21:56:25.895+0800 INFO main io.airlift.bootstrap.LifeCycleManager Life cycle startup complete. System ready.
2016-08-21T21:56:25.895+0800 INFO main com.facebook.presto.metadata.CatalogManager -- Added catalog jmx using connector jmx --
2016-08-21T21:56:25.897+0800 INFO main com.facebook.presto.security.AccessControlManager -- Loading system access control --
2016-08-21T21:56:25.897+0800 INFO main com.facebook.presto.security.AccessControlManager -- Loaded system access control allow-all --
2016-08-21T21:56:25.957+0800 INFO main com.facebook.presto.server.PrestoServer ======== SERVER STARTED ========

运行bin/launcher–help,Presto将会列出支持的命令和命令行选项。 另外可以通过运行bin/launcher–verbose命令,来调试安装是否正确

启动完之后,日志将会写在data目录下,该目录下有如下文件:

1
2
3
4
5
6
7
8
.
├── etc -> /root/sortware/presto-server-0.151/etc
├── plugin -> /root/sortware/presto-server-0.151/plugin
└── var
├── log
│   └── http-request.log
└── run
└── launcher.pid

打开WEB界面:http://example.net:8080


常见问题汇总

1.JDK版本过低

  • 出现以下错误通常是因为JDK版本低于1.8造成的,Presto要求JDK版本必须为1.8+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/facebook/presto/server/PrestoServer : Unsupported major.minor version 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)

2.node.properties配置问题

  • 出现以下错误通常是因为node.properties文件没有配置,或者配置错误引起的,请参照前文重新配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2016-08-21T21:50:41.242+0800 ERROR main com.facebook.presto.server.PrestoServer Unable to create injector, see the following errors:

1) Error: Invalid configuration property node.environment: may not be null (for class io.airlift.node.NodeConfig.environment)
at io.airlift.node.NodeModule.configure(NodeModule.java:34)

1 error
com.google.inject.CreationException: Unable to create injector, see the following errors:

1) Error: Invalid configuration property node.environment: may not be null (for class io.airlift.node.NodeConfig.environment)
at io.airlift.node.NodeModule.configure(NodeModule.java:34)

1 error
at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:466)
at com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:155)
at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:107)
at com.google.inject.Guice.createInjector(Guice.java:96)
at io.airlift.bootstrap.Bootstrap.initialize(Bootstrap.java:242)
at com.facebook.presto.server.PrestoServer.run(PrestoServer.java:111)
at com.facebook.presto.server.PrestoServer.main(PrestoServer.java:63)

参考:Presto 0.100 Documentation


转载请注明出处


Thank you for your support.