Spark SQL与Hive On Spark区别


Hive是目前大数据领域,事实上的SQL标准。其底层默认是基于MapReduce实现的,但是由于MapReduce速度实在比较慢,因此这两年,陆续出来了新的SQL查询引擎。包括Spark
SQL,Hive On Tez,Hive On Spark等。
Spark SQL与Hive On Spark是不一样的。Spark
SQL是Spark自己研发出来的针对各种数据源,包括Hive、JSON、Parquet、JDBC、RDD等都可以执行查询的,一套基于Spark计算引擎的查询引擎。因此它是Spark的一个项目,只不过提供了针对Hive执行查询的工功能而已。适合在一些使用Spark技术栈的大数据应用类系统中使用。
而Hive On Spark,是Hive的一个项目,它是指,不通过MapReduce作为唯一的查询引擎,而是将Spark作为底层的查询引擎。Hive On
Spark,只适用于Hive。

Hive的基本工作原理

首先看一下Hive的基本工作原理:
Hive QL语句 =>
语法分析 => AST =>
生成逻辑执行计划 => Operator Tree =>
优化逻辑执行计划 => Optimized Operator Tree =>
生成物理执行计划 => Task Tree =>
优化物理执行计划 => Optimized Task Tree =>
执行优化后的Optimized Task Tree

Hive On Spark的计算原理要点

* 将Hive表作为Spark RDD来进行操作:这个是没有疑问的
* 使用Hive原语

对于一些针对RDD的操作,比如groupByKey、sortByKey等。不使用Spark的transformation操作和原语。如果那样做的话,那么就需要重新实现一套Hive的原语,而且如果Hive增加了新功能,那么又要实现新的Spark原语。因此选择将Hive的原语包装为针对RDD的操作即可。
* 新的物理执行计划生成机制
使用SparkCompiler将逻辑执行计划,即Operator Tree,转换为Task Tree。提交Spark
Task给Spark进行执行。SparkTask包装了DAG,DAG包装为SparkWork。SparkTask根据SparkWork表示的DAG计算。
* SparkContext生命周期
Hive On
Spark会为每个用户的会话,比如执行一次SQL语句,创建一个SparkContext。但是Spark不允许在一个JVM内创建多个SparkContext。因此,需要在单独的JVM中启动每个会话的SparkContext,然后通过RPC与远程JVM中的SparkContext进行通信。
* 本地和远程运行模式
Hive On Spark提供两种运行模式,本地和远程。如果将Spark Master设置为local,比如set
spark.master=local,那么就是本地模式,SparkContext与客户端运行在一个JVM中。否则,如果将Spark
Master设置为Master的地址,那么就是远程模式,SparkContext会在远程的JVM中启动。

远程模式下,每个用户Session都会创建一个SparkClient,SparkClient启动RemoteDriver,RemoteDriver负责创建SparkContext。
Hive On Spark优化

* Map Join
Spark
SQL默认对join是支持使用broadcast机制将小表广播到各个节点上,以进行join的。但是问题是,这会给Driver和Worker带来很大的内存开销。因为广播的数据要一直保留在Driver内存中。所以目前采取的是,类似乎MapReduce的Distributed
Cache机制,即提高HDFS replica factor的复制因子,以让数据在每个计算节点上都有一个备份,从而可以在本地进行数据读取。
* Cache Table
对于某些需要对一张表执行多次操作的场景,Hive On
Spark内部做了优化,即将要多次操作的表cache到内存中,以便于提升性能。但是这里要注意,并不是对所有的情况都会自动进行cache。所以说,Hive On
Spark还有很多不完善的地方。
Hive On Spark环境搭建

Hive On Spark使用

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信