发布时间:2022-08-18 18:15
Hive引擎默认的是MapReduce,就是没执行一个Hive语句,其实都是运行了一个MR程序,都知道的,MR虽好,但是慢呢。所以在时代的驱使下,就出现了把Hive的引擎更换的需要,通常Hive的引擎还有tez、Spark。我们经常听到Hive on Spark和Spark on Hive,不明所以的小伙伴还会以为这两个是倒装句,其实不然,Hive on Spark 和 Spark on Hive有着很大的区别
Hive on Spark:直译就是把Hive 放到 Spark上,意思就是把Hive的引擎改为Spark,Hive既作为存储元数据又负责SQL的解析优化,语法是HQL语法,执行引擎变成了Spark,Spark负责采用RDD执行
Spark on Hive:直译就是把Spark放到Hive上,就是将Spark处理的数据放在Hive上,Hive只作为存储元数据,Spark负责SQL解析优化,语法是Spark SQL语法,Spark负责采用RDD执行
Hive on Spark | Spark on Hive | |
---|---|---|
语法 | HQL | Spark SQL |
引擎 | Spark | Spark |
存储 | Hive | Hive |
兼容性说明
官网下载之后的Hive3.1.2和Spark3.0.0是不兼容的,Hive3.1.2支持的Spark版本是2.4.5,所以需要重新编译Hive才能和Spark3.0.0兼容。或者选择Spark2.4.5版本,当然了,选择Spark2.4.5是不可能的,虽然省事,但是我们都不怕麻烦
编译过程也很简单,是的,也很简单简单简单,只需要去官网下载Hive3.1.2的源码,然后再pom文件中将Spark的引用版本改为3.0.0就可以,如果编译通过,直接打成jar包,是不是很简单。但是如果不通过,那就根据报错信息修改,直到不报错,然后达成jar包,确实很简单吧-~-
上传解压saprk-3.0.0-hadoop-bin-3.2.tgz,具体tar包啥名字记不清了,大概长这个样子吧
配置SPARK_HOME环境变量
在hive的配置文件目录下新建spark的配置文件,添加以下内容
spark.master yarn
spark.eventLog.enabled true
spark.eventLog.dir hdfs://hadoop102:8020/spark-history
spark.executor.memory 1g
spark.driver.memory 1g
根据配置文件设置的历史目录,在hdfs上新建相应的目录
hadoop fs -mkdir /spark-history
向HDFS上传Spark纯净版jar包
由于Spark3.0.0非纯净版默认支持的是hive2.3.7版本,直接使用会和安装的Hive3.1.2出现兼容性问题。所以采用Spark纯净版jar包,不包含hadoop和hive相关依赖,避免冲突。
Hive任务最终由Spark来执行,Spark任务资源分配由Yarn来调度,该任务有可能被分配到集群的任何一个节点。所以需要将Spark的依赖上传到HDFS集群路径,这样集群中任何一个节点都能获取到
上传并解压spark-3.0.0-bin-without-hadoop.tgz
tar -zxvf /opt/software/spark-3.0.0-bin-without-hadoop.tgz
上传Spark纯净版jar包到HDFS
hadoop fs -mkdir /spark-jars
hadoop fs -put spark-3.0.0-bin-without-hadoop/jars/* /spark-jars