【问题标题】:How to solve java.sql.SQLException: Unable to open a test connection to the given database.in pyspark 2.2如何解决 java.sql.SQLException: Unable to open a test connection to the given database.in pyspark 2.2
【发布时间】:2017-08-17 07:08:57
【问题描述】:

我正在 pyspark 中开发一个 spark-flask 应用程序。我正在使用 pyspark 2.20 这是我的代码

import re
from tkinter import*
import json

from pyspark.sql import HiveContext
#from pyspark.sql import SparkSession
from flask import Flask
from pyspark import SparkConf,SparkContext
conf=SparkConf().setMaster('local').setAppName("TestValue")
conf.set("spark.driver.allowMultipleContexts", "true")
sc=SparkContext(conf=conf)
sqlContext=HiveContext(sc)
#from pyspark.sql import Row




app=Flask(__name__)
#spark=SparkSession.builder.config("spark.sql.warehouse.dir", "C:\spark\spark-warehouse").appName("TestApp").enableHiveSupport().getOrCreate()
print("Success")

#sqlstring="SELECT lflow1.LeaseType as LeaseType, lflow1.Status as Status, lflow1.Property as property, lflow1.City as City, lesflow2.DealType as DealType, lesflow2.Area as Area, lflow1.Did as DID, lesflow2.MID as MID from lflow1, lesflow2  WHERE lflow1.Did = lesflow2.MID"
@app.route('/<sqlval>')
def queryBuilder(sqlval):
    df=sqlContext.sql(sqlval)
    #df.show()

    resultlist = df.toJSON().collect()
    dumpdata = re.sub(r"\'", "", str(resultlist))
    jsondata = json.dumps(dumpdata)
    #print(jsondata)
    return jsondata

    #return df

#queryBuilder(sqlstring)
if __name__ == '__main__':
   app.run(debug = True)

master=Tk()
entryval=Entry(master)
entryval.grid(row=0,column=1)
Button(master,text='Quit',command=master.quit).grid(row=3,column=1,sticky=W,pady=50)
mainloop()

在这里,我编写了 sqlCONtext 样式而不是 sparksession.builder。此代码预计将根据请求返回 json 数据响应。现在我得到以下错误

java.sql.SQLException:无法打开到给定数据库的测试连接。 JDBC url = jdbc:derby:;databaseName=metastore_db;create=true, 用户名 = APP。终止连接池(如果您希望在应用之后启动数据库,请将lazyInit 设置为 true)

这是堆栈跟踪中嵌套的最后一个异常。最初的例外是 java.sql.SQLException:无法使用类加载器 org.apache.spark.sql.hive.client.IsolatedClientLoader$$anon$1@7af1b8e6 启动数据库“metastore_db”,请参阅 下一个细节例外

原因:ERROR XSDB6:另一个 Derby 实例可能已经启动了数据库 C:\spark\metastore_db。

我已经从 metastore_db 文件夹中删除了 db.lck 文件,但没有任何改变。我以前用过这个技巧来解决最后两个异常。但没有面对

java.sql.SQLException:无法打开到给定数据库的测试连接。 JDBC url = jdbc:derby:;databaseName=metastore_db;create=true, 用户名 = APP。终止连接池(如果您希望在应用之后启动数据库,请将lazyInit 设置为 true)

到目前为止,我发现这是 spark 2.0.1、2.0.2 中的一个错误,它已在 2.1 和 2.2 版本中修复 https://issues.apache.org/jira/browse/SPARK-18687

我现在在 Windows 10 中使用 pyspark 2.2 版本

这里是 Spark session 风格的代码

from tkinter import*
from pyspark.sql import SparkSession
from flask import Flask
import json
import re
app=Flask(__name__)
spark=SparkSession.builder.config("spark.sql.warehouse.dir", "C:\spark\spark-warehouse")\
    .config("spark.driver.allowMultipleContexts","true")\
    .appName("TestApp").\
    enableHiveSupport().getOrCreate()
#spark.conf.set("spark.driver.allowMultipleContexts","true")
#spark=SparkSession.builder.config("spark.driver.allowMultipleContexts", "true").appName("TestApp").enableHiveSupport().getOrCreate()
print("Success")

#sqlstring="SELECT lflow1.LeaseType as LeaseType, lflow1.Status as Status, lflow1.Property as property, lflow1.City as City, lesflow2.DealType as DealType, lesflow2.Area as Area, lflow1.Did as DID, lesflow2.MID as MID from lflow1, lesflow2  WHERE lflow1.Did = lesflow2.MID"
@app.route('/<sqlval>')
def queryBuilder(sqlval):
    df=spark.sql(sqlval)
    #df.show()

    resultlist = df.toJSON().collect()
    dumpdata = re.sub(r"\'", "", str(resultlist))
    jsondata = json.dumps(dumpdata)
    #print(jsondata)
    return jsondata

    #return df

#queryBuilder(sqlstring)
if __name__ == '__main__':
   app.run(debug = True)

master=Tk()
entryval=Entry(master)
entryval.grid(row=0,column=1)
Button(master,text='Quit',command=master.quit).grid(row=3,column=1,sticky=W,pady=50)
mainloop()

堆栈跟踪图像

【问题讨论】:

    标签: apache-spark pyspark pyspark-sql


    【解决方案1】:

    您的元存储已在某处使用。因此,您必须从 Metastore 文件夹 (C:spark\metastore_db) 中删除 *.lck 文件。

    【讨论】:

    • 我确实删除了它。大声笑这是老把戏。但现在什么都没有改变:D
    【解决方案2】:

    hive-site.xml 中的 hive.metastore.warehouse.dir 属性自 Spark 2.0.0 起已弃用。相反,使用 spark.sql.warehouse.dir 指定仓库中数据库的默认位置。然后重启 spark-shell。

    【讨论】:

      猜你喜欢
      • 2015-08-04
      • 2022-12-26
      • 2011-05-22
      • 1970-01-01
      • 2022-12-26
      • 2022-12-02
      • 2011-07-05
      • 1970-01-01
      • 2017-07-10
      相关资源
      最近更新 更多