使用HiveContext的多个Spark应用程序

时间:2016-01-10 13:22:28

标签: apache-spark hive pyspark

有两个单独的pyspark应用程序实例化HiveContext代替SQLContext,这两个应用程序中的一个会因错误而失败:

  

例外:("你必须用Hive构建Spark。导出' SPARK_HIVE = true'并运行build / sbt assembly",Py4JJavaError(你'调用时出错) .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只是为了在我启动其他进程时保持脚本运行。

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

有谁知道为什么会这样?

1 个答案:

答案 0 :(得分:6)

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

Cloudera提供了一个有用的综合指南:Configuring the Hive Metastore

理论上,也应该可以使用适当的配置创建单独的Derby Metastore(请参阅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