Jupyter & PySpark:如何运行多个笔记本

8

我正在三台虚拟机上使用Spark 1.6.0,其中1个是主节点(独立),另外两个是工作节点,每个节点有8G内存和2个CPU。

我正在使用以下内核配置:

{
 "display_name": "PySpark ",
 "language": "python3",
 "argv": [
  "/usr/bin/python3",
  "-m", 
  "IPython.kernel", 
  "-f",
  "{connection_file}"
 ],
 "env": {
  "SPARK_HOME": "<mypath>/spark-1.6.0",
  "PYTHONSTARTUP": "<mypath>/spark-1.6.0/python/pyspark/shell.py",
  "PYSPARK_SUBMIT_ARGS": "--master spark://<mymaster>:7077  --conf   spark.executor.memory=2G pyspark-shell --driver-class-path /opt/vertica/java/lib/vertica-jdbc.jar"
 }  
}  

目前,这个可以正常运行。我可以像在pyspark shell中一样使用spark context的scsqlContext,无需导入任何内容。

问题出现在我使用多个notebook时:

在我的spark主节点上,我看到两个'pyspark-shell'应用程序,这有点说得过去,但一次只能运行一个。但是,在这里,“运行”并不意味着执行任何操作,即使我在notebook上什么都不运行,也会显示为“正在运行”。鉴于此,我无法在notebook之间共享资源,这很令人沮丧(我目前必须杀死第一个shell(= notebook kernel),以运行第二个)。

如果您有任何关于如何解决这个问题的想法,请告诉我!另外,我不确定我使用kernel的方式是否为最佳实践,我已经遇到了让spark和jupyter一起工作的困难。

感谢大家


@eliasah 这肯定行不通。不过得到一些建议还是很好的 :p - pltrdy
1
你想分享SparkContext吗? - eliasah
这不是目标,但也不会成为问题。 - pltrdy
如果你想为每个笔记本创建一个上下文,你将需要类似Mesos或chronos的东西。整个堆栈会突然变得非常复杂。 - eliasah
@eliasah:您能否解释一下如何在同一Python内核中的笔记本之间共享SparkContext。谢谢! - Shivam Kotwalia
显示剩余5条评论
1个回答

1
问题在于Spark用于存储元数据的数据库(Derby)。Derby是轻量级数据库系统,一次只能运行一个Spark实例。 解决方案是设置另一个数据库系统来处理多个实例(postgres、mysql...)。
例如,您可以使用postgres DB。
- 在spark/jars中添加postgres jar - 在spark conf中添加配置文件(hive-site.xml) - 在计算机上安装postgres - 在postgres中为spark/hive添加用户、密码和数据库(取决于hive-site.xml中的值)
Linux shell示例:
# download postgres jar
wget  https://jdbc.postgresql.org/download/postgresql-42.1.4.jar

# install postgres on your machine
pip install postgres

# add user, pass and db to postgres
psql -d postgres -c "create user hive"
psql -d postgres -c "alter user hive with password 'pass'"
psql -d postgres -c "create database hive_metastore"
psql -d postgres -c "grant all privileges on database hive_metastore to hive"

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>pass</value>
</property>

</configuration>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接