我正在尝试在Bluemix上运行的Analytics for Apache Spark上运行笔记本,但是我遇到了以下错误:
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=o38))
错误是间歇性的 - 它并不总是发生。有问题的代码行是:
df = sqlContext.read.format('jdbc').options(
url=url,
driver='com.ibm.db2.jcc.DB2Driver',
dbtable='SAMPLE.ASSETDATA'
).load()
stackoverflow上有一些类似的问题,但他们并不是在询问bluemix上的spark服务。
答案 0 :(得分:8)
该语句初始化了一个HiveContext。然后,HiveContext初始化本地Derby数据库以保存其元数据。默认情况下,Derby数据库在当前目录中创建。报告的问题在这些情况下发生(其中包括):
在IBM更改默认设置以避免此问题之前,可能的解决方法是:
对于案例1,删除剩余的锁定文件。从Python笔记本中,这可以通过执行:
来完成!rm -f ./metastore_db/*.lck
对于案例2,在创建Hive上下文之前更改当前工作目录。在Python笔记本中,这将更改为新创建的目录:
import os
import tempfile
os.chdir(tempfile.mkdtemp())
但要注意,每次运行该笔记本时,它都会使文件系统与新目录和Derby数据库混乱。
我碰巧知道IBM正在修复。请仅在遇到问题时使用这些解决方法,而不是主动。
答案 1 :(得分:5)
在使用SQLContext
之前创建一个新的sqlContext
对象:
from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
然后再次运行代码。
如果您有多个笔记本使用开箱即用sqlContext
,则会发生此错误。
答案 2 :(得分:0)
返回您的笔记本并再次运行,它必须正常工作
答案 3 :(得分:-1)
不幸的是,告诉“创建新的SQLContext”的答案是完全错误的。
用新的SQLContext实例替换sqlContext是一个坏主意,因为您失去了对蜂巢的支持:默认情况下,sqlContext是使用HiveContext初始化的。
第二,消息“您必须使用Hive构建Spark。导出'SPARK_HIVE = true'...”是PySpark(context.py)中编写错误的代码,该代码未从Java的Spark驱动程序中获取正确的异常并且不显示它。
要找出正在发生的情况,请进行构建,以便将Java驱动程序的日志写入某个文件。在我的情况下,客户使用带有DSE的Spark,并且在conf目录中有一些名为logback-spark * .xml的.xml文件。打开名为logback-spark.xml的文件(不带后缀),然后在其中添加文件附加程序。然后,重现该错误并读取Java驱动程序编写的异常+堆栈跟踪。
对于其他Spark版本/内部版本,请首先了解如何获取Java驱动程序日志,并进行配置以使其记录到文件中。
在我的spark驱动程序的日志中,我清楚地表明Spark的登录无法写入hive metastore的文件系统。根据您的情况,您可能会收到其他消息。但是Java中的问题是主要问题-您应该首先看一下它。