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架构
3. Presto 优缺点
4. Presto、Impala性能比较
Impala性能稍领先于Presto,但是Presto在数据源支持上非常丰富,包括Hive、图数据库、传统关系型数据库、Redis等
性能比较参考
5. Presto 安装
5.1 资源下载, 下载地址
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
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
参数说明:
- query.max-memory查询的最大内存。
- query.max-memory-per-node 每个节点可以使用的最大内存。
- 我这里是2个worker,所以设置4g。如果机器内存比较大,可以把每个节点机器的可用内存从2g往上调整大一些。具体参考以下网址和警醒,参考网址:https://www.jianshu.com/p/f2b7d1550884
- config.properties文件中query.max-memory属性的值不能大于jvm.config文件中-Xmx属性的值。
- 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
说明:
- hive.metastore.uri具体值是通过CDH集群的hive配置文件/etc/hive/conf/hive-site.xml查看
- 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节点后,各自修改如下配置文件即可:
- 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配置项
- 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
- 前台启动
[root@server-3 presto]#bin/launcher run
[root@server-4 presto]#bin/launcher run
[root@server-5 presto]#bin/launcher run
- 后台启动
[root@server-3 presto]#bin/launcher start
[root@server-4 presto]#bin/launcher start
[root@server-5 presto]#bin/launcher start
- 日志查看路径
/data/presto/var/log
然后访问页面访问页面:http://server-3:9999/
注意:这里的IP写的是coordinator的IP
7. Presto命令行 Client 安装
将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用户授权,操作如下:
- 添加root用户组
- 添加root用户
- root
以上是关于CDH6.3.0集成Presto实战的主要内容,如果未能解决你的问题,请参考以下文章
整合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