最近在学习过程中发现SparkSQL、Hive on Spark、Spark on Hive是非常容易混淆的的概念。了解三者的关系前,先要先明白几个概念。
- 分布式计算引擎有两种MapReduce和SparkRDD,后者是比前者更优秀的框架。
- HiveSQL(HQL)和SparkSQL是分别属于HIve和Spark的SQL解析模块,SparkSQL是Spark生态中的 一员,SQL解析完成后可以直接调用SparkRDD。
- 原生的Hive模式,即HIve on MapReduce。它是当时唯一运行在Hadoop上的SQL-on-hadoop工具。它的 SQL解析器是HIveSQL(HQL),计算引擎是依赖于Hadoop的MapReduce,因为MapReduce计算过程中的shuffle消耗大量的I/O,运行效率低,所以才有了以下两种解决方案。
1.Hive on Spark
相对于HIve on MapReduce,本质上来说,Hive on Spark是Hive把自己的引擎从MapReduce替换为更高效的SparkRDD。数据源是hive本身,当我们执行HQL时底层已经不再是将HQL转换为MapReduce任务,而是跑SparkRDD任务。
在hive-site-xml中把hive.execution.engine配置换成spark,在hive所在节点安装Spark并配置环境变量。外部远程登录或者hive命令行模式就会执行spark任务了。
即:Hive on Spark = HQL解析 + SparkRDD引擎
2.Spark on Hive
Spark on Hive是以Spark角度看Hive是数据源,在Spark中配置Hive,并获取Hive中的元数据,然后用SparkSQL操作hive表的数据并直接翻译成SparkRDD任务。Hive只是作为一个Spark的数据源。
bin/spark-sql、bin/spark-submit采用的是这种方式。提交任务的jar必须带着hive-site.xml的配置。
即:Spark on Hive = SparkSql解析 + SparkRDD引擎
两种模式对比虽然计算引擎都是SparkRDD,但是
Spark on Hive的模式更加丝滑,性能更好。
HIve on Spark的模式对大数据周边组件的支持兼容性更好。