当前位置:数据分析 > Hive和Spark之间的爱恨情仇交织在一起

Hive和Spark之间的爱恨情仇交织在一起

  • 发布:2023-10-05 10:34

本文转载自微信公众号《明哥的IT随笔》,作者IT明哥。转载本文请联系明哥IT文公众号。​ 最近,在采访一些正在应聘大数据职位的技术伙伴时,发现很多人对于业内所谓的hive on Spark、spark on hive并不清楚。同时,在日常工作中,也是因为他们对这两个专业术语的理解。不一致,影响了进一步的技术交流。那么在这里,明哥想和大家聊聊hive和spark之间的爱恨情仇。 蜂巢的定位 Hive 官方网站有这样的描述:“Apache Hive 数据仓库软件有助于使用 SQL 读取、写入和管理驻留在分布式存储中的大型数据集。” Hive定位为数据仓库,提供使用SQL对分布式存储中的大型数据集进行读取、写入和管理的功能。大规模数据,即hive负责数据的存储和管理(实际上是依赖底层的hdfs文件系统或者s3等对象存储系统),同时还负责通过sql对数据进行处理和分析。因此,hive仅用于处理结构化数据,仅提供SQL进行分析处理。而且一般来说,hive只能批量处理数据。 (在使用hive的hbase映射表时,具有一定的实时能力;同时flink社区也在尝试让hive实时化——这里的实时是指小时级别的实时,无法达到分钟级别)。 Spark的定位 正如Spark官网所说,“Apache Spark是一个用于大规模数据处理的统一分析引擎”。 Spark是一个处理大规模数据的通用分析引擎,也就是说,Spark是一个计算引擎,而不是存储引擎,本身并不负责数据存储。其分析处理数据的方法可以使用SQL,也可以使用java、scala、python甚至R等API;其分析处理数据的方式可以是批处理,也可以是流处理;以及它分析和处理的数据,可以通过插件连接很多数据源,可以是结构化数据、半结构化甚至半结构化数据,包括关系型数据库RDBMS、hbase、mongodb、es等各种NoSQL数据库等。包括文件系统hdfs、对象存储oss、s3等。 蜂巢与火花:爱与恨的火花相互交织。 通过上面的解释,我们可以看出spark和hive本质上是没有关系的,而且可以相互独立。但在实际的企业应用中,两者常常结合使用。 Spark与Hive的结合业界主要有以下三种方式: 蜂巢上的火花。在这种模式下,数据以表的形式存储在hive中。用户使用hive语法标准化的hql(hive sql)来处理和分析数据。但当这些hql被用户提交执行时(一般是提交给hiveserver2服务执行),底层会被hive解析、优化、编译,最后作为spark作业运行。事实上,早期Hive只支持一种底层计算引擎,即mapreduce。后来,Spark因其速度和效率占领了大量市场后,Hive社区积极拥抱Spark,并通过改造自己的代码支持Spark作为其底层计算引擎。目前,hive支持三种底层计算引擎,分别是mr、tez和spark。用户可以通过设置 hive.execution.engine=mr/tez/spark 来指定使用哪个底层计算引擎。 蜂巢上的火花。前面说过,spark本身只负责数据计算和处理,并不负责数据存储。其计算和处理的数据源可以以插件的形式支持多种数据源,其中自然包括Hive。当我们使用spark来处理和分析hive中存储的数据时,这种模式称为spark on hive。在这种模式下,用户可以使用spark的java/scala/pyhon/r等API,也可以使用spark的带有语法规范的sql,甚至可以使用带有hive语法规范的hql。之所以也可以使用hql,是因为spark在推广之初就积极拥抱了hive,通过改造自己的代码,为包括hive udf在内的hql提供了原生支持(其实从技术细节上来说,这里是hql语句分析为抽象语法书AST,使用了hive的语法解析器,但为了进一步优化和代码生成,使用了spark sql的催化剂)。这也是一种营销策略。 Spark + Spark Hive 目录。这是spark和hive结合的新情况。随着数据湖相关技术的进一步发展,这种模式现在受到市场上越来越多用户的青睐。本质就是将数据以orc/parquet/delta Lake等格式存储在hdfs等分布式文件系统或者s3等对象存储系统中,然后使用scala/java/python等进行标准化Spark计算引擎提供的API或者Spark语法规范sql进行处理。由于处理分析时的目标对象是一张表,而表底层对应的是HDFS/S3上的文件/对象,所以我们需要维护表与文件/对象的映射关系,而spark本身提供了Spark Hive 目录维护这种表到文件/对象的映射关系。请注意,这里的spark hive目录本质上是使用Hive的metasore相关API来读取和写入表到文件/对象映射(以及其他元数据信息)到metasore db(例如mysql,postgresql和其他数据库)中。 (由于Spark在编译时可以将Hive Metastore API等相关代码打包到Spark的二进制安装包中,因此使用这种模式,我们不需要单独安装Hive)。

相关文章