集群准备
测试环境目前3台机:
ip |
名称 |
角色 |
10.0.2.138 |
data-dev-staging-01 |
Coordinator |
10.0.2.139 |
data-dev-staging-02 |
Worker |
10.0.2.140 |
data-dev-staging-03 |
Worker |
Presto介绍
跟名字一样,Presto就是急板的,快的。
作为一个开源分布式SQL查询引擎,Presto用于对各种大小的数据源进行交互式分析查询。其本身是为交互式分析而设计和编写的,其速度接近商业数据仓库的速度。
Presto允许在数据所在地进行数据查询,包括Hive、Cassandra、RDBMS,一个Presto查询可以组合来自多个数据源的数据,且允许跨组织进行分析。我们选择Presto主要也是因为基于Hive的数据分析相对较慢,所以直接使用Presto查询Hive数据是更加快捷的。
Facebook使用Presto对几个内部数据存储进行交互式查询,包括他们的300PB数据仓库。且超过1000名Facebook员工每天使用Presto运行3万多个查询,每天总共扫描超过1PB。
Presto对比
常和Presto对比的包括以下组件:Druid、Kylin、Impala等。
按查询类型划分,OLAP一般分为即席查询和固化查询。
即席查询:通过手写sql完成一些临时的数据分析需求,这类sql形式多变、逻辑复杂,对查询时间没有严格要求
固化查询:指的是一些固化下来的取数、看数需求,通过数据产品的形式提供给用户,从而提高数据分析和运营的效率。这类的sql固定模式,对响应时间有较高要求。
按架构实现划分,主流OLAP引擎主要有三种:
MPP架构系统(Presto/Impala/SparkSQL/Drill等)。这种架构主要还是从查询引擎入手,使用分布式查询引擎,而不是使用hive+mapreduce架构,提高查询效率。
搜索引擎架构的系统(es,solr等),在入库时将数据转换为倒排索引,采用Scatter-Gather计算模型,牺牲了灵活性换取很好的性能,在搜索类查询上能做到亚秒级响应。但是对于扫描聚合为主的查询,随着处理数据量的增加,响应时间也会退化到分钟级。
预计算系统(Druid/Kylin等)则在入库时对数据进行预聚合,进一步牺牲灵活性换取性能,以实现对超大数据集的秒级响应。
一般来说,需要从以下三个方面考虑框架选型:数据存储和构建、安装搭建、开发成本。
名称 |
优点 |
缺点 |
Impala |
基于内存计算,速度快 |
完全依赖Hive,数据源支持非常少,对内存依赖非常大,稳定性也很差,分区超过1w,性能会严重下降 |
Presto |
基于内存计算,且比Hive快一个数量级,可连多个数据源 |
联查表会产生大量临时数据,速度变慢,网络瓶颈也是大问题 |
Druid |
索引按时间分片,查询也按时间线去路由索引,速度快。在高并发场景下,可保证海量数据查询分析的性能 |
配置和查询非常繁琐,且不支持SQL或类SQL接口。 |
Kylin |
核心是Cube,查询时只扫描索引不访问原始数据,速度快 |
与hadoop生态结合太深,对集群依赖非常强;查询维度需提前确定,不适合即席查询。运维成本也高。 |
SparkSQL |
Spark生态支持,可以实现Hive on Spark,内存计算 |
相对速度不是最快,适合完成批量任务 |
说到这里,就不得不说到ClickHouse,现在的问题是,ClickHouse学习成本极高,难度也极高。目前来说,ClickHouse可以解决现在大部分问题,但也是后续进行组件优化和升级之后的选择。
总结来说————
(1)从超大数据的查询效率来看:
Druid > Kylin > Presto > SparkSQL
(2)从支持的数据源种类来讲:
Presto > SparkSQL > Kylin > Druid
Presto安装
通过以下URL,下载本次安装对应版本的压缩包——————————
https://repo1.maven.org/maven2/com/facebook/presto/presto-server/0.241/presto-server-0.241.tar.gz
这个包,解压之后是这个样子的:
在etc目录下,需要自行创建配置文件如下:
config.properties(Coordinator):
coordinator=true node-scheduler.include-coordinator=false http-server.http.port=20080 query.max-memory=10GB query.max-memory-per-node=1GB query.max-total-memory-per-node=2GB discovery-server.enabled=true discovery.uri=http://data-dev-staging-01:20080
config.properties(Worker):
coordinator=false http-server.http.port=20080 query.max-memory=10GB query.max-memory-per-node=1GB query.max-total-memory-per-node=2GB discovery.uri=http://data-dev-staging-01:20080
jvm.config(每个节点):
-server -Xmx16G -XX:+UseG1GC -XX:G1HeapRegionSize=150M -XX:+UseGCOverheadLimit -XX:+ExplicitGCInvokesConcurrent -XX:+HeapDumpOnOutOfMemoryError -XX:+ExitOnOutOfMemoryError -DHADOOP_USER_NAME=root
log.properties(每个节点):
com.facebook.presto=WARN
node.properties(每个节点):
node.environment=staging node.id=staging-presto1 # 注意,不同节点的node.id需要唯一 node.data-dir=/data/presto
在etc/catalog/目录创建hive.properties(每个节点):
要使用hive数据源,所以必须配置hive.properties,需要注意的是:一般请不要直接指定-DHADOOP_USER_NAME属性,这个属性涉及到HDFS的ACL管理,当前环境下很容易报错。
connector.name=hive-hadoop2 hive.metastore.uri=thrift://data-dev-staging-01:9083,thrift://data-dev-staging-03:9083 hive.allow-drop-table=true hive.config.resources=/opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/lib/hadoop/etc/hadoop/core-site.xml,/opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/lib/hadoop/etc/hadoop/hdfs-site.xml
修改launcher启动脚本,添加以下内容:
JAVA_HOME=/usr/java/jdk1.8.0_181PATH=$JAVA_HOME/bin:$PATH
通过指定命令进行服务启动(每个节点):
bin/launcher start --server-log-file=logs/server.log
通过cli直接启动Presto,需要提前下载官网给出的executable压缩包:
https://repo1.maven.org/maven2/com/facebook/presto/presto-cli/0.241/presto-cli-0.241-executable.jar
并将其上传到Coordinator节点之后,改名:
mv presto-cli.0.241-executable.jar /opt/presto-server-0.241/bin/presto
启动Presto-cli:
bin/presto --server data-dev01:20080 --catalog hive --schema default
最终可通过指定域名进行Presto的Web监控:
在此Web界面,可以直接获得每次查询结果。
安装过程,可以参考官方文档进行安装:
https://prestodb.io/docs/current/installation/deployment.html
多数据源的支持
Presto最大的优点就是,多数据源支持,这一个特点,在分布式数据分析引擎下其实是很占优势的。因为现在很多数据存放在不同的地点,如果每个数据源都做一套数据接入,本身也会占用很多的开发时间。
现在Presto提供的Connector如下:
注意:通过Presto,我们可以直接对Hive数据进行分析查询,甚至对ES数据也可以直接进行搜索查询,那么把查询分析的压力相当于移交到了Presto之后,就不再是像以前计划的比如数据分析直接放在Hive,通过Hive+MR的方式来分析,这个环节就很节省时间了,所以同步进行系统架构改进,会在Hive上面直接加一层Presto。
相关错误排查
最容易出现错误的点是配置问题
1、node.properties中针对节点名node.id需要配置得节点唯一
2、config.properties的配置中 discovery.uri最好是加映射,映射+port不行才考虑IP
3、jvm.config可以选择G1 GC,也可选择CMS GC
4、hive.properties的配置中hive.metastore.uri,需要和Hive本身的hive-site.xml中属性一致,此文件的所在位置:
5、在配置的时候注意,config.properties中Coordinator节点一定不要忘记加discovery-server.enabled=true,Worker节点一定不要加discovery-server.enabled=true。
其他
【2021-06-18新增】
1、添加Presto权限控制:
vim access-control.properties access-control.name=file security.config-file=/opt/presto-server-0.241/etc/rules.json rules.json: { "catalogs": [ { "user": "admin", "catalog": "(hive|system)", "allow": true }, { "catalog": "hive", "allow": true }, { "catalog": "system", "allow": false } ] }
2、添加账户密码:
vim password-authenticator.properties admin:big***2021 public:big***2021 staging:big***2021
3、添加hive安全控制:
vim catalog/hive-security.json { "schemas": [ { "user": "admin", "schema": ".*", "owner": true }, { "user": "public", "schema":".*", "owner": false }, { "user": "staging", "schema": ".*", "owner": false } ], "tables": [ { "user": "admin", "privileges": ["SELECT", "OWNERSHIP"] }, { "user": "public", "table": "sensors_db.*", "privileges": ["SELECT"] }, { "user": "staging", "privileges": ["SELECT"] } ] }