开源 OLAP 引擎测评报告(SparkSql,Presto,Impala,HAWQ,ClickHouse,GreenPlum)
@dailidong@ 发布时间: 2019-01-21 10:44:21 浏览 144 评论 0
分布式
大数据
- Greenplum
- hadoop
- HAWQ
性能
SQL
数据仓库
测试
- spark
- static
- OLAP
OLAP 引擎测评
OLAP 测评
OLAP 引擎性能报告
摘要: 本文为博主公司原创文章, 仿冒必究, 转载请回复留言 ** 开源 OLAP 引擎测评报告(SparkSql,Presto,Impala,HAWQ,ClickHouse,GreenPlum) 易观 CTO 郭炜 序现在大数据组件非常多, 众说不一, 在每个企业不同的使用场景里究竟应该使用哪个引擎呢? 这是易观 Spark 实战营出品的开源 Olap 引擎测评报告, 团队选取了 Hive,Sparksql,Presto,Impala,Hawq,Clickhouse,Greenplum 大数据查询引擎, 在原生推荐配置情况下, 在不同场景下做一次横向对比, 供大家参考.
本文为博主公司原创文章, 仿冒必究, 转载请回复留言 **
易观 CTO 郭炜 序
现在大数据组件非常多, 众说不一, 在每个企业不同的使用场景里究竟应该使用哪个引擎呢? 这是易观 Spark 实战营出品的开源 Olap 引擎测评报告, 团队选取了 Hive,Sparksql,Presto,Impala,Hawq,Clickhouse,Greenplum 大数据查询引擎, 在原生推荐配置情况下, 在不同场景下做一次横向对比, 供大家参考.
每年易观都会发布一次这样的大数据开源测评报告, 欢迎大家给出更好的测评意见以及想要测试的组件. 易观 Spark 实战营是易观大数据技术团队组织的针对大数据初学者的实战训练营, 欢迎搜索访问 "易观数据极客社区", 在文章后留言, 交流最新最全的大数据技术.
目录
开源 OLAP 框架基线测试报告 |
---|
一、测试方案 |
1.1 测试整体方案 |
1.2 TPC-DS 测试与单表测试方案及数据准备 |
1.3 环境准备 |
二、测试组件介绍 |
2.1 SparkSql |
2.2 Presto |
2.3 Impala |
2.4 HAWQ |
2.5 ClickHouse |
2.6 Hive |
2.7 Greenplum |
三、性能测试分析 |
3.1 数据压缩 |
3.2 性能测试 |
3.2.1 多表关联查询对比测试 |
3.2.2 单表查询对比测试 |
3.3 性能测试结果分析 |
四、各组件综合分析比较 |
一, 测试方案
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) 基础性能测试. 我们采用多表关联和单大表性能分别对比不同组件在查询性能, 系统负载等方面的情况, 测试方案如下:
1, 多表关联采用 Tpc-Ds 基准测试工具生成相应测试语句和数据进行测试,
2, 单大表测试同样选用 Tpc-Ds 基准测试工具生成的最大数据量的表, 并采用我们选用的一些常规性聚合语句进行测试.
1.2 TPC-DS 测试与单表测试方案及数据准备
TPC-DS 采用星型, 雪花型等多维数据模式. 它包含 7 张事实表, 17 张维度表平均每张表含有 18 列. 其工作负载包含 99 个 SQL 查询, 覆盖 SQL99 和 2003 的核心部分以及 OLAP. 这个测试集包含对大数据集的统计, 报表生成, 联机查询, 数据挖掘等复杂应用, 测试用的数据和值是有倾斜的, 与真实数据一致. 可以说 TPC-DS 是与真实场景非常接近的一个测试集, 也是难度较大的一个测试集.
TPC-DS 的这个特点跟大数据的分析挖掘应用非常类似. Hadoop 等大数据分析技术也是对海量数据进行大规模的数据分析和深度挖掘, 也包含交互式联机查询和统计报表类应用, 同时大数据的数据质量也较低, 数据分布是真实而不均匀的. 因此 TPC-DS 成为客观衡量多个不同 Hadoop 版本以及 SQL on Hadoop 技术的最佳测试集.
本次测试采用 TPC-DS 提供的 dsdgen 命令工具生成指定量级的测试数据, 我们指定数据量级为 100G.
生成的各个表的数据量如下:
通过使用 dsqgen 命令根据 TPC-DS 提供的模板生成不同类型的 SQL 语句, TPC-DS 默认支持以下模板: db2.tpl,netezza.tpl,oracle.tpl,sqlserver.tpl. 我们通过命令生成 sqlserver.tpl 模板的 SQL 语句, 分别对其进行细微的修改使其符合不同的 olap 引擎支持的语法规则.
对于多表关联测试, 我们从中选取了 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.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) 和窗口函数 (Windows 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.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 在单大表聚合操作方面的表现也相对优秀.
四, 各组件综合分析比较
通过以上图表查询性能分析以及我们查找相关资料对各组件总结如下:
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 分为满分来比较, 如下表:
附件信息:
附件一: 表结构信息 https://github.com/analysys/public-docs/
附件二: TPC-DS 查询测试语句 https://github.com/analysys/public-docs/
附件三: 单表查询测试语句 https://github.com/analysys/public-docs/
附件四: 性能对比表 https://github.com/analysys/public-docs/ (Sheet1:TPC-DS 语句, Sheet2: 单表语句, Sheet5: 改变格式优化之后的测试结果)
本文为博主公司原创文章, 仿冒必究, 转载请回复留言 **
来源: https://yq.aliyun.com/articles/688271