我有一个脚本,可以方便地在Jupyter Notebook中使用Spark。这很棒,除非我在第二个笔记本中运行spark命令(例如,测试一些草稿工作)。
我收到一条很长的错误消息,其中的关键部分似乎是:
Py4JJavaError: An error occurred while calling o31.json. : java.lang.RuntimeException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient`
. . .
Caused by: ERROR XSDB6: Another instance of Derby may have already booted the database /metastore_db
问题似乎是我一次只能运行一个Spark实例。
如何设置Spark一次在多个笔记本中运行?
最佳答案
默认情况下,Spark在Hive和Hadoop之上运行,并将其有关数据库转换的指令存储在轻量级数据库系统Derby中。 Derby一次只能运行一个Spark实例,因此,当您启动第二个笔记本并开始运行Spark命令时,它会崩溃。
为了解决这个问题,您可以将Spark的Hive安装连接到Postgres而不是Derby。
Brew安装postgres(如果尚未安装的话)。
然后下载postgresql-9.4.1212.jar
(假设您正在运行Java 1.8 aka Java8)
来自https://jdbc.postgresql.org/download.html
将此.jar文件移动到Spark安装的/libexec/jars/
目录中。
例如:/usr/local/Cellar/apache-spark/2.0.1/
(在Mac上,您可以通过在命令行中键入brew info apache-spark
来找到Spark的安装位置)
接下来,为您的Spark安装在/libexec/conf
目录中创建hive-site.xml。
例如:/usr/local/Cellar/apache-spark/2.0.1/libexec/conf
这可以通过文本编辑器完成-只需保存扩展名为'.xml'的文件即可。
hive-site.xml应包含以下文本:
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:postgresql://localhost:5432/hive_metastore</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>org.postgresql.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>mypassword</value>
</property>
</configuration>
“hive”和“mypassword”可以用您认为合适的任何方式替换-但必须与下一步匹配。
最后在Postgress中创建一个用户和密码:在命令行中运行以下命令-
psql
CREATE USER hive;
ALTER ROLE hive WITH PASSWORD 'mypassword';
CREATE DATABASE hive_metastore;
GRANT ALL PRIVILEGES ON DATABASE hive_metastore TO hive;
\q
就是这样,您完成了。现在,Spark应该同时在多个Jupyter Notebook中运行。
关于pyspark - 如何一次(在多个Jupyter Notebook中)运行多个Spark 2.0实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42078594/