具有 HiveContext 的多个 Spark 应用程序

Posted

技术标签:

【中文标题】具有 HiveContext 的多个 Spark 应用程序【英文标题】:Multiple Spark applications with HiveContext 【发布时间】:2016-01-10 13:22:28 【问题描述】:

拥有两个单独的 pyspark 应用程序来实例化 HiveContext 代替 SQLContext 会使两个应用程序之一失败并出现错误:

Exception: ("You must build Spark with Hive. Export 'SPARK_HIVE=true' and run build/sbt assembly", Py4JJavaError(u'An error occurred while calling None.org.apache.spark.sql.hive.HiveContext .\n', JavaObject id=o34039))

另一个应用程序成功终止。

我正在使用 Python API 中的 Spark 1.6,并希望使用一些 Dataframe 函数,这些函数仅受 HiveContext 支持(例如 collect_set)。我在 1.5.2 及更早版本上遇到过同样的问题。

这足以重现:

import time
from pyspark import SparkContext, SparkConf
from pyspark.sql import SQLContext

conf = SparkConf()
sc = SparkContext(conf=conf)
sq = HiveContext(sc)

data_source = '/tmp/data.parquet'
df = sq.read.parquet(data_source)
time.sleep(60)

sleep 只是为了在我启动另一个进程时保持脚本运行。

如果我运行此脚本的两个实例,则在读取 parquet 文件时会显示上述错误。当我将HiveContext 替换为SQLContext 时,一切都很好。

有人知道这是为什么吗?

【问题讨论】:

【参考方案1】:

默认情况下,Hive(Context) 使用嵌入式 Derby 作为元存储。它主要用于测试并且仅支持一个活跃用户。如果您想支持多个正在运行的应用程序,您应该配置一个独立的元存储。目前 Hive 支持 PostgreSQL、mysql、Oracle 和 MySQL。配置细节取决于后端和选项(本地/远程),但一般来说您需要:

正在运行的 RDBMS 服务器 使用provided scripts 创建的元存储数据库 一个合适的 Hive configuration

Cloudera 提供了一份综合指南,您可能会觉得有用:Configuring the Hive Metastore。

理论上,也应该可以使用适当的配置创建单独的 Derby 元存储(请参阅Hive Admin Manual - Local/Embedded Metastore Database)或使用Derby in Server Mode。

对于开发,您可以在不同的工作目录中启动应用程序。 This will create separate metastore_db for each application 并避免多个活跃用户的问题。提供单独的 Hive 配置应该也可以,但在开发中用处不大:

hive-site.xml未配置时,上下文自动在当前目录创建metastore_db

【讨论】:

以上是关于具有 HiveContext 的多个 Spark 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在 Spark CLI 中初始化 HiveContext

Spark - HiveContext |错误的时间戳(减去 4 小时)

Apache Spark SQLContext 与 HiveContext 有啥区别?

Spark Window Functions 需要 HiveContext?

Spark初始换HiveContext空指针异常

Spark HiveContext vs HbaseContext?