带有HiveContext的多个Spark应用程序
有两个独立的pyspark应用程序实例化一个HiveContext
代替SQLContext
让两个应用程序之一失败,错误:
例外:(“你必须使用Hive构buildSpark,导出'SPARK_HIVE = true'并运行build / sbt assembly”,Py4JJavaError(调用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
replaceHiveContext
一切都很好。
有谁知道这是为什么?
默认情况下,Hive(Context)使用embedded式Derby作为Metastore。 它主要用于testing和支持只有一个活跃的用户。 如果您想要支持多个正在运行的应用程序,则应该configuration一个独立的Metastore。 此时Hive支持PostgreSQL,MySQL,Oracle和MySQL。 configuration细节取决于后端和选项(本地/远程),但一般来说,你需要:
- 一个正在运行的RDBMS服务器
- 使用提供的脚本创build的Metastore数据库
- 一个适当的Hive configuration
Cloudera提供了一个您可能认为有用的综合指南: configurationHive Metastore 。
理论上讲,也可以用适当的configuration创build单独的Derby metastore(请参阅Hive Admin手册 – 本地/embeddedMetastore数据库 )或在服务器模式下使用Derby 。
为了开发,你可以在不同的工作目录下启动应用 这将为每个应用程序创build单独的metastore_db
,并避免多个活动用户的问题。 提供单独的Hiveconfiguration应该可以工作,但在开发中不太有用:
当未由hive-site.xmlconfiguration时,上下文自动在当前目录中创buildmetastore_db