剖析下 HiveOnSpark与 SparkOnHive 的异同

简介: 剖析下 HiveOnSpark与 SparkOnHive 的异同

一。引言

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

二。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的定位

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实时化-这里的实时化指小时级别的实时化,达不到分钟级别)。

四。hive 和 spark:恩怨交织,爱恨情仇下碰撞出的火花

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

  1. 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来指定具体使用哪个底层计算引擎。
  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的支持(其实从技术细节来将,这里把hql语句解析为抽象语法书ast,使用的是hive的语法解析器,但后续进一步的优化和代码生成,使用的都是spark sql 的catalyst),这也是市场推广策略的一种吧。
  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);
  4. Hive 2.0 之后,MR执行引擎已经出于deprecated 状态,“It may be removed without further warning.”,hive官方推荐使用的是 hive on tez 或 hive on spark; Hiv3.0 之后, hive官方推荐使用的是 hive on tez,并在Hive4.0中,移除了 hive on spark;

image.png

五。HiveOnSpark 和 SparkOnHive 的核心异同

概括起来,SparkOnHive和 HiveOnSpark的核心区别:

  • 不在于是否访问HIVE数仓中的数据(二者都访问);
  • 也不在于客户端的SQL语法规范是 HIVE SQL 还是 SPARK SQL(Spark支持绝大部分HiveSqly语法);
  • 二者的核心区别在于,客户端的 SQL 是否提交给了服务角色 HiveServer2 (org.apache.hive.service.server.HiveServer2),且该hs2配置了 hive.execution.engine=spark;

image.png

spark on hive

image.png

hive on spark

六。Spark SQL gateway 的解决方案-Kyuubi

•HiveServer2 本质上是 HIVE 提供的 SQL gateway服务;

•Spar k原生提供的 SQL gateway 服务,只有 spark thrift Server($SPARK_HOME/sbin/start-thriftserver.sh) ,但因为功能和稳定性等各种原因,不推荐在生产环境使用($SPARK_HOME/bin/spark-sql 只是一个spark 应用,不是服务);

•网易的开源组件 Kyuubi,起到了 Spark SQL gateway服务的角色,该项目目前已经是 Apache 顶级开源项目,可以在生产环境使用;

https://kyuubi.apache.org/

image.png

image.png

相关文章
|
1天前
|
分布式计算 Java 数据处理
Apache Spark优缺点大揭秘
【10月更文挑战第12天】
|
5月前
|
Java 程序员 调度
park与unpark基本使用与原理分析
park与unpark基本使用与原理分析
103 0
|
5月前
|
消息中间件 分布式计算 Kafka
Spark中的Spark Streaming是什么?请解释其作用和用途。
Spark中的Spark Streaming是什么?请解释其作用和用途。
65 0
|
5月前
|
SQL 机器学习/深度学习 分布式计算
Spark的主要概念
Spark的主要概念
|
机器学习/深度学习 分布式计算 数据处理
Apache Spark 的基本概念
Apache Spark 的基本概念
|
安全 Java 程序员
如何理解并使用 park 与 unpark
park和unpark是Java中的两个线程同步工具,用于线程的阻塞和唤醒操作。
363 0
如何理解并使用 park 与 unpark
|
分布式计算 Spark
3.1 spark编程
3.1 spark编程
|
分布式计算 Spark
Spark的几个概念
Spark的几个概念
167 0
|
存储 分布式计算 大数据
Spark中几种ShuffleWriter的区别你都知道吗?
一.前言 在Spark中有三种shuffle写,分别是BypassMergeSortShuffleWriter、UnsafeShuffleWriter、SortShuffleWriter。分别对应三种不同的shuffleHandle。
1331 0
|
存储 分布式计算 大数据
Spark学习[扩展阅读] 详解 Spark RDD
为了能解决程序员能在大规模的集群中以一种容错的方式进行内存计算这个问题, 我们提出了 RDDs 的概念. 当前的很多框架对迭代式算法场景与交互性数据挖掘场景的处理性能非常差, 这个是 RDDs 的提出的动机.
4642 0