有两个单独的pyspark应用程序实例化一个HiveContext
代替一个SQLContext
让两个应用程序中的一个失败并出现错误:
例外:("你必须使用Hive构建Spark.导出'SPARK_HIVE = true'并运行build/sbt程序集",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
只是为了在我启动其他进程时保持脚本运行.
如果我运行此脚本的两个实例,则在读取镶木地板文件时会显示上述错误.当我更换HiveContext
同SQLContext
一切都很好.
有谁知道那是为什么?
默认情况下,Hive(Context)使用嵌入式Derby作为Metastore.它主要用于测试并仅支持一个活动用户.如果要支持多个正在运行的应用程序,则应配置独立的Metastore.此时Hive支持PostgreSQL,MySQL,Oracle和MySQL.配置细节取决于后端和选项(本地/远程),但一般来说您需要:
一个正在运行的RDBMS服务器
使用提供的脚本创建的Metastore数据库
适当的Hive 配置
Cloudera提供了一个有用的综合指南:配置Hive Metastore.
从理论上讲,也可以使用适当的配置创建单独的Derby Metastore(请参阅Hive管理员手册 - 本地/嵌入式Metastore数据库)或在服务器模式下使用Derby.
对于开发,您可以在不同的工作目录中启动应用程 这将为metastore_db
每个应用程序创建单独的,并避免多个活动用户的问题.提供单独的Hive配置应该也可以,但在开发中不太有用:
如果未由hive-site.xml配置,则上下文会自动在当前目录中创建metastore_db