如何一次 运行 多个 Spark 2.0 实例(在多个 Jupyter 笔记本中)?
How to run multiple instances of Spark 2.0 at once (in multiple Jupyter Notebooks)?
我有一个脚本,可以方便地在 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 实例,因此当您启动第二个笔记本并启动 运行ning Spark 命令时,它会崩溃。
要解决这个问题,您可以将 Spark 的 Hive 安装连接到 Postgres 而不是 Derby。
Brew 安装 postgres,如果你还没有安装的话。
然后下载postgresql-9.4.1212.jar
(假设你是运行ning java 1.8又名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 的安装位置)
接下来在 /libexec/conf
目录中为您的 Spark 安装创建 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 中。
我有一个脚本,可以方便地在 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 实例,因此当您启动第二个笔记本并启动 运行ning Spark 命令时,它会崩溃。
要解决这个问题,您可以将 Spark 的 Hive 安装连接到 Postgres 而不是 Derby。
Brew 安装 postgres,如果你还没有安装的话。
然后下载postgresql-9.4.1212.jar
(假设你是运行ning java 1.8又名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 的安装位置)
接下来在 /libexec/conf
目录中为您的 Spark 安装创建 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 中。