Spark和Hive的联系
通常来说,
Spark
和
Hive
本质上是没有关系的,两者可以互不依赖。但是在企业实际应用中,经常把二者结合起来使用。Spark
和
Hive
结合和使用的方式,主要有以下三种:
1
、
Hive on Spark
在这种模式下,数据是以
table
的形式存储在
hive
中的,用户处理和分析数据,使用的是
Hive
语法规范的hql。 但
这些
hql
,在用户提交执行时,底层会经过解析编译以
Spark
作业的形式来运行
。(事实上,Hive早期只支持一种底层计算引擎,即
MapReduce
,后期在
Spark
因其快速高效占领大量市场后,
Hive
社区才主动拥抱Spark
,通过改造自身代码,支持了
Spark
作为其底层计算引擎。目前
Hive
支持了三种底层计算引擎,即mr
,
Tez
和
Spark
。用户可以通过
set hive.execution.engine=mr/tez/spark
来指定具体使用哪个底层计算引擎。
2
、
Spark on Hive
Spark
本身只负责数据计算处理,并不负责数据存储。
其计算处理的数据源,可以以插件的形式支持很
多种数据源,这其中也包括
hive
。
当我们使用
Spark
来处理分析存储在
Hive
中的数据时,这种模式就称
为为
Spark on Hive
。这种模式下,用户可以使用
Spark
的
java/scala/pyhon/r
等
api
,也可以使用
Spark
语法规范的sql
,甚至也可以使用
hive
语法规范的
hql
(之所以也能使用
hql
,是因为
Spark
在推广面世之初,就主动拥抱了hive
,通过改造自身代码提供了原生对
hql
包括
hive udf
的支持,这也是市场推广策略的一种吧)。
3
、
Spark+Spark Hive catalog
这是
Spark
和
Hive
结合的一种新形势,随着数据湖相关技术的进一步发展,这种模式现在在市场上受到了越来越多用户的青睐。其本质是,数据以
orc/parquet/delta lake
等格式存储在分布式文件系统如
hdfs
或
对象存储系统如
s3
中,然后通过使用
Spark
计算引擎提供的
scala/java/python
等
api
或
Spark
语法规范的
sql
来进行处理
。由于在处理分析时针对的对象是
table
,而
table
的底层对应的才是
hdfs/s3
上的文件
/
对象,所以我们需要维护这种table
到文件
/
对象的映射关系,而
Spark
自身就提供了
Spark Hive catalog
来维护这种table
到文件
/
对象的映射关系。注意这里的
Spark Hive catalog
,其本质是使用了
Hive
的
metasore
相关api来读写表到文件
/
对象的映射关系(以及一起其他的元数据信息)到
metasore db
如
mysql
,
postgresql等数据库中。(由于Spark
编译时可以把
Hive metastore api
等相关代码一并打包到
Spark
的二进制安装包中,所以使用这种模式,我们并不需要额外单独安装hive
)。