本文已参与「新人创作礼」活动,一起开启掘金创作之路。
背景
在开源大数据领域,最早的大数据引擎主要以MapReduce计算引擎为主。MapReduce通过分布式计算,对数据进行批处理,数据吞吐量比较大,但是数据处理性能比较低,主要原因首先是数据处理过程中要多次落盘IO影响性能,其次就是MapReduce任务的调度和启动开销比较大等。这样的情况下MR是不适合进行交互式ad-hoc查询分析。同样也是谷歌推出了新的交互式计算引擎Dremel,它采用MPP架构(大规模并行处理结构)使用多层查询树,使得任务可以在数千个节点上并行执行和聚合结果,另外就是实现了嵌套型数据的列存储,避免读取到不必要的数据,大大减少了网络和磁盘IO的开销,使得交互式查询性能得到明显的提高。
交互式引擎的分类
开源大数据OLAP(Online Analytical Processing联机分析处理)组件,有多种实现方法,根据存储数据的方式不同,可以分为多维MOLAP(Multidimensional OLAP)和关系型ROLAP(Relational OLAP) 以及混合HOLAP(Hybird)。
- MOLAP基于多维数据组织的OLAP实现,它以多维数据组织方式为核心,使用多维数组存储数据。多维数据在存储系统中形成“数据立方体(Cube)”的结构,对数据存储有优化,并且进行部分预计算,因此查询性能最高。主要的缺陷在于占用存储空间大和数据更新有一定的延滞。
- ROLAP基于关系型数据的OLAP实现,以关系型结构进行多维数据的表示和存储,ROLAP优点是可以实时的从源数据中获得最新数据更新,以保持数据实时性,缺点在于运算效率相对于MOLAP比较低,用户等待时间比较长。又可细分为MPP数据库和SQL引擎两类。对于SQL引擎又可以再细分为基于MPP架构的SQL引擎和基于通用计算框架的SQL引擎。
- HOLAP基于混合数据组织的OLAP实现,实际上就是上面两类引擎的组合,一般来说可以将不常用需要灵活定义的分析使用ROLAP方式,而常用、常规模型采用MOLAP实现。
MPP数据库是个完整的数据库,比如Greenplum和ClickHouse,通常数据需要导入其中才能完成OLAP功能。MPP数据库在数据入库时对数据分布可以做优化,虽然入库效率有一定下降,但是对后期查询性能的提高有很大帮助。MPP数据库可以提供灵活的即席查询能力,但一般对查询数据量有一定限制,无法支撑特别大的数据量的查询。
SQL引擎只提供SQL执行的能力,本身一般不负责数据存储,通常可以对接多种数据储存,如HDFS、HBase、MySQL等。有的还支持联邦查询能力,可以对多个异构数据源进行联合分析。SQL引擎中,基于MPP架构的SQL引擎,如Impala、Hawq、Presto、Drill 一般对在线查询场景有特殊优化,所以端到端查询性能一般要高于基于通用计算框架的SQL引擎;但是在容错性和数据量方面又会逊于基于通用计算框架的SQL引擎(Hive、Spark SQL)。
总之,可以说没有一个OLAP系统能同时在处理规模,灵活性和性能这三个方面做到完美,用户需要基于自己的需求进行取舍和选型。
交互式引擎的对比
OLAP组件介绍
- SparkSql
Spark SQL 是基于Spark Core提供了一层Sql能力。它将 SQL查询与Spark 程序无缝集成,可以将结构化数据作为 Spark 的 RDD 进行查询。RDD 的全称为 Resilient Distributed Datasets,即弹性分布式数据集,是Spark基本的数据结构。Spark 使用 RDD 作为分布式程序的工作集合,提供一种分布式共享内存的受限形式。RDD 是只读的,对其只能进行创建、转化和求值等操作。SparkSQL作为Spark生态的一员继续发展,而不再受限于Hive,只是兼容Hive。
- Presto
Presto是一个分布式SQL查询引擎,它被设计为用来专门进行高速、实时的数据分析。它支持标准的ANSI SQL,包括复杂查询、聚合(aggregation)、连接(join)和窗口函数(window functions), Presto本身不存储数据,但是可以接入多种数据源,并且还支持跨数据源的级联查询。Presto是一个OLAP的工具,擅长对海量数据进行复杂的分析,也并不适用于OLTP场景。
-
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 和统计函数查询数据,从而大大降低了延迟。
-
ClickHouse
Clickhouse由俄罗斯yandex公司开发。专为在线数据分析而设计。Yandex是俄罗斯搜索引擎公司。官方提供的文档表名,ClickHouse 日处理记录数”十亿级”。
特性:采用列式存储;数据压缩;基于磁盘的存储,大部分列式存储数据库为了追求速度,会将数据直接写入内存,按时内存的空间往往很小;CPU 利用率高,在计算时会使用机器上的所有 CPU 资源;支持分片,并且同一个计算任务会在不同分片上并行执行,计算完成后会将结果汇总;支持SQL,SQL 几乎成了大数据的标准工具,使用门槛较低;支持联表查询;支持实时更新;自动多副本同步;支持索引;分布式存储查询。
- Hive Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
Hive是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。
常见MPP 架构的 OLAP 引擎对比
presto、Impala在多表查询方面体现出了优势,虽说presto和Impala在多表查询方面的性能差别不大,但是在查询过程中却发现Impala的一些局限性,并尽量避开这些局限问题进行测试。Impala不支持的地方,例如:不支持update、delete操作,不支持Date数据类型,不支持ORC文件格式等等,而presto则基本没有这些局限问题。
在单表测试方面clickhouse体现出了比其余组件的优势,性能比其他组件要好一大截,而presto相比于himpala以及sparksql在单大表聚合操作方面的表现也相对优秀。
总结
看到这里大家在构建OLAP大致就应该有答案了,以上是2019年的测试结果,实际使用当中我们还可以进行具体的测试,另外也可以关注一下Flink Sql,作为一个流计算的标准组件,其也支持批处理和OLAP操作,这样可以通过一个统一的引擎去满足大数据计算分析场景,降低学习成本和开发维护效率。
名词解释
MPP(Massively Parallel Processing大规模并行处理结构):由多个计算节点组成,由每个节点只访问自己的资源,每个节点的 CPU 不能访问另一个节点内存,是一种完全无共享(Share Nothing)结构。
HTAP(混合事务 / 分析处理,Hybrid Transactional/Analytical Processing)数据库,主要是解决OLAP 和 OLTP 系统间通常会有几分钟甚至几小时的时延,OLAP 数据库和 OLTP 数据库之间的一致性无法保证,难以满足对分析的实时性要求很高的业务场景。企业需要维护不同的数据库以便支持两类不同的任务,管理和维护成本高。
参考文档
cloud.tencent.com/developer/n…
www.jianshu.com/p/b23800d9b…
www.clickhouse.com.cn/topic/5c453…
www.jianshu.com/p/4b3bcbaba…
jishuin.proginn.com/p/763bfbd3a…
www.analysys.cn/article/det…
www.infoq.cn/article/lpj…