我们在上一章已经了解了presto的简介,本章进行部署和使用。
https://prestodb.io/docs/current/installation.html
http://prestodb-china.com/docs/current/installation/deployment.html (京东版本)
https://teradata.github.io/presto/docs/current/overview.html (teradata版本)
Presto 有以下几个基本要求:
Linux 或者 Mac OS X 系统
Java 8,64位
操作系统:CentOS release 6.6 (Final)
ps:查看系统版本使用命令
lsb_release -a
Hadoop集群:CDH 5.13.0, Parcel
JDK 版本:java version 1.8.0_131
实际使用中一般需要多节点安装配置,为了快速熟悉和尝试Presto,我们可以先尝试安装单节点的Presto服务。
所谓的单节点就是把Presto的coordinator和worker都部署在同一个节点上。
下载链接
https://repo1.maven.org/maven2/com/facebook/presto/presto-server/
该链接中有很多版本的presto,目前最新的是0.195版本。
为了方便Presto进行升级,建议在presto安装目录的外面创建一个目录命名为presto。
使用命令创建目录
mkdir presto
进入目录使用命令下载
cd ./presto
wget https://repo1.maven.org/maven2/com/facebook/presto/presto-server/0.195/presto-server-0.195.tar.gz
使用命令解压压缩文件
tar -xf presto-server-0.195.tar.gz
在安装目录中创建一个etc目录。 在这个etc目录中放入以下配置信息:
节点属性:每个节点的环境配置信息
JVM 配置:JVM的命令行选项
配置属性:Presto server的配置信息
Catalog属性:configuration forConnectors(数据源)的配置信息
使用命令
cd ./presto-server-0.195
mkdir etc
节点属性配置文件:etc/node.properties包含针对于每个节点的特定的配置信息。 一个节点就是在一台机器上安装的Presto实例。 这份配置文件一般情况下是在Presto第一次安装的时候,由部署系统创建的。 一个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将会把日期和数据存储在这个目录下。
使用命令
cd ./etc
vim node.properties
输入配置
node.environment=production
node.id=a0001
node.data-dir=/home/zzq/var/presto/data
如图:
点击esc,输入:wq回车保存退出。
JVM配置文件,etc/jvm.config, 包含一系列在启动JVM的时候需要使用的命令行选项。这份配置文件的格式是:一系列的选项,每行配置一个单独的选项。由于这些选项不在shell命令中使用。 因此即使将每个选项通过空格或者其他的分隔符分开,java程序也不会将这些选项分开,而是作为一个命令行选项处理。(就像下面例子中的OnOutOfMemoryError选项)。
一个典型的etc/jvm.config配置文件如下:
-server
-Xmx16G
-XX:+UseConcMarkSweepGC
-XX:+ExplicitGCInvokesConcurrent
-XX:+CMSClassUnloadingEnabled
-XX:+AggressiveOpts
-XX:+HeapDumpOnOutOfMemoryError
-XX:OnOutOfMemoryError=kill -9 %p
-XX:ReservedCodeCacheSize=150M
由于OutOfMemoryError将会导致JVM处于不一致状态,所以遇到这种错误的时候我们一般的处理措施就是将dump headp中的信息(用于debugging),然后强制终止进程。
Presto会将查询编译成字节码文件,因此Presto会生成很多class,因此我们我们应该增大Perm区的大小(在Perm中主要存储class)并且要允许Jvm class unloading。
使用命令
vim jvm.config
因为我的节点内存比较大为126G,所以可以设置的内存也比较大,我设置为32G。
输入配置
-server
-Xmx32G
-XX:+UseConcMarkSweepGC
-XX:+ExplicitGCInvokesConcurrent
-XX:+CMSClassUnloadingEnabled
-XX:+AggressiveOpts
-XX:+HeapDumpOnOutOfMemoryError
-XX:OnOutOfMemoryError=kill -9 %p
-XX:ReservedCodeCacheSize=300M
如图
点击esc,输入:wq回车保存退出。
Presto的配置文件:etc/config.properties包含了Presto server的所有配置信息。 每个Presto server既是一个coordinator也是一个worker。 但是在大型集群中,处于性能考虑,建议单独用一台机器作为 coordinator。
一个coordinator的etc/config.properties应该至少包含以下信息:
旧版本
coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8080
task.max-memory=1GB
discovery-server.enabled=true
discovery.uri=http://example.net:8080
新版本
coordinator=true
node-scheduler.include-coordinator=true
http-server.http.port=8080
query.max-memory=50GB
query.max-memory-per-node=1GB
discovery-server.enabled=true
discovery.uri=http://example.net:8080
以下是最基本的worker配置:
旧版本
coordinator=false
http-server.http.port=8080
task.max-memory=1GB
discovery.uri=http://example.net:8080
新版本
coordinator=false
http-server.http.port=8080
query.max-memory=50GB
query.max-memory-per-node=1GB
discovery.uri=http://example.net:8080
但是如果你用一台机器进行测试,那么这一台机器将会即作为coordinator,也作为worker。
对配置项解释如下:
coordinator:指定是否运维Presto实例作为一个coordinator(接收来自客户端的查询情切管理每个查询的执行过程)。
node-scheduler.include-coordinator:是否允许在coordinator服务中进行调度工作(即作为coordinator又作为worker。对于大型的集群,在一个节点上的Presto server即作为coordinator又作为worker将会降低查询性能。因为如果一个服务器作为worker使用,那么大部分的资源都会被worker占用,那么就不会有足够的资源进行关键任务调度、管理和监控查询执行。
http-server.http.port:指定HTTP server的端口。Presto 使用 HTTP进行内部和外部的所有通讯。
task.max-memory=1GB:一个单独的任务使用的最大内存 (一个查询计划的某个执行部分会在一个特定的节点上执行)。 这个配置参数限制的GROUP BY语句中的Group的数目、JOIN关联中的右关联表的大小、ORDER BY语句中的行数和一个窗口函数中处理的行数。 该参数应该根据并发查询的数量和查询的复杂度进行调整。如果该参数设置的太低,很多查询将不能执行;但是如果设置的太高将会导致JVM把内存耗光。
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一定不能以“/“结尾。
使用命令
vim config.properties
因为是单节点,ip为192.168.30.252,所以输入配置如下:
coordinator=true
node-scheduler.include-coordinator=true
http-server.http.port=8080
query.max-memory=50GB
query.max-memory-per-node=1GB
discovery-server.enabled=true
discovery.uri=http://192.168.30.252:8080
如图:
点击esc,输入:wq回车保存退出。
日志配置文件:etc/log.properties。在这个配置文件中允许你根据不同的日志结构设置不同的日志级别。每个logger都有一个名字(通常是使用logger的类的全标示类名). Loggers通过名字中的“.“来表示层级和集成关系。 (像java里面的包). 如下面的log配置信息:
com.facebook.presto=INFO
This would set the minimum level to INFO for both com.facebook.presto.server and com.facebook.presto.hive. The default minimum level is INFO (thus the above example does not actually change anything). There are four levels: DEBUG, INFO, WARN and ERROR.
使用命令
vim log.properties
因为考虑到info级别的日志输出会占比较多的空间,我们这里只要ERROR级别的错误。
输入配置
com.facebook.presto=ERROR
如图:
点击esc,输入:wq回车保存退出。
Presto通过connectors访问数据。这些connectors挂载在catalogs上。 connector可以提供一个catalog中所有的schema和表。 例如: Hive connector 将每个hive的database都映射成为一个schema, 所以如果hive connector挂载到了名为hive的catalog, 并且在hive的web有一张名为clicks的表, 那么在Presto中可以通过hive.web.clicks来访问这张表。
通过在etc/catalog目录下创建catalog属性文件来完成catalogs的注册。
例如:
如果要创建jmx数据源的连接器,可以创建一个etc/catalog/jmx.properties文件,文件中的内容如下,完成在jmxcatalog上挂载一个jmxconnector:
connector.name=jmx
如果要创建hive数据源的连接器,可以创建一个etc/catalog/hive.properties文件,文件中的内容如下,完成在hivecatalog上挂载一个hiveconnector:
connector.name=hive-hadoop2
hive.metastore.uri=thrift://example.net:9083
hive.config.resources=/etc/hadoop/conf/core-site.xml,/etc/hadoop/conf/hdfs-site.xml
参数说明
connector.name为连接器名称,hive的话需要加上版本号例如hive-hadoop2
hive.metastore.uri需要与hive的metastore地址和端口对应。
一般配置在/etc/hive/conf/hive-site.xml中。
hive.config.resources需要与hadoop集群的配置路径对应。
CDH安装的一般都在/etc/hadoop/conf路径下。
如图:
更多信息可以参考
hadoop基础—-hadoop实战(十一)—–hadoop管理工具—CDH的目录结构了解
我们这里要连接hive,所以应该配置hive的连接器。
使用命令
mkdir catalog
cd ./catalog
vim hive.properties
输入配置
connector.name=hive-hadoop2
hive.metastore.uri=thrift://192.168.30.252:9083
hive.config.resources=/etc/hadoop/conf/core-site.xml,/etc/hadoop/conf/hdfs-site.xml
更多连接器详细的信息参考
https://prestodb.io/docs/current/connector.html
如图:
点击esc,输入:wq回车保存退出。
配置完毕
最终etc的目录中配置文件如图:
在安装目录的bin/launcher文件,就是启动脚本。Presto可以使用如下命令作为一个后台进程启动:
cd /home/zzq/presto/presto-server-0.195
bin/launcher start
另外,也可以在前台运行, 日志和相关输出将会写入stdout/stderr(可以使用类似daemontools的工具捕捉这两个数据流):
cd /home/zzq/presto/presto-server-0.195
bin/launcher run
停止
cd /home/zzq/presto/presto-server-0.195
bin/launcher stop
Presto可以列出支持的命令和命令行选项。
cd /home/zzq/presto/presto-server-0.195
bin/launcher --help
另外可以查看服务进程命令
cd /home/zzq/presto/presto-server-0.195
bin/launcher status
查看进程: ps -aux|grep PrestoServer 或 jps
启动完之后,日志将会写在var/log目录下,该目录下有如下文件:
launcher.log: 这个日志文件由launcher创建,并且server的stdout和stderr都被重定向到了这个日志文件中。 这份日志文件中只会有很少的信息,包括:
在server日志系统初始化的时候产生的日志和JVM产生的诊断和测试信息。
server.log: 这个是Presto使用的主要日志文件。一般情况下,该文件中将会包括server初始化失败时产生的相关信息。这份文件会被自动轮转和压缩。
http-request.log: 这是HTTP请求的日志文件,包括server收到的每个HTTP请求信息,这份文件会被自动轮转和压缩。
下载 presto-cli-0.100-executable.jar:Presto CLI为用户提供了一个用于查询的可交互终端窗口。CLI是一个 可执行 JAR文件, 这也就意味着你可以像UNIX终端窗口一样来使用CLI ,下载地址(注意版本对应):
https://repo1.maven.org/maven2/com/facebook/presto/presto-cli/
我这里是0.195版本,使用命令
wget https://repo1.maven.org/maven2/com/facebook/presto/presto-cli/0.195/presto-cli-0.195-executable.jar
文件下载后,重名名为 presto,使用命令
mv presto-cli-0.195-executable.jar presto
使用 chmod +x 命令设置可执行权限
chmod a+x presto
在hive中查一下hive default库中的表
hive自带了一个thrift的客户端———-beeline
打开beeline
使用命令
beeline
连接hiveserver2
使用命令
!connect jdbc:hive2://host253:10000
(host253是hiveserver2所启动的那台主机名,端口默认是10000)
有可能需要输入当前linux用户名和密码。
正常连接上之后会出现
0: jdbc:hive2://host253:10000>
这时可以尝试操作数据库了,使用命令
show tables;
结果如下图:
ctrl+c退出hive cli,进入presto cli,使用命令如下:
./presto --server 192.168.30.252:8080 --catalog hive --schema default
如果要调试,可加 –debug, ip与端口必须与config.properties配置文件中的uri 地址一致,配置的IP就用IP,机器名就用机器名。
使用命令
show tables;
结果如图:
与hive中查询的一致,说明presto部署成功可以使用。
退出presto cli使用命令
quit;
我们在配置Presto多集群时,首先就是要规划架构和集群分配。
一般来说 需要一个coordinator和多个worker。
我们的机子如下
则分配如下:
hadoop1 (192.169.30.250):coordinator调度节点
hadoop2 (192.169.30.251):worker节点
hadoop3 (192.169.30.252):worker节点
hadoop4 (192.169.30.253):worker节点
hadoop5 (192.169.30.217):worker节点
根据单点安装时一样的步骤每一台机子进行下载解压。(也可以把单点时配置好的进行打包上传到其他机子解压)
根据每个节点的定位进行配置创建和修改。
因为大部分配置一样,所以我们把单点的配置打包下载分别上传到其他节点。
需要修改的配置如下:
Node Properties
使用命令
vim etc/node.properties
内容如下
node.environment=production
node.id=ffffffff-ffff-ffff-ffff-ffffffffffff
node.data-dir=/var/presto/data
这里每个节点的node.id需要不一样,比如在后面加上001、002等
Config Properties
coordinator调度节点使用命令
vim etc/config.properties
内容如下
coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8080
query.max-memory=50GB
query.max-memory-per-node=1GB
discovery-server.enabled=true
discovery.uri=http://192.168.30.217:8080
discovery.uri与coordinator调度节点的ip对应。
调度节点只负责调度时node-scheduler.include-coordinator设置为false
调度节点也作为worker时node-scheduler.include-coordinator设置为true
worker节点使用命令
vim etc/config.properties
内容如下
coordinator=false
http-server.http.port=8080
query.max-memory=50GB
query.max-memory-per-node=1GB
discovery.uri=http://192.168.30.217:8080
启动方式与单点的一样,每台都启动起来即可使用。
presto提供了Web的管理界面,可以查看多节点的情况。
根据端口来访问,比如8080,则访问
http://192.168.30.252:8080/