查询分析是大数据要解决的核心问题,而SQL作为查询分析中使用最简单、最广泛的的语言之一,必然而然的发展创建了许多支持在Hadoop上使用SQL,这就是SQL on Hadoop,其中Hive就是最早的SQL on Hadoop。
HDFS和HBase并不支持SQL,所以诞生了一大批SQL On Hadoop工具,这些工具有些是在MapReduce上做了包装,有些是在HDFS上实现了完整的一套数据仓库,下面介绍一些常用的SQL on Hadoop工具。
Hive是最早的唯一运行在Hadoop上的SQL on Hadoop工具,它是一个开源的Java项目。
Hive SQL,简称HQL,是 Hive 提供一个 SQL 方言。Hive 查询操作过程严格遵守 Hadoop MapReduce 的作业执行模型,Hive 将用户的Hive SQL 语句通过解释器转换为 MapReduce 作业提交到Hadoop 集群上,Hadoop 监控作业执行过程,然后返回作业执行结果给用户。
Hive的优缺点如下
优点 几乎所有的Hadoop机器都安装了Hive,Hive环境很容易建立。
缺点 Hive的查询性能很低,因为它会把SQL转换为运行得较慢的MAPReduce任务。
虽然Hive的性能不是最快的,但是Hive是最流行的,因为 1、Hive是Hadoop的默认SQL选项,每个版本都支持。2、Hive已经在减少和其他引擎的性能差距。Tez是Apache开源的分布式计算框架,是一个Hive的运行引擎,用于解决因为使用MAPReduce而导致的响应时间慢的问题。Tez可以将多个作业转换成一个作业,这样只需要写一次HDFS,中间节点少,提高了作业的计算性能。Tez在一些公司的线上环境中使用,也得到了很好了认可。
Impala底层是使用C++写的,2012年由Cloudera开发,现在是Apache开源项目。Impala是一个针对Hadoop的交互式SQL查询引擎,与Hive配合使用,可以对Hive的结果数据集进行实时分析。
Impala的优缺点如下
优点 Impala的设计目标是作为Hive的一个补充,因此如果需要比Hive更快的数据访问,那么可以选择它。
缺点 但是如果要使用Impala,需要将数据存储为特定的文件格式——Parquet。另外需要在集群上安装Impala守护进程,这会占用一部分的内存。
Presto是一个用Java语言开发的,Facebook开源的交互式SQL查询引擎,为了解决Hive查询慢而产生。数据全部在内存中处理,作用和Impala类似。
Presto的优缺点如下
优点 基于内存的计算引擎,Presto本身并不存储数据,减少了磁盘I/0,计算速度更快,支持跨数据源的级联查询。
缺点 Presto没有被一个主要的供应商支持,所以在使用Presto时无法获得企业支持,后续服务无法保障。
Apache Drill是一个分布式的、开源的交互式SQL查询引擎。Apache Drill的目标与Impala和Presto相似,都是对大数据进行快速的交互式查询,同时它也需要安装工作节点。不同的是,Apache Drill支持多种存储,如HDFS、HBase等数据进行数据查询,也支持对如JSON等schema-free的数据进行查询。
Drill的优缺点如下
优点 1、支持自定义的嵌套数据集(如JSON ,数据灵活。2、支持多种数据源。
缺点 国内使用的比较少,缺少大型成功案例。出现问题后,维护起来比较困难。
Apache Phoenix是一个运行在HBase上的SQL框架,其本质是用Java写的基于JDBC API操作HBase的开源SQL引擎,通过Phoenix可以像使用MySQL等关系型数据库一样操作HBase中的表。
Phoenix的优缺点如下
优点 支持事务,高并发读写,支持多列的二级索引,支持JDBC等。
缺点 Phoenix创建的表一旦创建,表的Schema信息则不能修改。
Shark是使用Scala语言开发的一个开源的SQL查询引擎。与Impala和Presto相似的是,Shark的设计目的是作为Hive的补充,同时,在它自己的工作节点集合上执行查询而不是使用MAPReduce。与Impala和Presto不同的是,Shark构建在已有的Apache Spark数据处理引擎之上。
Shark的优缺点如下
优点 由于底层计算采用了Spark,性能比MapReduce的Hive普遍快两倍以上,当数据全部加载在内存的话,将快十倍以上。
缺点 对Hive的依赖性太强,难以支持其长远发展,比如不能和Spark的其他组件进行很好的集成。
Spark的执行效率高于MAPReduce的执行效率,Hive运行在Spark上的产品则是Shark。Shark的本质是通过Hive的HQL解析,从Hive的元数据获取数据库的表信息,由Shark获取并放到Spark上运算。
Shark的性能要远远高于Hive,但是由于Shark过于依赖Hive,继承了大量的Hive代码,给优化和维护带来了大量的麻烦。所以为了更好的发展,Databricks宣布终止对Shark的开发,将相应的SQL处理功能独立出来,更名为Spark SQL。Spark SQL抛弃原有Shark的代码,汲取了Shark的优点,如内存列存储、Hive兼容性等;重新开发了Spark SQL代码,由于摆脱了对Hive的依赖。Spark SQL无论在数据兼容、性能优化、组件扩展方面都得到了极大的升级。
所以Hive是Shark的前身,Shark是Spark SQL的前身,Spark SQL产生的根本原因是为了摆脱Hive的限制。
Spark SQL是Spark的核心组件之一,用于结构化数据处理。和Spark RDD编程不同,Spark SQL提供了更高层级的接口使得处理和计算数据更加方便。在Spark SQL中,不仅能使用SQL进行数据处理,还能使用API的方式处理和分析数据,而且还可以访问包括Hive、Parquet、JSON在内的数据源。
(1 易整合
无缝的整合了SQL查询和Spark程序。Spark SQL允许将结构化数据作为Spark中的分布式数据集(RDD)进行查询,在Python,Scala和Java中集成了API。这种紧密的集成可以轻松地运行SQL查询以及复杂的分析算法。
(2 统一的数据访问方式
使用相同的方式连接不同的数据源。可以使用统一的接口来访问各种数据源,包括Hive、Avro、Parquet、ORC、JSON和JDBC。
(3 兼容Hive
在已有的仓库上直接运行SQL 者HQL。Spark SQL重用了Hive前端和MetaStore,与现有Hive数据,查询和UDF的完全兼容性,只需将其与Hive一起安装即可。
(4 标准的数据连接
通过JDBC 者ODBC来连接。Spark SQL包括具有行业标准JDBC和ODBC连接的服务器模式。
关系数据库中的数据表,在Spark SQL中被定义为DataFrame。DataFrame由两部分组成 表结构的Schema和数据集合RDD。
RDD和DataFrame的区别
从上图可知,RDD是分布式的Java对象的数据集合,而DataFrame在RDD的基础上增加了Schema的结构信息。所以,可以把DataFrame看成一张表;Schema看成为表头,即表中每一列都带有的名称和数据类型;RDD也可以看成为表中数据。DataFrame有个曾用名叫SchemaRDD,这就不难理解了。
下图为RDD和DataFrame中的数据,这样看RDD和DataFrame的区别就很明显了。
RDD和DataFrame中的数据
左侧的RDD[Person]虽然以Person为类型参数,但Spark框架本身不了解Person类的内部结构。而右侧的DataFrame却提供了详细的结构信息,使得Spark SQL可以清楚地知道该数据集中包含哪些列,每列的名称和数据类型各是什么。
DataFrame还在Spark Core基础上提供了API接口,其实就是各种算子,达到了提升执行效率,减少数据读取,优化执行计划的目的。
Powered by 小羊羔外链网 8.3.7
©2015 - 2024 小羊羔外链网
您的IP:44.222.242.27,2024-03-29 21:00:11,Processed in 0.048 second(s).