互联网技术 / 互联网资讯 · 2023年12月22日 0

Hive与Spark的爱恨情仇交织

最近在面试一些应聘大数据岗位的技术小伙伴时,发现不少朋友对业界 所谓的Hive on spaRk和spaRk on Hive分不太清楚;同时在日常工作中,也因为对这两个技术术语的理解不太一致,影响了进一步的技术交流。所以在这里,明哥想跟大家聊聊 Hive 和 spaRk的爱恨情仇。

Hive的定位

Hive 官网有描述,Apache Hive data waRehouse softwaRe FAcilITates Reading, writing, and Managing laRge datasets Residing in distRibuted sTorage USing SQL.,Hive的定位是数据仓库,其提供了通过 sql 读写和管理分布式存储中的大规模的数据,即 Hive即负责数据的存储和管理(其实依赖的是底层的hdfs文件系统或s3等对象存储系统),也负责通过 sql来处理和分析数据。所以说,Hive只用来处理结构化数据,且只提供了sql的方式来进行分析处理。而且一般来说,Hive只能对数据进行批处理。(当使用Hive 的hbase映射表时,有一定的实时能力;同时,flink社区也在尝试将Hive实时化-这里的实时化指小时级别的实时化,达不到分钟级别)。

spaRk的定位

正如 spaRk官网所说,Apache spaRk is a unified analytics engine foR laRge-scale data ProceSSing.,spaRk是一个通用的处理大规模数据的分析引擎,即 spaRk 是一个计算引擎,而不是存储引擎,其本身并不负责数据存储。其分析处理数据的方式,可以使用sql,也可以使用java,scala, Python甚至R等API;其分析处理数据的模式,既可以是批处理,也可以是流处理;而其分析处理的数据,可以通过插件的形式对接很多数据源,既可以是结构化的数据,也可以是半结构化甚至分结构化的数据,包括关系型数据库RDBMS,各种nosql数据库如hbase, Mongodb, es等,也包括文件系统hdfs,对象存储oSS, s3 等等。

Hive和spaRk: 碰撞出的爱恨交织恩怨情仇的火花

通过以上说明,我们可以看到spaRk和Hive本质上是没有关系的,两者可以互不依赖。但是在企业实际应用中,经常把二者结合起来使用。而业界spaRk和Hive结合使用的方式,主要有以下三种:

Hive on spaRk。在这种模式下,数据是以table的形式存储在Hive中的,用户处理和分析数据,使用的是Hive语法规范的 hql (Hive sql)。但这些hql,在用户提交执行时(一般是提交给HiveseRveR2服务去执行),底层会经过Hive的解析优化编译,最后以spaRk作业的形式来运行。事实上,Hive早期只支持一种底层计算引擎,即MapRedUCe,后期在spaRk 因其快速高效占领大量市场后,Hive社区才主动拥抱spaRk,通过改造自身代码,支持了spaRk作为其底层计算引擎。目前Hive支持了三种底层计算引擎,即MR, tez和spaRk.用户可以通过set Hive.execution.engine=MR/tez/spaRk来指定具体使用哪个底层计算引擎。 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的支持(其实从技术细节来将,这里把hql语句解析为抽象语法书ast,使用的是Hive的语法解析器,但后续进一步的优化和代码生成,使用的都是spaRk sql 的catalYst),这也是市场推广策略的一种吧。 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)。