写点什么

hive on spark 还是 spark on hive?

  • 2022 年 9 月 01 日
    北京
  • 本文字数:2019 字

    阅读完需:约 7 分钟

hive on spark 还是 spark on hive?

在运行 sql 的时候,hive on spark 还是 spark on hive 到底是什么呢?它们是一个东西吗?区别是什么?

同一个 SQL 的不同执行表现


首先,我们看一个很简单的 SQL

select name,count(1) from student group by name;

表中的数据为

接下来,我们通过 mr、hive on spark 和 spark on hive 这三种执行方式结合他们的执行计划来进行分析。

使用 mr 查询

当我们在 hive 中使用 mr 查询的时候,会发生如图 1(mr 执行结果图)的过程:

  1. 表明我们使用的查询引擎

  2. 提交生成运行的 job,这个 job 提交到的是 yarn

  3. 是这个 job 中 stage 运行 mr 执行的过程



图 1  mr 执行结果图

然后,我们看一下它的执行计划图 2:



图 2 mr 执行计划图 


使用 hive on spark 查询

当我们在 hive 中使用 spark 引擎查询的时候,执行步骤 1,2,3 为下,具体过程见图 3(hive on spark 执行结果):

1 是表名我们使用的查询引擎

2 提交生成运行的 job,可以看出生成的是 spark 的 job

3 是这个 spark job 中 stage 运行过程以及状态的变化



图 3 hive on spark 执行结果


同样的,我们也查看一下它具体的执行计划,见图 4(hive on spark 执行计划)中的具体执行说明



 图 4 hive on spark 执行计划

使用 spark on hive 执行

对于 spark on hive 我们主要查看他的执行计划,具体说明见图 5 (spark on hive 执行计划)



图 5  spark on hive 执行计划

通过以上的执行计划,我们会发现,虽然是同一个 sql,虽然都是使用 hive 和 spark ,可执行计划为什么会有这么大的不同呢?接下来我们来进行一下分析。

hive 和 spark 介绍

首先,我们先来了解一下 hive 和 spark 。

hive 是基于 Hadoop 构建的一套数据仓库分析系统,它提供了丰富的 SQL 查询方式来分析存储在 Hadoop分布式文件系统中的数据:可以将结构化的数据文件映射为一张数据库表,并提供完整的 SQL 查询功能;可以将 SQL 语句转换为 MapReduce 任务运行,通过自己的 SQL 查询分析需要的内容,这套 SQL 简称 Hive SQL,使不熟悉 mapreduce 的用户可以很方便地利用 SQL 语言查询、汇总和分析数据。这也就是 SQL-on-Hadoop 的解决方案之一。

spark 的前身是 shark,即"Hive on Spark",在启动初期,当时 Hive 几乎算是唯一的 SQL-on-Hadoop 的选择方案,Hive 将 SQL 语句翻译为 MapReduce ,但是这样,性能会受限于 MapReduce 的计算模型,始终无法满足各种交互 SQL 分析的需求,所以 Shark 的提出是针对这种需求的。

但是,随着 Spark 的不断发展, Shark 对 Hive 的重度依赖体现在架构上的瓶颈越来越突出 。一 方面, Hive 的语法解析和查询优化等模块本身针对的是 MapReduce,限制了在 Spark 系统上的深度优化和维护; 另一方面,过度依赖 Hive 制约了 Spark 的“OneStackRuleThemAll”既定方针,也制约了技术检中各个组件的灵活集成。 在此背景下, SparkSQL 项目被提出来,由 MichaelArmbrust 主导开发。 SparkSQL 抛弃原有 Shark 的架构方式,但汲取了 Shark 的一些优点,如内存列存储(In-MemoryColumnarStorage)、 Hive 兼容性等, 重新开发了 SQL 各个模块的代码。 由于摆脱了对 Hive 的依赖, SparkSQL 在数据兼容、性能优化、组件扩展方面都得到了极大的提升。


hive on spark 和 spark on hive 区别

了解了基本的概念,接下来,我们通过 SQL 的执行过程,来进行分析。

首先,从图 1-图 5 的各种执行计划中我们会发现,mr 的执行计划和 hive on spark 的执行计划差不多一样的,只是在提交的时候,mr 是通过 mapreduce,而 hive on spark 却是通过 spark 作业运行的。

而 spark on hive 的执行计划,它对于 sql 的解析是完全按照 spark 自己的解析器进行的,作业的提交也是通过 spark 作业。使用 SQL 执行的模型来说,可归结为下图 6 (SQL 转化过程):



图 6 SQL 转换过程


从这张图中,我们可以很明显的看出:

hive on spark :在进行到物理执行计划前,都是使用 hive 原生的语法解析器,而在最后运行阶段交由 spark 执行。

spark on hive: 除了链接了 hive 的 metastore 来获取 hive 的元数据,从语法解析到物理执行全过程都是由 spark 自身的 catalyst 来进行处理。


具体来说:

  1. hive on spark:在这种模式下,数据是以 table 的形式存储在 hive 中的,用户处理和分析数据,使用的是 hive 语法规范的 hql (hive sql)。 但这些 hql,在用户提交执行时(一般是提交给 hiveserver2 服务去执行),底层会经过 hive 的解析优化编译,最后以 spark 作业的形式来运行。目前 hive 支持了三种底层计算引擎,即 mr, tez 和 spark.用户可以通过 set hive.execution.engine=mr/tez/spark 来指定具体使用哪个底层计算引擎。

  2. spark on hive:当我们使用 spark 来处理分析存储在 hive 中的数据时,这种模式就称为为 spark on hive。这种模式下,用户可以使用 spark 的 java/scala/pyhon/r 等 api,也可以使用 spark 语法规范的 sql ,甚至也可以使用 hive 语法规范的 hql 。(其实从技术细节来将,这里把 hql 语句解析为抽象语法书 ast,使用的是 hive 的语法解析器,但后续进一步的优化和代码生成,使用的都是 spark sql 的 catalyst)。


那么,本篇文章先讲到这里,而对于详细的 spark sql 和 hive sql 的区别,会在后续文章继续进行。欢迎大家评论并提出意见。

发布于: 刚刚阅读数: 3
用户头像

还未添加个人签名 2022.01.09 加入

还未添加个人简介

评论

发布
暂无评论
hive on spark 还是 spark on hive?_大数据_一生要强的查数姑_InfoQ写作社区