Apache spark 使用HiveContext的多个Spark应用程序

Apache spark 使用HiveContext的多个Spark应用程序,apache-spark,hive,pyspark,Apache Spark,Hive,Pyspark,如果有两个单独的pyspark应用程序实例化一个HiveContext而不是SQLContext,则两个应用程序中的一个会失败,并出现以下错误: 异常:(“您必须使用Hive.Export'Spark\u Hive=true'构建Spark并运行build/sbt assembly”,Py4JJavaError(调用None.org.apache.Spark.sql.Hive.HiveContext时出错。\n',JavaObject id=o34039)) 另一个应用程序成功终止 我正在使用P

如果有两个单独的pyspark应用程序实例化一个
HiveContext
而不是
SQLContext
,则两个应用程序中的一个会失败,并出现以下错误:

异常:(“您必须使用Hive.Export'Spark\u Hive=true'构建Spark并运行build/sbt assembly”,Py4JJavaError(调用None.org.apache.Spark.sql.Hive.HiveContext时出错。\n',JavaObject id=o34039))

另一个应用程序成功终止

我正在使用Python API中的Spark 1.6,并希望使用一些
Dataframe
函数,这些函数仅受
HiveContext
支持(例如
collect\u 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
只是在启动另一个进程时保持脚本运行

如果有两个脚本实例正在运行,则在读取拼花地板文件时会显示上述错误。当我用
SQLContext
替换
HiveContext
时,一切都很好

有人知道为什么吗?

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

  • 正在运行的RDBMS服务器
  • 使用创建的元存储数据库
  • 适当的蜂巢
Cloudera提供了一个您可能会发现有用的全面指南:

理论上,也可以使用适当的配置创建单独的Derby元存储(请参阅)或使用

对于开发,您可以在不同的工作目录中启动应用程序。并避免多个活动用户的问题。提供单独的配置单元配置也可以,但在开发中用处不大:

如果未通过hive-site.xml进行配置,则上下文会自动在当前目录中创建metastore_db