SparkSQL vs Hive on Spark - 区别和利弊?

Posted

技术标签:

【中文标题】SparkSQL vs Hive on Spark - 区别和利弊?【英文标题】:SparkSQL vs Hive on Spark - Difference and pros and cons? 【发布时间】:2015-10-15 04:45:02 【问题描述】:

SparkSQL CLI 内部使用 HiveQL,如果 Hive on spark(HIVE-7292) ,hive 使用 spark 作为后端引擎。有人可以进一步说明一下,这两种情况到底有什么不同以及两种方法的优缺点?

【问题讨论】:

【参考方案1】:

    SparkSQL 使用 hive 时

    SparkSQL 可以使用 HiveMetastore 来获取存储在 HDFS 中的数据的元数据。此元数据使 SparkSQL 能够更好地优化它执行的查询。这里 Spark 是查询处理器。

    当 Hive 使用 Spark See the JIRA entry: HIVE-7292

    这里的数据是通过 spark 访问的。 Hive 是查询处理器。因此,我们可以利用 Spark Core 的所有设计特性。但这是 Hive 的一项重大改进,截至 2016 年 2 月 2 日仍在“进行中”。

    还有第三种使用 SparkSQL 处理数据的选项

    在不使用 Hive 的情况下使用 SparkSQL。这里 SparkSQL 无法访问 Hive Metastore 中的元数据。查询运行速度较慢。我做了一些性能测试,比较了选项 1 和 3。结果是 here。

【讨论】:

在第三个选项中,如果 SparkSQL 不使用 hive 元存储(默认情况下是 derby 或可以是 mysql),那么我们是否需要为 SparkSQL 设置元存储,就像我们为 Hive 做的一样? 无需为 SparkSQL 设置元存储。 SparkSQL 可以以多种方式使用。但在此选项中,不需要 Metastore 设置。即使没有设置 Hive Metastore 连接,我们也可以使用 sparksql-cli 中的 HiveContext 类。看待这个概念的另一种方式:SparkSQL 可以使用其他数据源,如 csv 文件,其中 Metastore 概念不相关。 如果不需要 Metastore,那么 Spark SQL 如何跟踪表的元数据。它必须将这些信息存储在某个地方。如果它需要 HiveContext 的帮助,则意味着它仍然依赖于 Hive 元存储。 请查看选项 3 的示例代码。您在此处向 Spark 注册了一个 java/scala 类。此类具有基于文件的数据的数据类型。类似于在 JEE 程序中使用休眠模式。在这个link中搜索registerTempTable @shriyog 我认为您将配置单元用作数据仓库。 SparkSQL 并不限制它使用 Tez 作为数据引擎。 SparkSQL 从 Hive 查询数据,Hive 使用 Spark 作为数据引擎。这是一个令人头疼的混乱。【参考方案2】:

SparkSQL 与 Spark API 你可以简单地想象你在 RDBMS 世界中:

SparkSQL 是纯 SQL,Spark API 是编写存储过程的语言

Hive on Spark 与 SparkSQL 类似,是一个纯 SQL 接口,使用 spark 作为执行引擎,SparkSQL 使用 Hive 的语法,所以作为一种语言,我会说它们几乎相同。

但是 Hive on Spark 对 hive 特性的支持要好得多,尤其是 hiveserver2 和安全特性,SparkSQL 中的 hive 特性确实有问题,SparkSQL 中有一个 hiveserver2 impl,但在最新版本 (1.6.x) 中,hiveserver2在 SparkSQL 中不再使用 hivevar 和 hiveconf 参数,并且通过 jdbc 登录的用户名也不起作用......

见https://issues.apache.org/jira/browse/SPARK-13983

我相信 spark 项目中的 hive 支持确实是非常低优先级的东西......

遗憾的是,Hive 上的 spark 集成并不是那么容易,存在很多依赖冲突......例如 https://issues.apache.org/jira/browse/HIVE-13301

而且,当我尝试使用 spark 集成 hive 时,出于调试目的,我总是像这样启动 hive cli:

export HADOOP_USER_CLASSPATH_FIRST=true
bin/hive --hiveconf hive.root.logger=DEBUG,console

我们的要求是以安全的方式(通过身份验证和授权)将 spark 与 hiveserver2 一起使用,目前仅 SparkSQL 无法提供此功能,我们在 Spark 上使用 ranger/sentry + Hive。

希望这可以帮助您更好地了解您应该往哪个方向前进。

【讨论】:

【参考方案3】:

这是我在 hive 官方网站上找到的相关答案: 1.3 与 Shark 和 Spark SQL 的比较 Spark 生态系统中有两个相关项目在 Spark 上提供 Hive QL 支持:Shark 和 Spark SQL。 ●Shark 项目将 Hive 生成​​的查询计划翻译成它自己的表示并通过 Spark 执行它们。 ●Spark SQL 是 Spark 中的一项功能。它使用 Hive 的解析器作为前端来提供 Hive QL 支持。 Spark 应用程序开发人员可以在他们的代码中轻松地用 SQL 以及其他 Spark 运算符表达他们的数据处理逻辑。 Spark SQL 支持与 Hive 不同的用例。

与 Shark 和 Spark SQL 相比,我们的设计方法支持所有现有的 Hive 功能,包括 Hive QL(以及任何未来的扩展),以及 Hive 与授权、监控、审计和其他操作工具的集成。

3。蜂巢级设计 如简介中所述,该项目采用与 Shark 或 Spark SQL 不同的方法,因为我们不会使用 Spark 的原语来实现 SQL 语义。相反,我们将使用 MapReduce 原语来实现它。这里唯一的新事物是这些 MapReduce 原语将在 Spark 中执行。事实上,只有少数 Spark 的原语将用于此设计。

在 Spark 上执行 Hive 的 MapReduce 原语的方法不同于 Shark 或 Spark SQL 的做法具有以下直接优势: 1.Spark 用户将自动获得 Hive 的全部丰富功能,包括 Hive 未来可能引入的任何新功能。 2.这种方法避免或减少了在 Hive 的 Spark 执行引擎中进行任何定制工作的必要性。 3. 它还将限制项目范围并通过保持 Hive-on-Spark 与 Hive MapReduce 和 Tez 一致来减少长期维护。

【讨论】:

以上是关于SparkSQL vs Hive on Spark - 区别和利弊?的主要内容,如果未能解决你的问题,请参考以下文章

SparkSQL vs Hive on Spark - 区别和利弊?

SparkSQL & Spark on Hive & Hive on Spark

黑猴子的家:Spark on hive 与 hive on spark 的区别

SparkSQL与Hive on Spark的比较

Hive,Hive on Spark和SparkSQL区别

Spark SQL(十):Hive On Spark