有两个单独的pyspark应用程序来示例化 HiveContext
代替 SQLContext
让两个应用程序中的一个失败并返回错误:
例外情况:(“你必须用Hive制造Spark。导出'spark\u hive=true'并运行build/sbt assembly',py4jjavaerror(调用none.org.apache.spark.sql.hive.hivecontext时出错。\n',javaobject id=o34039))
另一个应用程序成功终止。
我正在使用pythonapi中的spark1.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
与 SQLContext
一切都很好。
有人知道为什么吗?
1条答案
按热度按时间jyztefdp1#
默认情况下,配置单元(上下文)使用嵌入式derby作为元存储。它主要用于测试,只支持一个活动用户。如果您想支持多个正在运行的应用程序,您应该配置一个独立的元存储。目前,hive支持postgresql、mysql、oracle和mysql。配置的详细信息取决于后端和选项(本地/远程),但一般来说,您需要:
正在运行的rdbms服务器
使用提供的脚本创建的元存储数据库
适当的Hive配置
cloudera提供了一个全面的指南:配置配置单元元存储。
理论上,还可以使用适当的配置创建单独的derby元存储(请参阅配置单元管理手册-本地/嵌入式元存储数据库)或在服务器模式下使用derby。
对于开发,您可以在不同的工作目录中启动应用程序。这将创建单独的
metastore_db
并避免了多个活动用户的问题。提供单独的Hive配置也应该起作用,但在开发中用处不大:当hive-site.xml没有配置时,上下文会自动在当前目录中创建metastore\ db