开源大数据查询分析底层技术三大基石引擎现状_光环大数据培训大数据查询分析是云计算中核心问题之一,自从Google在2006年之前的几篇论文奠定云计算领域基础,尤其是GFS、Map-Reduce、 Bigtable被称为云计算底层技术三大基石。
GFS、Map-Reduce技术直接支持了Apache Hadoop项目的诞生。
Bigtable和Amazon Dynamo直接催生了NoSQL这个崭新的数据库领域,撼动了RDBMS在商用数据库和数据仓库方面几十年的统治性地位。
FaceBook的Hive项目是建立在Hadoop上的数据仓库基础构架,提供了一系列用于存储、查询和分析大规模数据的工具。
当我们还浸淫在GFS、Map-Reduce、 Bigtable 等Google技术中,并进行理解、掌握、模仿时,Google在2009年之后,连续推出多项新技术,包括:Dremel、 Pregel、Percolator、Spanner和F1。
其中,Dremel促使了实时计算系统的兴起,Pregel开辟了图数据计算这个新方向,Percolator使分布式增量索引更新成为文本检索领域的新标准,Spanner和F1向我们展现了跨数据中心数据库的可能。
在Google的第二波技术浪潮中,基于Hive和Dremel,新兴的大数据公司Cloudera开源了大数据查询分析引擎Impala,Hortonworks开源了 Stinger,Fackbook开源了Presto。
类似Pregel,UC Berkeley AMPLAB实验室开发了Spark图计算框架,并以Spark为核心开源了大数据查询分析引擎Shark。
由于某电信运营商项目中大数据查询引擎选型需求,本文将会对Hive、Impala、Shark、Stinger和Presto这五类主流的开源大数据查询分析引擎进行简要介绍以及性能比较,最后进行总结与展望。
Hive、Impala、Shark、Stinger和Presto的进化图谱。
2图1. Impala、Shark、Stinger和Presto的进化图谱当前主流引擎简介基于Map-Reduce模式的Hadoop擅长数据批处理,不是特别符合即时查询的场景。
实时查询一般使用MPP (Massively Parallel Processing)的架构,因此用户需要在Hadoop和MPP两种技术中选择。
在Google的第二波技术浪潮中,一些基于Hadoop架构的快速 SQL访问技术逐步获得人们关注。
现在有一种新的趋势是MPP和Hadoop相结合提供快速SQL访问框架。
最近有四个很热门的开源工具出来:Impala、Shark、Stinger和Presto。
这也显示了大数据领域对于Hadoop 生态系统中支持实时查询的期望。
总体来说,Impala、Shark、Stinger和Presto 四个系统都是类SQL实时大数据查询分析引擎,但是它们的技术侧重点完全不同。
而且它们也不是为了替换Hive而生,Hive在做数据仓库时是非常有价值的。
这四个系统与Hive都是构建在Hadoop之上的数据查询工具,各有不同的侧重适应面,但从客户端使用来看它们与Hive有很多的共同之处,如数据表元数据、Thrift接口、ODBC/JDBC驱动、SQL语法、灵活的文件格式、存储资源池等。
Hive与Impala、Shark、Stinger、Presto在Hadoop中的关系如图2所示。
Hive 适用于长时间的批处理查询分析,而Impala、Shark、Stinger和Presto适用于实时交互式SQL查询,它们给数据分析人员提供了快速实验、验证想法的大数据分析工具。
可以先使用Hive进行数据转换处理,之后使用这四个系统中的一个在Hive处理后的结果数据集上进行快速的数据分析。
下面,从问题域出发简单介绍 Hive、Impala、Shark、Stinger和Presto:3图2. Hive与Impala、Shark、Stinger、Presto在Hadoop中的关系当前主流引擎架构HiveHive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能,可以将SQL语句转换为 Map-Reduce 任务进行运行,十分适合数据仓库的统计分析。
其架构如图3所示,Hadoop和Map-Reduce是Hive架构的根基。
Hive 架构包括如下组件:CLI(Command Line Interface)、JDBC/ODBC、Thrift Server、Meta Store和Driver(Complier、Optimizer和Executor)。
1) Hive,披着SQL外衣的Map-Reduce。
Hive是为方便用户使用Map-Reduce 而在外面封装了一层SQL,由于Hive采用了SQL,它的问题域比Map-Reduce更窄,因为很多问题,SQL表达不出来,比如一些数据挖掘算法,推荐算法、图像识别算法等,这些仍只能通过编写Map-Reduce完成。
2) Impala:Google Dremel的开源实现(Apache Drill类似),因为交互式实时计算需求,Cloudera推出了Impala系统,该系统适用于交互式实时处理场景,要求最后产生的数据量一定要少。
3) Shark/Spark:为了提高Map-Reduce的计算效率,Berkeley的AMPLab 实验室开发了Spark,Spark可看做基于内存的Map-Reduce实现,此外,伯克利还在Spark基础上封装了一层SQL,产生了一个新的类似Hive的系统Shark。
4) Stinger Initiative(Tez optimized Hive):Hortonworks开源了一个DAG计算框架Tez,Tez可以理解为Google Pregel的开源实现,该框架可以像Map-Reduce一样,可以用来设计DAG应用程序,但需要注意的是,Tez只能运行在YARN上。
Tez的一个重要应用是优化Hive和PIG这种典型的DAG应用场景,它通过减少数据读写IO,优化DAG流程使得Hive速度提供了很多倍。
5) Presto:FaceBook于2013年11月份开源了Presto,一个分布式SQL查询引擎,它被设计为用来专门进行高速、实时的数据分析。
它支持标准的ANSISQL,包括复杂查询、聚合(aggregation)、连接(join)和窗口函数(window functions)。
Presto设计了一个简单的数据存储的抽象层,来满足在不同数据存储系统(包括HBase、HDFS、Scribe等)之上都可以使用SQL进行查询。
4图3. Hive架构Impala架构Impala是Cloudera在受到Google的Dremel启发下开发的实时交互SQL大数据查询工具,它可以看成是Google Dremel架构和MPP (Massively Parallel Processing)结构的结合体。
Impala没有再使用缓慢的Hive&Map-Reduce批处理,而是通过使用与商用并行关系数据库中类似的分布式查询引擎(由Query Planner、Query Coordinator和Query Exec Engine三部分组成),可以直接从HDFS或HBase中用SELECT、JOIN和统计函数查询数据,从而大大降低了延迟,其架构如图4所示,Impala主要由Impalad,State Store和CLI组成。
Impalad 与DataNode运行在同一节点上,由Impalad进程表示,它接收客户端的查询请求(接收查询请求的 Impalad为Coordinator,Coordinator通过JNI调用java 前端解释SQL查询语句,生成查询计划树,再通过调度器把执行计划分发给具有相应数据的其它Impalad进行执行),读写数据,并行执行查询,并把结果通过网络流式的传送回给Coordinator,由 Coordinator返回给客户端。
同时Impalad也与State Store保持连接,用于确定哪个Impalad是健康和可以接受新的工作。
Impala State Store跟踪集群中的Impalad的健康状态及位置信息,由state-stored进程表示,它通过创建多个线程来处理Impalad的注册订阅和与各Impalad保持心跳连接,各Impalad都会缓存一份State Store中的信息,当State Store离线后,因为Impalad有State Store的缓存仍然可以工作,但会因为有些Impalad失效了,而已缓存数据无法更新,导致把执行计划分配给了失效的Impalad,导致查询失败。
CLI提供给用户查询使用的命令行工具,同时Impala还提供了Hue,JDBC,ODBC,Thrift使用接口。
5图4. Impala架构Shark架构Shark是UC Berkeley AMPLAB开源的一款数据仓库产品,它完全兼容Hive 的HQL语法,但与Hive不同的是,Hive的计算框架采用Map-Reduce,而 Shark 采用Spark。
所以,Hive是SQL on Map-Reduce,而Shark是Hive on Spark。
其架构如图4所示,为了最大程度的保持和Hive的兼容性,Shark复用了Hive 的大部分组件,如下所示:1) SQL Parser&Plan generation: Shark完全兼容Hive的HQL语法,而且Shark使用了Hive的API来实现query Parsing和 query Plan generation,仅仅最后的Physical Plan execution阶段用Spark代替Hadoop Map-Reduce;2) metastore:Shark采用和Hive一样的meta信息,Hive里创建的表用Shark可无缝访问;3) SerDe: Shark的序列化机制以及数据类型与Hive完全一致;4) UDF: Shark可重用Hive里的所有UDF。
通过配置Shark参数,Shark可以自动在内存中缓存特定的RDD(Resilient Distributed Dataset),实现数据重用,进而加快特定数据集的检索。
同时,Shark通过UDF用户自定义函数实现特定的数据分析学习算法,使得SQL数据查询和运算分析能结合在一起,最大化RDD的重复使用;5) Driver:Shark在Hive的CliDriver基础上进行了一个封装,生成一个SharkCliDriver,这是shark命令的入口;6) ThriftServer:Shark在Hive的ThriftServer(支持JDBC/ODBC)基础上,做了一个封装,生成了一个SharkServer,也提供JDBC/ODBC服务。