Presto入门介绍
有须要的自取~php
1.1 定义
Presto是一个分布式的查询引擎,自己并不存储数据,可是能够接入多种数据源,而且支持跨数据源的级联查询。Presto是一个OLAP的工具,擅长对海量数据进行复杂的分析;可是对于OLTP场景,并非Presto所擅长,因此不要把Presto当作数据库来使用。
和你们熟悉的Mysql相比:首先Mysql是一个数据库,具备存储和计算分析能力,而Presto只有计算分析能力;其次数据量方面,Mysql做为传统单点关系型数据库不能知足当前大数据量的需求,因而有各类大数据的存储和分析工具产生,Presto就是这样一个能够知足大数据量分析计算需求的一个工具。
1.2 数据源
Presto须要从其余数据源获取数据来进行运算分析,它能够链接多种数据源,包括Hive、RDBMS(Mysql、Oracle、Tidb等)、Kafka、MongoDB、Redis等
一条Presto查询能够将多个数据源的数据进行合并分析。
好比:select * from a join b where a.id=b.id;,其中表a能够来自Hive,表b能够来自Mysql。
1.3 优点
Presto是一个低延迟高并发的内存计算引擎,相比Hive,执行效率要高不少。
举例:
SELECT id,
name,
source_type,
created_at
FROM dw_dwb.dwb_user_day
WHERE dt='2018-06-03'
AND created_at>’2018-05-20’;
上述SQL在Presto运行时间不到1秒钟,在Hive里要几十秒钟。
1.4数据模型
Presto使用Catalog、Schema和Table这3层结构来管理数据。
---- Catalog:就是数据源。Hive是数据源,Mysql也是数据源,Hive 和Mysql都是数据源类型,能够链接多个Hive和多个Mysql,每一个链接都有一个名字。一个Catalog能够包含多个Schema,你们能够经过show catalogs 命令看到Presto链接的全部数据源。
---- Schema:至关于一个数据库实例,一个Schema包含多张数据表。show schemas from 'catalog_name'可列出catalog_name下的全部schema。
---- Table:数据表,与通常意义上的数据库表相同。show tables from 'catalog_name.schema_name'可查看'catalog_name.schema_name'下的全部表。
在Presto中定位一张表,通常是catalog为根,例如:一张表的全称为 hive.test_data.test,标识 hive(catalog)下的 test_data(schema)中test表。
能够简理解为:数据源的大类.数据库.数据表。
2,Presto与Hive
Hive是一个基于HDFS(分布式文件系统)的一个数据库,具备存储和分析计算能力, 支持大数据量的存储和查询。Hive 做为数据源,结合Presto分布式查询引擎,这样大数据量的查询计算速度就会快不少。
Presto支持标准SQL,这里须要提醒你们的是,在使用Hive数据源的时候,若是表是分区表,必定要添加分区过滤,不加分区扫描全表是一个很暴力的操做,执行效率低下而且占用大量集群资源,你们尽可能避免这种写法。
这里提到Hive分区,我简单介绍一下概念。Hive分区就是分目录,把一个大的数据集根据业务须要分割成更细的数据集。
举例:假如一个表的数据都放在/user/xiaoming/table/目录下,若是想把数据按照天天的数据细分,则就变成/user/xiaoming/table/2018-06-01/,/user/xiaoming/table/2018-06-02/,……若是查询某一天的数据,就能够直接取某一天目录下的数据,不须要扫描其余天的数据,节省了时间和资源。
使用Presto:
3,Presto接入方式
Presto的接入方式有多种:presto-cli,pyhive,jdbc,http,golang,SQLAlchemy,PHP等,其中presto-cli是Presto官方提供的,下面以presto-cli为例展开说明(自行下载)。
以链接hive数据源为例,在电脑终端输入:./presto-cli.jar --server presto.xxx-apps.com:9200 --catalog hive --user xxxx --source 'pf=adhoc;client=cli'就能够进入presto终端界面。
先解释下各参数的含义:
--server 是presto服务地址;
--catalog 是默认使用哪一个数据源,后面也能够切换,若是想链接mysql数据源,使用mysql数据源名称便可;
--user 是用户名;
--source 是表明查询来源,source设置格式为key=value形式(英文分号分割); 例如我的从command line查询应设置为pf=adhoc;client=cli。
进入终端后:
查看数据源: show catalogs;
查看数据库实例:show schemas;
Presto使用手册:https://prestodb.io/docs/current/
问答:
1.使用场景?
-mysql跨数据库查询;-数仓的表数据查询(数据分析) ...
2.为何presto查询速度比Hive快?
presto是常驻任务,接受请求当即执行,全内存并行计算;hive须要用yarn作资源调度,接受查询须要先申请资源,启动进程,而且中间结果会通过磁盘。
开源OLAP引擎测评报告(SparkSql、Presto、Impala、HAWQ、ClickHouse、GreenPlum)
易观CTO 郭炜 序 如今大数据组件很是多,众说不一,在每一个企业不一样的使用场景里究竟应该使用哪一个引擎呢?这是易观Spark实战营出品的开源Olap引擎测评报告,团队选取了Hive、Sparksql、Presto、Impala、Hawq、Clickhouse、Greenplum大数据查询引擎,在原生推荐配置状况下,在不一样场景下作一次横向对比,供你们参考。 每一年易观都会发布一次这样的大数据开源测评报告,欢迎你们给出更好的测评意见以及想要测试的组件。易观Spark实战营是易观大数据技术团队组织的针对大数据初学者的实战训练营,欢迎搜索访问“易观数据极客社区”,在文章后留言,交流最新最全的大数据技术。mysql
目录git
开源OLAP框架基线测试报告 |
---|
1、测试方案 |
1.1 测试总体方案 |
1.2 TPC-DS测试与单表测试方案及数据准备 |
1.3 环境准备 |
2、测试组件介绍 |
2.1 SparkSql |
2.2 Presto |
2.3 Impala |
2.4 HAWQ |
2.5 ClickHouse |
2.6 Hive |
2.7 Greenplum |
3、性能测试分析 |
3.1 数据压缩 |
3.2 性能测试 |
3.2.1 多表关联查询对比测试 |
3.2.2 单表查询对比测试 |
3.3 性能测试结果分析 |
4、各组件综合分析比较 |
1、测试方案
1.1测试总体方案
本次测试针对现有Olap的7大Sql引擎Hadoop(2.7)、Hive(2.1)、Hawq(3.1.2.0)、Presto(0.211)、Impala(2.6.0)、Sparksql(2.2.0)、Clickhouse(18.1.0-1.El7)、Greenplum(5.7.0) 基础性能测试。咱们采用多表关联和单大表性能分别对比不一样组件在查询性能、系统负载等方面的状况,测试方案以下:github
- 1,多表关联采用Tpc-Ds基准测试工具生成相应测试语句和数据进行测试,
- 2,单大表测试一样选用Tpc-Ds基准测试工具生成的最大数据量的表,并采用咱们选用的一些常规性聚合语句进行测试。
1.2 TPC-DS测试与单表测试方案及数据准备
TPC-DS采用星型、雪花型等多维数据模式。它包含7张事实表,17张维度表平均每张表含有18列。其工做负载包含99个SQL查询,覆盖SQL99和2003的核心部分以及OLAP。这个测试集包含对大数据集的统计、报表生成、联机查询、数据挖掘等复杂应用,测试用的数据和值是有倾斜的,与真实数据一致。能够说TPC-DS是与真实场景很是接近的一个测试集,也是难度较大的一个测试集。golang
TPC-DS的这个特色跟大数据的分析挖掘应用很是相似。Hadoop等大数据分析技术也是对海量数据进行大规模的数据分析和深度挖掘,也包含交互式联机查询和统计报表类应用,同时大数据的数据质量也较低,数据分布是真实而不均匀的。所以TPC-DS成为客观衡量多个不一样Hadoop版本以及SQL on Hadoop技术的最佳测试集。sql
本次测试采用TPC-DS提供的dsdgen命令工具生成指定量级的测试数据,咱们指定数据量级为100G。数据库
生成的各个表的数据量以下:
编程
经过使用dsqgen命令根据TPC-DS提供的模板生成不一样类型的SQL语句,TPC-DS默认支持如下模板:db2.tpl
、netezza.tpl
、oracle.tpl
、sqlserver.tpl
。咱们经过命令生成sqlserver.tpl
模板的SQL语句,分别对其进行细微的修改使其符合不一样的olap引擎支持的语法规则。centos
对于多表关联测试,咱们从中选取了15条有表明性的sql语句(见附件二),几乎全部的测试案例都有很高的IO负载和CPU计算需求,涵盖了几乎全部的业务场景。
对于单大表测试,咱们选择TPC-DS生成的测试数据集中数据量最大的表store_sales
,并选用了9条使用频率高的常规性聚合sql语句进行测试(见附件三)。
1.3环境准备
本次测试方案的硬件环境使用三台物理机,*做系统为centos7,基础配置信息以下表:
服务器 | cpu核数 | cpu线程数 | 内存大小 | 磁盘空间 |
---|---|---|---|---|
server1 | 4 | 16 | 64g | 2T |
server2 | 4 | 16 | 64g | 2T |
server3 | 4 | 16 | 64g | 2T |
本次测试各组件搭建的版本信息以下:Hadoop(2.7)、Hive(2.1)、HAWQ(3.1.2.0)、Presto(0.211)、Impala(2.6.0)、sparksql(2.2.0)、clickhouse(18.1.0-1.el7)、greenplum(5.7.0),全部组件都采用分布式搭建于三台服务器,并配置每台服务器上查询最大使用内存20g,cpu 8线。
各个Olap引擎经过各自的方式建立表结构,导入数据。Hive使用Orc格式的内部表;Impala使用Hive上的Parquet格式数据;Presto使用Hive上的Orc格式数据;Hawq创建内部表使用默认Txt格式;Clickhouse使用Log表引擎分布式建表。
2、测试组件介绍
2.1 SparkSql
Spark SQL 是 Spark 处理结构化数据的程序模块。它将 SQL 查询与 Spark 程序无缝集成,能够将结构化数据做为 Spark 的 RDD 进行查询。RDD 的全称为 Resilient Distributed Datasets,即弹性分布式数据集,是 Spark 基本的数据结构。Spark 使用 RDD 做为分布式程序的工做集合,提供一种分布式共享内存的受限形式。RDD 是只读的,对其只能进行建立、转化和求值等*做。SparkSQL做为Spark生态的一员继续发展,而再也不受限于Hive,只是兼容Hive。咱们利用hive做为数据源,spark做为计算引擎,经过SQL解析引擎,实现基于hive数据源,spark做为计算引擎的SQL测试方案。
2.2 Presto
Presto是一个分布式SQL查询引擎, 它被设计为用来专门进行高速、实时的数据分析。它支持标准的ANSI SQL,包括复杂查询、聚合(aggregation)、链接(join)和窗口函数(window functions)。做为Hive和Pig(Hive和Pig都是经过MapReduce的管道流来完成HDFS数据的查询)的替代者,Presto 自己并不存储数据,可是能够接入多种数据源,而且支持跨数据源的级联查询。Presto是一个OLAP的工具,擅长对海量数据进行复杂的分析;可是对于OLTP场景,并非Presto所擅长,因此不要把Presto当作数据库来使用。
2.3 Impala
Impala 是 Cloudera 在受到 Google 的 Dremel 启发下开发的实时交互SQL大数据查询工具,它拥有和Hadoop同样的可扩展性、它提供了类SQL(类Hsql)语法,在多用户场景下也能拥有较高的响应速度和吞吐量。它是由Java和C++实现的,Java提供的查询交互的接口和实现,C++实现了查询引擎部分,除此以外,Impala还可以共享Hive Metastore,甚至能够直接使用Hive的JDBC jar和beeline等直接对Impala进行查询、支持丰富的数据存储格式(Parquet、Avro等)。此外,Impala 没有再使用缓慢的 Hive+MapReduce 批处理,而是经过使用与商用并行关系数据库中相似的分布式查询引擎(由 Query Planner、Query Coordinator 和 Query Exec Engine 三部分组成),能够直接从 HDFS 或 HBase 中用 SELECT、JOIN 和统计函数查询数据,从而大大下降了延迟。
2.4 HAWQ
HAWQ 是一个 Hadoop 上的 SQL 引擎,是以 Greenplum Database 为代码基础逐渐发展起来的。HAWQ 采用 MPP 架构,改进了针对 Hadoop 的基于成本的查询优化器。除了能高效处理自己的内部数据,还可经过 PXF 访问 HDFS、Hive、HBase、JSON 等外部数据源。HAWQ全面兼容 SQL 标准,能编写 SQL UDF,还可用 SQL 完成简单的数据挖掘和机器学习。不管是功能特性,仍是性能表现,HAWQ 都比较适用于构建 Hadoop 分析型数据仓库应用。
2.5 ClickHouse
Clickhouse由俄罗斯yandex公司开发。专为在线数据分析而设计。Yandex是俄罗斯搜索引擎公司。官方提供的文档表名,ClickHouse 日处理记录数"十亿级"。
特性:采用列式存储;数据压缩;基于磁盘的存储,大部分列式存储数据库为了追求速度,会将数据直接写入内存,按时内存的空间每每很小;CPU 利用率高,在计算时会使用机器上的全部 CPU 资源;支持分片,而且同一个计算任务会在不一样分片上并行执行,计算完成后会将结果汇总;支持SQL,SQL 几乎成了大数据的标准工具,使用门槛较低;支持联表查询;支持实时更新;自动多副本同步;支持索引;分布式存储查询。
2.6 Hive
Hive是基于Hadoop的一个数据仓库工具,能够将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,能够将sql语句转换为MapReduce任务进行运行。其优势是学习成本低,能够经过类SQL语句快速实现简单的MapReduce统计,没必要开发专门的MapReduce应用,十分适合数据仓库的统计分析。
Hive是创建在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,能够用来进行数据提取转化加载(ETL),这是一种能够存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它容许熟悉 SQL 的用户查询数据。同时,这个语言也容许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 没法完成的复杂的分析工做。
2.7 GreenPlum
Greenplum是一个开源的大规模并行数据分析引擎。借助MPP架构,在大型数据集上执行复杂SQL分析的速度比不少解决方案都要快。
GPDB彻底支持ANSI SQL 2008标准和SQL OLAP 2003 扩展;从应用编程接口上讲,它支持ODBC和JDBC。完善的标准支持使得系统开发、和都大为方便。支持分布式事务,支持ACID。保证数据的强一致性。作为分布式数据库,拥有良好的线性扩展能力。GPDB有完善的生态系统,能够与不少企业级产品集成,譬如SAS,Cognos,Informatic,Tableau等;也能够不少种开源软件集成,譬如Pentaho,Talend 等。
3、性能测试分析
3.1 数据压缩
数据压缩方面,Sparkql、Impala、Presto均采用的是hive元数据,hive数据100G上传以后显示为96.3G(.dat数据格式),压缩比0.963;hawq压缩后数据大小为68.2G(.dat格式),压缩比:0.682;clickhouse采用本身默认格式42G;greenplum未使用压缩,数据存储大小为98G。
3.2 性能测试
本节经过查询语句对比SparkSql、Presto、Impala、HAWQ、ClickHouse、Hive、GreenPlum七种组件的查询性能,测试结果均采用连续三次查询结果的平均值,经过图表展现对比结果。
性能分析部分咱们分为两部分,第一部分是多表关联查询对比测试,第二部分是单大表查询对比测试。
3.2.1 多表关联查询对比测试
如下是多表关联测试结果,数据以下(sql文件见附件二):
经过咱们选取的15条sql语句查询测试,从表中能够看出,presto、impala和hawq查询时间快于SparkSql和ClickHouse,性能约是SparkSql的2-3倍,其中尤为以Presto和Impala性能要好一些。greenplum在多表查询上也有不错的表现;ClickHouse对于多表join效果相比较于Presto、Impala、HAWQ不是很好,而且不少复杂语法支持的不够好,可见并非为关联分析而设置;而hive无疑是全部组件中耗时最多的,其中部分语句查询时间超出1h的总时间按1h计算。
下面是经过图形展现来更加直观比较各组件性能。因为hive与其余相差太大,在图中不做比较。
3.2.2 单表查询对比测试
如下是9条单表测试语句对六种组件进行测试,测试结果图表分析以下(查询sql见附件三):
从结果中咱们发现,对于单表测试ClickHouse要比其他几种组件查询速度表现突出,测试性能约是其他四种的3-6倍。而Presto相比于HAWQ、Impala、SparkSql、GreenPlum在单表*做方面性能也稍好些。
下面经过图来直观比较:
从图像上更加清楚地显示出五种组件在单表测试方面性能的差距,Clickhouse在性能方面体现出了足够的优点,在单大表查询方面比其他组件性能都要好;Impala和Presto相比较,在sql_01-sql_05这5条语句是简单的一些求和求平均的单表做方面,Presto的性能要比Impala好不少,而sql_06-sql_09一些复杂点的多个列的单表做,Impala的性能要比Presto好一些,这也反映出Presto更加适合一些简单的数据量大的聚合做,而Impala适合一些复杂的聚合做。
最后咱们发现HAWQ、GreenPlum在单表聚合做方面性能不如其他四种组件,测试时间要大大超过它们,固然也不排除测试环境的影响,可是测试结果代表,HAWQ、GreenPlum不适合单表的复杂聚合做,更适合多表的聚合*做。
3.3 性能测试结果分析
从上面的分析结果能够看出,presto、Impala以及hawq在多表查询方面体现出了优点,虽然说presto和Impala在多表查询方面的性能差异不大,可是在查询过程当中却发现Impala的一些局限性,并尽可能避开这些局限问题进行测试。Impala不支持的地方,例如:不支持update、delete*做,不支持Date数据类型,不支持ORC文件格式等等,而presto则基本没有这些局限问题(本次测试中基本没有发现)。
在单表测试方面clickhouse体现出了比其他组件的优点,性能比其余组件要好一大截,而presto相比于hawq和impala以及sparksql在单大表聚合*做方面的表现也相对优秀。
4、各组件综合分析比较
经过以上图表查询性能分析以及咱们查找相关资料对各组件总结以下:
-
SparkSQL是Hadoop中另外一个著名的SQL引擎,它以Spark做为底层计算框架,Spark使用RDD做为分布式程序的工做集合,它提供一种分布式共享内存的受限形式。在分布式共享内存系统中,应用能够向全局地址空间的任意位置进行读写做,而RDD是只读的,对其只能进行建立、转化和求值等做。这种内存*做大大提升了计算速度。SparkSql的性能相对其余的组件要差一些,多表单表查询性能都不突出。
-
Impala官方宣传其计算速度是一大优势,在实际测试中咱们也发现它的多表查询性能和presto差很少,可是单表查询方面却不如presto好。并且Impala有不少不支持的地方,例如:不支持update、delete*做,不支持Date数据类型,不支持ORC文件格式等等,因此咱们查询时采用parquet格式进行查询,并且Impala在查询时占用的内存很大。
-
Presto综合性能比起来要比其他组件好一些,不管是查询性能仍是支持的数据源和数据格式方面都要突出一些,在单表查询时性能靠前,多表查询方面性能也很突出。因为Presto是彻底基于内存的并行计算,因此presto在查询时占用的内存也很多,可是发现要比Impala少一些,好比多表join须要很大的内存,Impala占用的内存比presto要多。
-
HAWQ 吸取了先进的基于成本的 SQL 查询优化器,自动生成执行计划,可优化使用hadoop 集群资源。HAWQ 采用 Dynamic pipelining 技术解决这一关键问题。Dynamic pipelining 是一种并行数据流框架,利用线性可扩展加速Hadoop查询,数据直接存储在HDFS上,而且其SQL查询优化器已经为基于HDFS的文件系统性能特征进行过细致的优化。可是咱们发现HAWQ在多表查询时比Presto、Impala差一些;并且不适合单表的复杂聚合*做,单表测试性能方面要比其他四种组件差不少,hawq环境搭建也遇到了诸多问题。
-
ClickHouse 做为目前全部开源MPP计算框架中计算速度最快的,它在作多列的表,同时行数不少的表的查询时,性能是很让人兴奋的,可是在作多表的join时,它的性能是不如单宽表查询的。性能测试结果代表ClickHouse在单表查询方面表现出很大的性能优点,可是在多表查询中性能却比较差,不如presto和impala、hawq的效果好。
-
GreenPlum做为关系型数据库产品,它的特色主要就是查询速度快,数据装载速度快,批量DML处理快。并且性能能够随着硬件的添加,呈线性增长,拥有很是良好的可扩展性。所以,它主要适用于面向分析的应用。好比构建企业级ODS/EDW,或者数据集市等,GREENPLUM都是不错的选择。
-
此外咱们还对flink进行了调研发现,flink 核心是个流式的计算引擎,经过流来模拟批处理,flink sql还处于早期开发阶段,将来社区计划经过提供基于REST的SQL客户端,目前sql客户端不能直接访问hive,经过YAML file文件定义外部数据源,能够链接文件系统和kafka,目前短期咱们的sql测试不太好模拟。因此没有对flink进行测试分析。
咱们经过测试以及以上的相关调研编写了各组件各个方面的综合对比分析表,这里采用5分为满分来比较,以下表:
附件信息:
附件一:表结构信息
附件二:TPC-DS查询测试语句
附件三:单表查询测试语句
附件四:性能对比表(Sheet1:TPC-DS语句,Sheet2:单表语句,Sheet5:改变格式优化以后的测试结果)