作者:蚂蚁
来源:数据中台研习社
恒久以来,由于以hadoop为焦点的生态体系霸占了大数据的各个角度,以至于我们以为大数据就是hadoop。诚然,自hadoop诞生以来,hive+hbase掀起第一个高潮,而后Spark和Flink更是火爆到不行,声浪一阵盖过一阵。尽管hadoop在高并发、海量数据处理等方面有着无可相比的优势,但是在OLAP场景下的数据分析方面始终不如人意。
在hadoop生态体系中,可以用作OLAP分析的引擎主要有以下几个:
1)Hive
Hive 最早由 Facebook 开源贡献也是早年应用最广泛的大数据 SQL 引擎,和 MapReduce 一样,Hive 在业界的标签就是慢而稳固。其无私地提供了许多公共组件为其他引擎所利用,堪称业界良心,好比元数据服务 Hive Metastore、查询优化器 Calcite、列式存储 ORC 等。
近年来,Hive 发展很快,例如查询优化方面采用了 CBO,在执行引擎方面用 Tez 来替换 MapReduce,通过 LLAP 来 cache 查询效果做优化,以及 ORC 存储不断演进。不过相比力而言,这些新技术从市场应用来说还不算成熟稳固,Hive 仍然被大量用户定义为可靠的 ETL 工具而非即时查询产品。
Hive的优势是完善的SQL支持,极低的学习成本,自定义数据格式,极高的扩展性可轻松扩展到几千个节点等等。但是Hive 在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些 Key 创建索引。Hive 要访问数据中满足条件的特定值时,需要暴力扫描整个数据库,因此访问延迟较高。
2)HAWQ
Hawq是一个Hadoop原生大规模并行SQL分析引擎,Hawq采用 MPP 架构,改进了针对 Hadoop 的基于成本的查询优化器。除了能高效处理本身的内部数据,还可通过 PXF 访问 HDFS、Hive、HBase、JSON 等外部数据源。HAWQ全面兼容 SQL 尺度,能编写 SQL UDF,还可用 SQL 完成简单的数据挖掘和机器学习。无论是功能特性,照旧性能表现,HAWQ 都比力适用于构建 Hadoop 分析型数据仓库应用。
网络上有人对Hawq与Hive查询性能进行了对比测试,总体来看,利用Hawq内部表比Hive快的多(4-50倍)。Hawq是基于GreenPlum实现,缺点是安装配置复杂,技术实现也比力复杂,因此社区活跃度不高。
3)Presto
Presto是Facebook推出的基于内存的并行计算的分布式SQL交互式查询引擎 多个节点管道式执行。支持任意数据源 数据规模GB~PB 是一种Massively parallel processing(mpp)(大规模并行处理)模型
数据规模PB 不是把PB数据放到内存,只是在计算中拿出一部分放在内存、计算、抛出、再拿。Presto不仅支持hive,还支持各种jdbc数据源,可以作为一个跨平台的查询计算引擎。
Presto 在前几年应用比力广泛,在Airbnb和JD等企业有过应用,京东还专门为此写了一本书。但是近几年徐徐淡出了。这款内存型 MPP 引擎的特点就是处理小规模数据会非常快,数据量大的时候会比力吃力。
由于Presto是基于内存的,而hive是在磁盘上读写的,因此presto比hive快许多,但是由于是基于内存的计算当多张大表关联操纵时易引起内存溢出错误。不适合多个大表的join操纵。
4)Spark SQL
SparkSQL 这两年发展迅猛,尤其在 Spark 进入 2.x 期间,发展更是突飞猛进。其优秀的 SQL 兼容性(唯一全部 pass TPC-DS 全部 99 个 query 的开源大数据 SQL),卓越的性能、巨大且活跃的社区、完善的生态(机器学习、图计算、流处理等)都让 SparkSQL 从这几个开源产品中脱颖而出,在国内外市场得到了非常广泛的应用。
Spark SQL对熟悉Spark的同学来说,很容易理解并上手利用:
- 相比于Spark RDD API,Spark SQL包含了对结构化数据和在其上运算的更多信息,Spark SQL利用这些信息进行了额外的优化,使对结构化数据的操纵更加高效和方便;
- SQL提供了一个通用的方式来访问各式各样的数据源,包括Hive, Avro, Parquet, ORC, JSON, and JDBC;
- Hive兼容性极好。
5)Kylin
Apache Kylin是一个开源的分布式分析引擎,提供Hadoop/Spark之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由eBay Inc. 开发并贡献至开源社区。
Kylin自身就是一个MOLAP体系,多维立方体(MOLAP Cube)的计划使得用户能够在Kylin里为百亿以上数据集定义数据模型并构创建方体进行数据的预聚合。 简单来说,Kylin中数据立方的头脑就是以空间换时间,通过定义一系列的纬度,对每个纬度的组合进行预先计算并存储。有N个纬度,就会有2的N次种组合。所以最好控制好纬度的数量,因为存储量会随着纬度的增加爆炸式的增长,产生灾难性后果。原来的kylin是把数据存储在Hbase内里,近些年做了一些改进,尝试用文件存储。
6)Impala
Impala也是一个SQL on Hadoop的查询工具,底层采用MPP技术,支持快速交互式SQL查询。与Hive共享元数据存储。Impalad是焦点进程,负责吸收查询请求并向多个数据节点分发任务。statestored进程负责监控所有Impalad进程,并向集群中的节点报告各个Impalad进程的状态。catalogd进程负责广播通知元数据的最新信息。
<span style="letter-spacing: 1px;"> |