具有 HiveContext 的多个 Spark 应用程序
Multiple Spark applications with HiveContext
有两个单独的 pyspark 应用程序实例化 HiveContext
代替 SQLContext
让两个应用程序之一失败并出现错误:
Exception: ("You must build Spark with Hive. Export 'SPARK_HIVE=true' and run build/sbt assembly", Py4JJavaError(u'An error occurred while calling 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 文件时会出现上述错误。当我用 SQLContext
替换 HiveContext
时,一切都很好。
有人知道这是为什么吗?
默认情况下,Hive(Context) 使用嵌入式 Derby 作为 Metastore。它主要用于测试并且仅支持一个活跃用户。如果你想支持多个 运行 应用程序,你应该配置一个独立的 Metastore。目前 Hive 支持 PostgreSQL、MySQL、Oracle 和 MySQL。配置细节取决于后端和选项(本地/远程),但一般来说你需要:
- 一个运行 RDBMS 服务器
- 使用 provided scripts
创建的 Metastore 数据库
- 一个合适的 Hive configuration
Cloudera 提供了您可能会觉得有用的综合指南:Configuring the Hive Metastore。
理论上,也应该可以通过适当的配置创建单独的 Derby 元存储(参见 Hive Admin Manual - Local/Embedded Metastore Database) or to use Derby in Server Mode。
对于开发,您可以在不同的工作目录中启动应用程序。 This will create separate metastore_db
for each application 并避免多个活跃用户的问题。提供单独的 Hive 配置应该也可以,但在开发中用处不大:
When not configured by the hive-site.xml, the context automatically creates metastore_db in the current directory
有两个单独的 pyspark 应用程序实例化 HiveContext
代替 SQLContext
让两个应用程序之一失败并出现错误:
Exception: ("You must build Spark with Hive. Export 'SPARK_HIVE=true' and run build/sbt assembly", Py4JJavaError(u'An error occurred while calling 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 文件时会出现上述错误。当我用 SQLContext
替换 HiveContext
时,一切都很好。
有人知道这是为什么吗?
默认情况下,Hive(Context) 使用嵌入式 Derby 作为 Metastore。它主要用于测试并且仅支持一个活跃用户。如果你想支持多个 运行 应用程序,你应该配置一个独立的 Metastore。目前 Hive 支持 PostgreSQL、MySQL、Oracle 和 MySQL。配置细节取决于后端和选项(本地/远程),但一般来说你需要:
- 一个运行 RDBMS 服务器
- 使用 provided scripts 创建的 Metastore 数据库
- 一个合适的 Hive configuration
Cloudera 提供了您可能会觉得有用的综合指南:Configuring the Hive Metastore。
理论上,也应该可以通过适当的配置创建单独的 Derby 元存储(参见 Hive Admin Manual - Local/Embedded Metastore Database) or to use Derby in Server Mode。
对于开发,您可以在不同的工作目录中启动应用程序。 This will create separate metastore_db
for each application 并避免多个活跃用户的问题。提供单独的 Hive 配置应该也可以,但在开发中用处不大:
When not configured by the hive-site.xml, the context automatically creates metastore_db in the current directory