带有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文件时显示。 当我用HiveContextreplaceHiveContext一切都很好。

有谁知道这是为什么?

默认情况下,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