CDH6.3.0集成Presto实战

Posted 木秋的夏天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CDH6.3.0集成Presto实战相关的知识,希望对你有一定的参考价值。

1. presto概念

Presto是一个开源的分布式SQL查询引擎,数据量支持GB到PB字节,主要用来处理秒级查询的场景。

注意:虽然Presto可以解析SQL,但他不是一个标准的数据库,不是MyQL、Oracle的代替品,也不能用来处理在线事务(OLTP)。

2. Presto架构

CDH6.3.0集成Presto实战_presto

3. Presto 优缺点

CDH6.3.0集成Presto实战_presto_02

4. Presto、Impala性能比较

Impala性能稍领先于Presto,但是Presto在数据源支持上非常丰富,包括Hive、图数据库、传统关系型数据库、Redis等

​性能比较参考​

5. Presto 安装

5.1 资源下载​​, 下载地址​

CDH6.3.0集成Presto实战_presto_03

5.2 集群安装主机列表

主机IP

主机名

职责

192.168.116.42

server-3

coordinator

192.168.116.43

server-4

worker

192.168.116.44

server-5

worker

Presto是由一个coordinator节点和多个worker节点组成。在server-3上配置成coordinator,在server-4、server-5上配置为worker

5.3 安装jdk

注:jdk版本在1.8以上,所有主机都安装

安装好后配置环境变量,vim /etc/profile.d/jdk.sh

#set default jdk1.8 env
JAVA_HOME=/usr/java/jdk1.8.0_181-cloudera
JRE_HOME=/usr/java/jdk1.8.0_181-cloudera/jre
PATH=$PATH:$JAVA_HOME/bin
export JAVA_HOME JRE_HOME PATH

执行:source /etc/profile 使配置生效

5.4 Presto server安装

将下载好的​​presto-server-0.267.tar.gz​​上传到server-3主机的/opt下并 解压,如下:

[root@server-3 opt]# tar -zxvf  presto-server-0.267.tar.gz
[root@server-3 opt]# mv presto-server-0.267.tar.gz prestocli
[root@server-3 opt]# ll
total 1173068
drwxr-xr-x. 6 cloudera-scm cloudera-scm 67 Dec 27 02:00 cloudera
drwxr-xr-x. 10 flink flink 156 Jul 23 07:06 flink-1.13.2
drwxr-xr-x. 6 root root 85 Jan 13 02:22 presto
-rwxr-xr-x. 1 root root 15551203 Jan 13 04:27 prestocli
-rw-r--r--. 1 root root 1185668826 Jan 13 02:18 presto-server-0.267.tar.gz
lrwxrwxrwx. 1 root root 20 Jan 12 03:42 waterdrop -> waterdrop-dist-2.0.4
drwxr-xr-x. 6 root root 72 Jan 12 03:38 waterdrop-dist-2.0.4

5.5 创建presto配置文件

[root@server-3 opt]# cd /opt/presto
[root@server-3 opt]# mkdir etc && cd etc
[root@server-3 opt]# touch node.properties jvm.config config.properties log.properties
[root@server-3 opt]# mkdir catalog

CDH6.3.0集成Presto实战_hive_04

5.5.1 配置node.properties

vim  node.properties

node.environment=bigdata_presto_cluster
node.id=node-1
node.data-dir=/data/presto

说明:/data/presto自动创建

5.5.2 配置jvm.config

vim jvm.config

-server
-Xmx8G
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError

5.5.3 配置config.properties

vim config.properties

coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=9999
query.max-memory=4GB
query.max-memory-per-node=2GB
discovery-server.enabled=true
discovery.uri=http://incubator-t3-infra010:9999

参数说明:

  1. query.max-memory查询的最大内存。
  2. query.max-memory-per-node 每个节点可以使用的最大内存。
  3. 我这里是2个worker,所以设置4g。如果机器内存比较大,可以把每个节点机器的可用内存从2g往上调整大一些。具体参考以下网址和警醒,参考网址:https://www.jianshu.com/p/f2b7d1550884
  4. config.properties文件中query.max-memory属性的值不能大于jvm.config文件中-Xmx属性的值。
  5. discovery.uri的主机地址写coordinator机器的IP。

5.5.4 配置log.properties

vim log.properties

com.facebook.presto=INFO

5.5.5 配置Catalog Properties

Presto可以支持多个数据源,在Presto里面叫catalog,这里我们配置支持Hive的数据源,配置一个Hive的catalog

vim catalog/hive.properties

connector.name=hive-hadoop2
hive.metastore.uri=thrift://server-1:9083
hive.config.resources=/etc/hive/conf/hdfs-site.xml,/etc/hive/conf/core-site.xml

说明:

  1. hive.metastore.uri具体值是通过CDH集群的hive配置文件/etc/hive/conf/hive-site.xml查看
  2. hive.config.resources文件要找到hive的2个xml文件的具体路径,hdfs-site.xml 以及core-site.xml 路径用逗号隔开.

至此,coordinator节点的配置文件就配置完了,配置另外两台work节点。

把presto整个文件夹scp到其他节点的对应目录下:

scp -r presto 192.168.116.43:/opt/
scp -r presto 192.168.116.44:/opt/

presto拷贝至worker节点后,各自修改如下配置文件即可:

  1. config.properties
coordinator=false
node-scheduler.include-coordinator=false
http-server.http.port=9999
query.max-memory=4GB
query.max-memory-per-node=2GB
discovery.uri=http://server-3:9999

说明:

  • discovery.uri的主机IP依然写coordinator机器的hostname
  • coordinator参数改为false
  • 删除discovery-server.enabled=true配置项


  1. node.properties
node.environment=bigdata_presto_cluster
node.id=node-2
node.data-dir=/data/presto

说明:所有节点的node.id节点值不能一样。

6. 集群启动

分别在server-3、server-4、server-5上启动Presto Server

  1. 前台启动
[root@server-3 presto]#bin/launcher run
[root@server-4 presto]#bin/launcher run
[root@server-5 presto]#bin/launcher run
  1. 后台启动
[root@server-3 presto]#bin/launcher start
[root@server-4 presto]#bin/launcher start
[root@server-5 presto]#bin/launcher start
  1. 日志查看路径
/data/presto/var/log

然后访问页面访问页面:http://server-3:9999/

注意:这里的IP写的是coordinator的IP

CDH6.3.0集成Presto实战_hive_05

7. Presto命令行 Client 安装

CDH6.3.0集成Presto实战_presto_06


将presto-cli-0.267-executable.jar上传到server-03的/opt下:

修改如下:

[root@server-3 opt]# mv presto-cli-0.267-executable.jar prestocli
[root@server-3 opt]# chmod +x prestocli

启动prestocli

[root@server-3 opt]# ./prestocli --server server-3:9999 --catalog hive --schema default
presto:default> show tables;
Table
-------------
dept
emp
movie_info
movie_info3
movie_info4
person_info
t11
t13
t17
t19
t2
t3
t4
t7
t8
t9
(16 rows)

Query 20220113_091935_00036_4wqb8, FINISHED, 3 nodes
Splits: 36 total, 36 done (100.00%)
0:01 [16 rows, 346B] [26 rows/s, 576B/s]
presto:default> select * from movie_info;
movie | category
---------------+--------------------------------
《疑犯追踪》 | [悬疑, 动作, 科幻, 剧情]
《Lie to me》 | [悬疑, 警匪, 动作, 心理, 剧情]
《战狼 2》 | [战争, 动作, 灾难]
(3 rows)

Query 20220113_094831_00050_4wqb8, FINISHED, 2 nodes
Splits: 17 total, 17 done (100.00%)
0:02 [3 rows, 134B] [1 rows/s, 72B/s]

说明:

  • --schema default 指定要操作的库,也可以不加
  • presto登陆hive后查看库,不能执行show databases ,要执行show schema;

8. Presto优化之数据存储

8.1 只选择使用的字段

由于采用列式存储,选择需要的字段可加快字段的读取、减少数据量。避免采用*读取所有字段。

  • [GOOD]: SELECT time, user, host FROM tbl
  • [BAD]:  SELECT * FROM tbl

8.2 过滤条件必须加上分区字段

对于有分区的表,where语句中优先使用分区字段进行过滤。acct_day是分区字段,visit_time是具体访问时间。

  • [GOOD]: SELECT time, user, host FROM tbl where acct_day=20171101
  • [BAD]:  SELECT * FROM tbl where visit_time=20171101

8.3 Group By语句优化

合理安排Group by语句中字段顺序对性能有一定提升。将Group By语句中字段按照每个字段distinct数据多少进行降序排列。

  • [GOOD]: SELECT GROUP BY uid, gender
  • [BAD]:  SELECT GROUP BY gender, uid

8.4 Order by时使用Limit

Order by需要扫描数据到单个worker节点进行排序,导致单个worker需要大量内存。如果是查询Top N或者Bottom N,使用limit可减少排序计算和内存压力。

  • [GOOD]: SELECT * FROM tbl ORDER BY time LIMIT 100
  • [BAD]:  SELECT * FROM tbl ORDER BY time

8.5 使用Join语句时将大表放在左边

Presto中join的默认算法是broadcast join,即将join左边的表分割到多个worker,然后将join右边的表数据整个复制一份发送到每个worker进行计算。如果右边的表数据量太大,则可能会报内存溢出错误。

  • [GOOD] SELECT ... FROM large_table l join small_table s on l.id = s.id
  • [BAD] SELECT ... FROM small_table s join large_table l on l.id = s.id

8.6 字段名引用

避免和关键字冲突:MySQL对字段加反引号`、Presto对字段加双引号分割,当然,如果字段名称不是关键字,可以不加这个双引号。

8.7 时间函数

/*mysql的写法*/
SELECT t FROM a WHERE t > 2017-01-01 00:00:00;

/*Presto中的写法*/
SELECT t FROM a WHERE t > timestamp 2017-01-01 00:00:00;

8.8 不支持INSERT OVERWRITE语法

Presto中不支持insert overwrite语法,只能先delete,然后insert into。

8.9 PARQUET格式

Presto目前支持Parquet格式,支持查询,但不支持insert。

9. FAQ

报错如下:

presto:default> select * from movie_info;

Query 20220113_091608_00033_4wqb8, FAILED, 1 node
Splits: 16 total, 0 done (0.00%)
236ms [0 rows, 0B] [0 rows/s, 0B/s]

Query 20220113_091608_00033_4wqb8 failed: Permission denied: user=root, access=READ_EXECUTE, inode="/user/hive/warehouse/movie_info":hive:hive:drwxrwx--x
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:400)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:262)
at org.apache.sentry.hdfs.SentryINodeAttributesProvider$SentryPermissionEnforcer.checkPermission(SentryINodeAttributesProvider.java:86)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:194)
at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:1855)
at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:1839)
at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPathAccess(FSDirectory.java:1789)
at org.apache.hadoop.hdfs.server.namenode.FSDirStatAndListingOp.getListingInt(FSDirStatAndListingOp.java:79)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getListing(FSNamesystem.java:3735)
at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getListing(NameNodeRpcServer.java:1138)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.getListing(ClientNamenodeProtocolServerSideTranslatorPB.java:708)
at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:523)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:991)
at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:869)
at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:815)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1875)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2675)

如上报错是因为hive开启了sentry权限管理,需要在hue里给root用户授权,操作如下:

  1. 添加root用户组

CDH6.3.0集成Presto实战_presto_07

  1. 添加root用户

CDH6.3.0集成Presto实战_presto_08

  1. root

以上是关于CDH6.3.0集成Presto实战的主要内容,如果未能解决你的问题,请参考以下文章

CDH6.3.0上配置各种对象存储

整合Apache Hudi+Mysql+FlinkCDC2.1+CDH6.3.0

Streamsets 安装额外Stage包——CDH6.3.0包报错REST API call error: java.io.EOFException

Streamsets 安装额外Stage包——CDH6.3.0包报错REST API call error: java.io.EOFException

dbt 集成presto试用

动态代码生成技术在 Presto 中使用简介