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

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)。

OpenMagic API

Need more than content? Move into the product flow.

If you are here for model access, pricing, developer docs, or the future API console, the dedicated product path now lives on api.openmagic.ai.

登录免费注册