作者:吴泽锋,新炬网络高级技术专家。
随着大数据时代的来临,越来越多的企业把数据存储在Hadoop上,随之相关的数据处理技术也从一开始的Map Reduce一统江湖,到现在各种技术竞相出现。最新的趋势是,大家普遍希望能够快速得到查询结果,做交互式查询,同时也希望传统的BI(Business Intelligence,商务智能)工具可以直接和基于Hadoop的大数据平台连接起来,以便使用现用工具进行可视化数据分析。下面对常用的sql on hadoop工具进行介绍及特点分析。
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的查询性能通常很低
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倍的提高。
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。
不支持查询期的容错、对内存要求高。当返回数据量过大大,容易造成内存溢出。
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的计算框架。
Apache Drill是由MapR推进的一个能够对大数据进行交互分析、开源的分布式系统,是Google Dremel的开源实现,本质是一个分布式的mpp查询层,支持SQL及一些用于NoSQL和Hadoop数据存储系统上的语言。它是唯一一个支持复杂和无模式数据的柱状执行引擎(columnar execution engine),也是唯一一个能在查询执行期间进行数据驱动查询(和重新编译,也称之为 schema discovery)的执行引擎(execution engine)。但目前市场上使用还不广泛。
特点:
基于Google Dremel的实现。
支持一个嵌套(nested)的数据模型,类似于Json格式,
用列式存储数据,只需扫描需要的数据,减少CPU和磁盘的访问量。
秒级别的时间查询PB级别的数据。
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信息丢失应对方案
下一篇:敏捷开发经验之谈