当前位置: 首页 > 技术与资源 > 技术分享 > 正文

开源的SQL on Hadoop工具比较

2015-12-31 11:05:39

作者:吴泽锋新炬网络高级技术专家。


随着大数据时代的来临,越来越多的企业把数据存储在Hadoop上,随之相关的数据处理技术也从一开始的Map Reduce一统江湖,到现在各种技术竞相出现。最新的趋势是,大家普遍希望能够快速得到查询结果,做交互式查询,同时也希望传统的BI(Business Intelligence,商务智能)工具可以直接和基于Hadoop的大数据平台连接起来,以便使用现用工具进行可视化数据分析。下面对常用的sql on hadoop工具进行介绍及特点分析。


1.Apache Hive


Hive 是当前使用最为广泛的数据仓库工具,Hive 的数据都存储在Hadoop 兼容的文件系统(例如,Amazon S3、HDFS)中,所有的查询转化为MapReduce 的job 在Hadoop集群上执行。Hive主要由beeline、cli、hiveserver2、hiveserver、lineage、 metastore等服务组成。Hive 定义了简单的类 SQL 查询语言,称为 HQL。可通过cli客户端进行查询,也可通过jdbc连接进行访问。Hive将外部的任务解析成一个MapReduce可执行计划,而启动MapReduce是一个高延迟的一件事,每次提交任务和执行任务都需要消耗很多时间,这也就决定Hive只能处理一些高延迟的应用。Hive不能对表数据进行修改(不能更新、删除、插入;只能通过文件追加数据、重新导入数据)。


特点:


  • 支持索引,将元数据保存在关系数据库中,大大减少了在查询过程中执行语义检查的时间。

  • 可以直接使用存储在Hadoop 文件系统中的数据。

  • 内置大量用户函数UDF 来操作时间、字符串和其他的数据挖掘工具,支持用户扩展UDF 函数来完成内置函数无法实现的操作。

  • 类SQL 的查询方式,将SQL 查询转换为MapReduce 的job 在Hadoop集群上执行。Hive的查询性能通常很低


2.Apache SparkSQL


SparkSQL的前身是Shark Shark对于Hive的太多依赖(如采用Hive的语法解析器、查询优化器等等),SparkSQL抛弃原有Shark的代码,汲取了Shark的一些优点,如内存列存储(In-Memory Columnar Storage)、Hive兼容性等,重新开发了SparkSQL代码;由于摆脱了对Hive的依赖性,SparkSQL无论在数据兼容、性能优化、组件扩展方面都得到了极大的方便。在性能方面性能比Hive有了10-100倍的提高。但Spark sql的sql语句支持没有hive的多,另外spark sql在复杂的查询的优化上没有hive做得好。Spark sql同样提供了cli的操作界面。


特点:


  • 支持DAG图的分布式并行计算的编程框架。

  • shuffle过程中避免不必要的sort操作以及减少磁盘IO操作,减少多次计算之间中间结果写到Hdfs的开销。

  • 提供Cache机制来支持需要反复迭代计算或者多次数据共享,减少数据读取的IO开销。

  • Catalyst查询优化框架,在把SQL解析成逻辑执行计划,对执行计划优化,最后变成RDD操作。

  • Spark SQL支持SQL和HiveQL大部分语法,对以前的脚本变动很小。Spark SQL目前不支持Yarn-cluster模式。

  • 性能上比Hive有了10-100倍的提高。


3.Cloudera Impala


Impala是Cloudera在受到Google的Dremel启发下开发的实时交互SQL大数据查询工具,Impala的运行也是依赖Hive的元数据,Impala没有再使用缓慢的Hive+MapReduce批处理,而是通过使用与商用并行关系数据库中类似的分布式查询引擎(由Query Planner、Query Coordinator和Query Exec Engine三部分组成),可以直接从HDFS或HBase中用SELECT、JOIN和统计函数查询数据,从而大大降低了延迟。性能上比Hive高出3~30倍。


特点:


  • 支持快速查询大数据,交互式查询。

  • 可以对已有数据进行查询,减少数据的加载,转换。

  • 多种存储格式可以选择(Parquet, Text, Avro, RCFile, SequeenceFile)。

  • 不支持用户定义函数UDF、不支持text域的全文搜索。

  • 不支持Transforms。

  • 不支持查询期的容错、对内存要求高。当返回数据量过大大,容易造成内存溢出。


4.Hortonworks Stinger


Stinger Initiative 即Tez optimized Hive,是Hortonworks开源的一个DAG计算框架Tez,Tez可以理解为Google Pregel的开源实现,该框架可以像Map-Reduce一样,可以用来设计DAG应用程序,但需要注意的是,Tez只能运行在YARN上。Tez的一个重要应用是优化Hive和PIG这种典型的DAG应用场景,它通过减少数据读写IO,优化DAG流程使得Hive速度提搞了很多倍,从实际的使用上,Stinger查询性能比Spark sql要慢。


特点:


  • 改进Hive的SQL兼容性,包括支持Hive中没有的SQL类型和‘where’子句中的子查询。

  • 优化Hive的执行计划。

  • 支持新的Hadoop列格式ORCFile(类似于Dremel、Drill和Cloudera的Trevini)。

  • 依赖于Tez的计算框架。


5.Apache Drill


Apache Drill是由MapR推进的一个能够对大数据进行交互分析、开源的分布式系统,是Google Dremel的开源实现,本质是一个分布式的mpp查询层,支持SQL及一些用于NoSQL和Hadoop数据存储系统上的语言。它是唯一一个支持复杂和无模式数据的柱状执行引擎(columnar execution engine),也是唯一一个能在查询执行期间进行数据驱动查询(和重新编译,也称之为 schema discovery)的执行引擎(execution engine)。但目前市场上使用还不广泛。


特点:


  • 基于Google Dremel的实现。

  • 支持一个嵌套(nested)的数据模型,类似于Json格式,

  • 用列式存储数据,只需扫描需要的数据,减少CPU和磁盘的访问量。

  • 秒级别的时间查询PB级别的数据。


6.FaceBook Presto


Presto是FaceBook于2013年11月份开源的一个分布式SQL查询引擎,它被设计为用来专门进行高速、实时的数据分析。Presto采用的方法类似于Impala,不采用MapReduce进行数据查询,Presto 是一个分布式系统,由一个协调器 (coordinator) 和多个 workers。查询时客户端提交到协调器,协调器负责解析、分析和安排查询到不同的 worker 上执行。包括FaceBook、Airbnb和Dropbox都在使用Presto。


特点:


  • 基于内存的并行计算,性能上比较hive高7倍。

  • 与Hive metastore交互以实现模式共享。

  • 动态编译执行计划,本地化计算。

  • 支持Nosql和RDBMS作为数据源,如:MySQL、SQLServer、PostgreSQL、 Cassandra、Hbase等。

上一篇:服务器raid信息丢失应对方案
下一篇:敏捷开发经验之谈