Apache spark 如何同时运行Spark SQL JDBC/ODBC server和pyspark?

Apache spark 如何同时运行Spark SQL JDBC/ODBC server和pyspark?,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,我有一个Spark的单节点部署。我在上面运行JDBC/ODBC服务器。这很好用。但是,如果同时使用pyspark保存表(df.write.saveAsTable()),我会收到一条很长的错误消息。我认为它的核心部分是: Caused by: ERROR XSDB6: Another instance of Derby may have already booted the database /root/spark/bin/metastore_db. 做了一些研究,我发现这是由Spark创建一个

我有一个Spark的单节点部署。我在上面运行JDBC/ODBC服务器。这很好用。但是,如果同时使用pyspark保存表(
df.write.saveAsTable()
),我会收到一条很长的错误消息。我认为它的核心部分是:

Caused by: ERROR XSDB6: Another instance of Derby may have already booted the database /root/spark/bin/metastore_db.
做了一些研究,我发现这是由Spark创建一个新会话引起的,该会话试图创建另一个导致错误的Derby实例。提供的解决方案是关闭所有其他spark shell流程。然而,若我这样做,那个么ODBC服务器将停止运行


如何使两者同时运行?

您可能希望使用derby network server,而不是默认的嵌入式版本,以便多个进程共享。或者使用另一个数据存储,如MySQL

安装derby network server后,您可以将derby-client.jar文件复制到spark jars目录中,然后使用如下内容编辑文件
conf/hive site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->
<configuration>
    <property>
      <name>javax.jdo.option.ConnectionURL</name>
      <value>jdbc:derby://localhost:1527/metastore_db;create=true</value>
      <description>JDBC connect string for a JDBC metastore</description>
    </property>

    <property>
      <name>javax.jdo.option.ConnectionDriverName</name>
      <value>org.apache.derby.jdbc.ClientDriver</value>
      <description>Driver class name for a JDBC metastore</description>
    </property>
</configuration>

javax.jdo.option.ConnectionURL
jdbc:derby://localhost:1527/metastore_db;create=true
JDBC元存储的JDBC连接字符串
javax.jdo.option.ConnectionDriverName
org.apache.derby.jdbc.ClientDriver
JDBC元存储的驱动程序类名

我想这就是我对Spark SQL的困惑所在(我对Spark真的很陌生)。我不完全理解derby或网络数据库在Spark系统中扮演什么角色。如果我运行嵌入式版本,那么它将指向服务器上的数据。这是有道理的。如果我有MySQL怎么办?它是否指向Spark服务器上的数据文件?数据库模式元信息(例如,表结构定义和对使用“create table”创建的数据的引用)存储在元存储中(默认情况下,运行在JVM中的嵌入式Derby将文件存储在metastore_db目录中)。但在这种模式下,一次只能由一个进程访问数据(它们会锁定)。您还可以选择将这些元数据存储在另一个数据库(例如MySQL)中,或者使用可由多个进程访问的Derby网络数据库。感谢您的澄清。我无法正确地配置这整件事。我已经安装了derby网络服务器,将derbyclient.jar放入spark jar中,并像您所说的那样添加了xml文件。当我尝试使用spark sql时,我发现连接被拒绝错误。我还需要做什么吗?我需要在网络derby服务器上设置数据库吗?我需要为spark应用程序创建一个用户吗?没关系,我想出来了。问题是您不需要指定localhost附近的端口。