Presto 安装与部署

1. Hive

Presto 在访问 Hive 中的数据时需要得到 Hive 中的所有元数据信息,因此需要部署一个 HiveMetaStore 服务提供 Hive 的元数据信息。

启动 HiveMetaStore 服务的命令如下:

nohup hive --service metastore -p 9083 > /Users/smartsi/opt/hive/logs/metastore.log 2>&1 &

上述表示在后台启动 Hive 的 MetaStore 服务,MetaStore 服务监听 9083 端口,并将错误和常规日志输出到日志文件 /Users/smartsi/opt/hive/logs/metastore.log 中。

Hive版本:2.3.6
Hadoop版本:2.7.7

2. Presto

Presto版本:0.231.1

2.1 安装

运行如下命令将 Presto 解压到工作目录 ~/opt 下:

tar -zxvf presto-server-0.231.1.tar.gz -C ~/opt/

创建软连接便于升级:

ln -s presto-server-0.231.1/ presto

这样我们就安装完成了,看一下 Presto 目录内容:

smartsi:opt smartsi$ cd presto
smartsi:presto smartsi$ ll
total 384
drwxr-xr-x 7 smartsi staff 224 2 16 11:20 ./
drwxrwxrwx 40 smartsi staff 1280 2 16 11:24 ../
-rw-r--r-- 1 smartsi staff 191539 4 9 2019 NOTICE
-rw-r--r-- 1 smartsi staff 126 4 17 2019 README.txt
drwxr-xr-x 6 smartsi staff 192 2 5 11:59 bin/
drwxr-xr-x 149 smartsi staff 4768 2 16 11:20 lib/
drwxr-xr-x 31 smartsi staff 992 2 16 11:20 plugin/

2.2 配置

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

  • 节点属性:每个节点的环境配置信息。
  • JVM 配置:JVM的命令行选项。
  • 配置属性:Presto Server的配置信息。
  • Catalog属性:Connectors(数据源)的配置信息

2.2.1 node.properties

在每个 Presto 节点上都需要进行节点属性配置。node.properties 配置文件包含针对于每个节点的特定的配置信息。配置文件至少包含如下配置信息:

node.environment=prod
node.id=D17FDC86-8113-4AF0-9EC2-681A45ECFC2E
node.data-dir=/Users/smartsi/opt/presto/data

配置说明:

  • node.environment:Presto 运行环境名称。属于同一个集群中的 Presto 节点必须拥有相同的运行环境名称。
  • node.id:每个 Presto 节点的唯一标示。属于同一个集群的每个 Presto 节点的 node.id 必须是不同的。在 Presto 进行重启或者升级过程中每个节点的 node.id 必须保持不变。如果在一个节点上安装多个 Presto 实例(例如:在同一台机器上安装多个 Presto 节点),那么每个 Presto 节点必须拥有唯一的 node.id。可以使用 Linux 命令 uuidgen 生成 uuid 来指定该属性的内容。
  • node.data-dir:数据存储目录的位置。Presto 将会把日志以及其它的 Presto 数据存储在这个目录下。

2.2.2 jvm.config

Presto 开发语言是 Java,每个 Presto 服务进程都是运行在 JVM 之上的,因此需要在 JVM 的配置文件中指定 Presto 服务进程的 Java 运行环境。该配置文件包含一系列在启动 JVM 时需要使用的命令行选项。这份配置文件的格式为:每行一个命令行参数。由于该配置文件中的内容不会被 Shell 使用。因此即使某一行命令行参数包含了空格或者其他的特殊字符,也不需要使用引号括起来。一个典型的 JVM 配置文件如下:

-server
-Xmx5G
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:OnOutOfMemoryError=kill -9 %p

由于 OutOfMemoryError 会导致 JVM 处于不一致状态,所以遇到这种错误的时候我们一般的处理措施就是将dump headp中的信息(用于debugging),然后强制终止进程。

2.2.3 config.properties

在 Presto 集群中,每个节点都上都会启动一个 Presto 服务进程,该配置文件的配置项会应用于每个 Presto 的服务进程。每个服务进程既可以作为 Coordinator 也可以作为 Worker。但是在一个大型集群中,应该选定一个特定节点上的 Presto 服务进程只作为 Coordinator 提供服务,这样会提供更加卓越的性能。

Presto 集群中 Coordinator 节点的配置文件内容如下:

coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8001
query.max-memory=50GB
query.max-memory-per-node=1GB
query.max-total-memory-per-node=2GB
discovery-server.enabled=true
discovery.uri=http://localhost:8001

Presto 集群中 Worker 节点的配置文件内容如下:

coordinator=false
node-scheduler.include-coordinator=true
http-server.http.port=8001
query.max-memory=50GB
query.max-memory-per-node=1GB
query.max-total-memory-per-node=2GB
discovery-server.enabled=true
discovery.uri=http://localhost:8001

如果我们只是使用一台机器用于测试,这台服务器既可以作为 Coordinator 也可以作为 Worker,那么就需要将配置属性 coordinatornode-scheduler.include-coordinator 设置为 true

coordinator=true
node-scheduler.include-coordinator=true
http-server.http.port=8001
query.max-memory=50GB
query.max-memory-per-node=1GB
query.max-total-memory-per-node=2GB
discovery-server.enabled=true
discovery.uri=http://localhost:8001

具体配置详细如下:

  • coordinator:是否指定当前节点作为 Coordinator 节点,即当前节点可以接收来自客户端的查询请求,并且管理每个查询的执行过程。在 Presto 集群中 Coordinator 节点上配置文件中该属性值为 true,Worker 节点上配置文件中该属性值为 false。需要注意的是在 Coordinator 节点的配置文件和 Worker 节点的配置文件中该属性值是不同的。
  • node-scheduler.include-coordinator:是否允许在 Coordinator 节点上执行计算任务。若允许执行计算任务,则 Coordinator 节点除了要接受客户端的查询请求,管理查询的执行过程外,还需要执行普通的计算任务。在大型的集群中,若在 Coordinator 节点上执行计算任务,反而会影响查询、生成查询计划和调度的效率,因为对于一些需要大量资源的计算任务,Coordinator 的大部分资源可能会被用于执行计算任务或者根本不能提供大型计算任务所需要的资源。
  • http-server.http.port:指定HTTP服务器的端口。Presto 通过 HTTP 协议进行内部和外部的所有通信。
  • query.max-memory:单个查询可以使用的最大内存。
  • query.max-memory-per-node:单个查询可在一个节点上使用的最大用户内存(user memory)。
  • query.max-total-memory-per-node:单个查询可在一个节点上使用的最大用户和系统内存(user memory + system memory)。
  • discovery-server.enabled:Presto 使用 Discovery 服务来查找集群中所有节点。每个 Presto 实例在启动时都会向 Discovery 服务注册自己。Presto 为了简化部署,并且为了避免再增加一个新的服务,Presto 的 Coordinator 可以运行一个内嵌在 Coordinator 里面的 Discovery 服务。内嵌的 Discovery 服务与 Presto 共享 HTTP Server 并且使用相同的端口。
  • discovery.uri:Discovery 服务的URI。因为我们已经将 Discovery 内嵌在 Coordinator 服务中,因此该 URI 就是 Presto 的 Coordinator 服务的 URI。例如,URI:http://localhost:8001,该 URI 其实就是 Coordinator 的 URI。注意:这个URI一定不能以/结尾。

2.2.4 log.properties

可以在这个配置文件中设置 Logger 的最小日志级别。每个 Logger 都有一个具有层级关系的名字,通常是使用 Logger 类的全限定类名。所有的 Logger 都会基于名称拥有一个层级继承关系:

com.facebook.presto=INFO

上面日志级别的设置表示:对于使用 Logger 的 com.facebook.presto.servercom.facebook.presto.hive 类来说,两者的最小日志级别均为 INFO。在 Presto 的日志配置文件中可以设置的日志级别一共4个:INFO、DEBUG、WARN、ERROR。

2.2.5 catalog properties

关于 Catalog 的配置,首先需要创建 etc/catalog 目录,然后根据你想使用的连接器来创建对应的配置文件,比如,你想使用 JMX 连接器,则创建 jmx.properties

connector.name=jmx

如果你想使用 Hive 的连接器,则创建 hive.properties

drwxr-xr-x  8 smartsi  staff  256  2 16 11:27 ../
connector.name=hive-hadoop2
hive.metastore.uri=thrift://localhost:9083
hive.config.resources=/Users/smartsi/opt/hadoop/ect/hadoop/core-site.xml,/Users/smartsi/opt/hadoop/ect/hadoop/hdfs-site.xml,/Users/smartsi/opt/hadoop/ect/hadoop/mapred-site.xml
hive.allow-drop-table=true
hive.allow-rename-table=true

2.3 运行

你可以使用下面命令后台启动:

bin/launcher start

也可以前台启动,观察输出日志:

bin/launcher run

另外,你也可以通过下面命令停止:

bin/launcher stop

2.4 测试

下载 presto-cli-0.231.1-executable.jar,添加执行权限并为其创建软连接 presto-cli

ln -s presto-cli-0.231.1-executable.jar presto-cli
sudo chmod 777 presto-cli-0.231.1-executable.jar

进入 Presto 客户端:

smartsi:presto smartsi$ ./presto-cli --server localhost:8001 --catalog hive --schema default
presto:default>

可以通过查看 Hive 表来判断是否创建成功:

presto:default> show tables;
Table
------------------------------
dws_app_pub_region_device_td
(1 row)

Query 20200216_094252_00006_advvt, FINISHED, 1 node
Splits: 19 total, 19 done (100.00%)
0:00 [1 rows, 45B] [2 rows/s, 109B/s]

presto:default>

上述可以看到我们连接 Hive 元数据成功了。

我们还可以访问其UI:http://localhost:8001/。

欢迎关注我的公众号和博客:

赏几毛白!