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 执行结果图)的过程:
表明我们使用的查询引擎
提交生成运行的 job,这个 job 提交到的是 yarn
是这个 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 来进行处理。
具体来说:
hive on spark:在这种模式下,数据是以 table 的形式存储在 hive 中的,用户处理和分析数据,使用的是 hive 语法规范的 hql (hive sql)。 但这些 hql,在用户提交执行时(一般是提交给 hiveserver2 服务去执行),底层会经过 hive 的解析优化编译,最后以 spark 作业的形式来运行。目前 hive 支持了三种底层计算引擎,即 mr, tez 和 spark.用户可以通过 set hive.execution.engine=mr/tez/spark 来指定具体使用哪个底层计算引擎。
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 的区别,会在后续文章继续进行。欢迎大家评论并提出意见。
版权声明: 本文为 InfoQ 作者【一生要强的查数姑】的原创文章。
原文链接:【http://xie.infoq.cn/article/7c3763d1ed86c419b91c6b59b】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论