无法在 iPython 中实例化 Spark 上下文
Can't instantiate Spark Context in iPython
我正在尝试在 mac 上本地设置一个独立的 spark 实例并使用 Python 3 API。为此,我做了以下工作,
1. 我已经下载并安装了 Scala 和 Spark。
2. 我设置了以下环境变量,
#Scala
export SCALA_HOME=$HOME/scala/scala-2.12.4
export PATH=$PATH:$SCALA_HOME/bin
#Spark
export SPARK_HOME=$HOME/spark/spark-2.2.1-bin-hadoop2.7
export PATH=$PATH:$SPARK_HOME/bin
#Jupyter Python
export PYSPARK_PYTHON=python3
export PYSPARK_DRIVER_PYTHON=ipython3
export PYSPARK_DRIVER_PYTHON_OPTS="notebook"
#Python
alias python="python3"
alias pip="pip3"
export PYTHONPATH=$SPARK_HOME/python/:$PYTHONPATH
export PYTHONPATH=$SPARK_HOME/python/lib/py4j-0.10.4-src.zip:$PYTHONPATH
现在当我 运行 命令
pyspark --master local[2]
然后在笔记本上输入 sc,我得到以下信息,
SparkContext
Spark UI
Version
v2.2.1
Master
local[2]
AppName
PySparkShell
很明显我的 SparkContext 没有初始化。我期待看到一个初始化的 SparkContext 对象。
我在这里做错了什么?
Documentation 接缝说环境变量是从某个文件中读取的,而不是 shell 环境变量。
Certain Spark settings can be configured through environment variables, which are read from the conf/spark-env.sh script in the directory where Spark is installed
好吧,正如我所说 , setting PYSPARK_DRIVER_PYTHON
to jupyter
(or ipython
) is a really bad and plain wrong practice, which can lead to unforeseen outcomes downstream, such as when you try to use spark-submit
with the above settings...
只有一种正确的方法可以自定义 Jupyter notebook 以便与其他语言(此处为 PySpark)一起使用,这就是使用 Jupyter kernels。
要做的第一件事是 运行 一个 jupyter kernelspec list
命令,以获取您机器中所有可用内核的列表;这是我的结果 (Ubuntu):
$ jupyter kernelspec list
Available kernels:
python2 /usr/lib/python2.7/site-packages/ipykernel/resources
caffe /usr/local/share/jupyter/kernels/caffe
ir /usr/local/share/jupyter/kernels/ir
pyspark /usr/local/share/jupyter/kernels/pyspark
pyspark2 /usr/local/share/jupyter/kernels/pyspark2
tensorflow /usr/local/share/jupyter/kernels/tensorflow
第一个内核 python2
是随 IPython 一起提供的 "default" 内核(很有可能它是您系统中唯一存在的内核);至于其余的,我还有 2 个 Python 内核(caffe
和 tensorflow
),一个 R 内核(ir
),以及两个用于 Spark 1.6 和分别为 Spark 2.0.
上面列表的条目是目录,每个目录包含一个文件,名为kernel.json
。让我们看看我的 pyspark2
内核的这个文件的内容:
{
"display_name": "PySpark (Spark 2.0)",
"language": "python",
"argv": [
"/opt/intel/intelpython27/bin/python2",
"-m",
"ipykernel",
"-f",
"{connection_file}"
],
"env": {
"SPARK_HOME": "/home/ctsats/spark-2.0.0-bin-hadoop2.6",
"PYTHONPATH": "/home/ctsats/spark-2.0.0-bin-hadoop2.6/python:/home/ctsats/spark-2.0.0-bin-hadoop2.6/python/lib/py4j-0.10.1-src.zip",
"PYTHONSTARTUP": "/home/ctsats/spark-2.0.0-bin-hadoop2.6/python/pyspark/shell.py",
"PYSPARK_PYTHON": "/opt/intel/intelpython27/bin/python2"
}
}
现在,最简单的方法是手动对上面显示的内核进行必要的更改(仅路径)并将其保存在 .../jupyter/kernels
目录的新子文件夹中(这样,它应该如果您再次 运行 一个 jupyter kernelspec list
命令,则可见)。如果您认为这种方法也是一种 hack,那么,我同意您的看法,但它是 Jupyter documentation(第 12 页)中推荐的方法:
However, there isn’t a great way to modify the kernelspecs. One approach uses jupyter kernelspec list
to find the kernel.json
file and then modifies it, e.g. kernels/python3/kernel.json
, by hand.
如果您还没有 .../jupyter/kernels
文件夹,您仍然可以使用 jupyter kernelspec install
安装新内核 - 尚未尝试过,但请查看 this SO answer .
如果您想将命令行参数传递给 PySpark,您应该在 env
下添加 PYSPARK_SUBMIT_ARGS
设置;例如,这是我各自的 Spark 1.6.0 内核文件的最后一行,我们仍然必须使用外部 spark-csv 包来读取 CSV 文件:
"PYSPARK_SUBMIT_ARGS": "--master local --packages com.databricks:spark-csv_2.10:1.4.0 pyspark-shell"
最后,不要忘记从您的 bash 配置文件中删除所有 PySpark/Jupyter-related 环境变量(只保留 SPARK_HOME
和 PYSPARK_PYTHON
应该没问题)。
另一种可能是使用Apache Toree,但我自己还没有尝试过。
我正在尝试在 mac 上本地设置一个独立的 spark 实例并使用 Python 3 API。为此,我做了以下工作, 1. 我已经下载并安装了 Scala 和 Spark。 2. 我设置了以下环境变量,
#Scala
export SCALA_HOME=$HOME/scala/scala-2.12.4
export PATH=$PATH:$SCALA_HOME/bin
#Spark
export SPARK_HOME=$HOME/spark/spark-2.2.1-bin-hadoop2.7
export PATH=$PATH:$SPARK_HOME/bin
#Jupyter Python
export PYSPARK_PYTHON=python3
export PYSPARK_DRIVER_PYTHON=ipython3
export PYSPARK_DRIVER_PYTHON_OPTS="notebook"
#Python
alias python="python3"
alias pip="pip3"
export PYTHONPATH=$SPARK_HOME/python/:$PYTHONPATH
export PYTHONPATH=$SPARK_HOME/python/lib/py4j-0.10.4-src.zip:$PYTHONPATH
现在当我 运行 命令
pyspark --master local[2]
然后在笔记本上输入 sc,我得到以下信息,
SparkContext
Spark UI
Version
v2.2.1
Master
local[2]
AppName
PySparkShell
很明显我的 SparkContext 没有初始化。我期待看到一个初始化的 SparkContext 对象。 我在这里做错了什么?
Documentation 接缝说环境变量是从某个文件中读取的,而不是 shell 环境变量。
Certain Spark settings can be configured through environment variables, which are read from the conf/spark-env.sh script in the directory where Spark is installed
好吧,正如我所说 PYSPARK_DRIVER_PYTHON
to jupyter
(or ipython
) is a really bad and plain wrong practice, which can lead to unforeseen outcomes downstream, such as when you try to use spark-submit
with the above settings...
只有一种正确的方法可以自定义 Jupyter notebook 以便与其他语言(此处为 PySpark)一起使用,这就是使用 Jupyter kernels。
要做的第一件事是 运行 一个 jupyter kernelspec list
命令,以获取您机器中所有可用内核的列表;这是我的结果 (Ubuntu):
$ jupyter kernelspec list
Available kernels:
python2 /usr/lib/python2.7/site-packages/ipykernel/resources
caffe /usr/local/share/jupyter/kernels/caffe
ir /usr/local/share/jupyter/kernels/ir
pyspark /usr/local/share/jupyter/kernels/pyspark
pyspark2 /usr/local/share/jupyter/kernels/pyspark2
tensorflow /usr/local/share/jupyter/kernels/tensorflow
第一个内核 python2
是随 IPython 一起提供的 "default" 内核(很有可能它是您系统中唯一存在的内核);至于其余的,我还有 2 个 Python 内核(caffe
和 tensorflow
),一个 R 内核(ir
),以及两个用于 Spark 1.6 和分别为 Spark 2.0.
上面列表的条目是目录,每个目录包含一个文件,名为kernel.json
。让我们看看我的 pyspark2
内核的这个文件的内容:
{
"display_name": "PySpark (Spark 2.0)",
"language": "python",
"argv": [
"/opt/intel/intelpython27/bin/python2",
"-m",
"ipykernel",
"-f",
"{connection_file}"
],
"env": {
"SPARK_HOME": "/home/ctsats/spark-2.0.0-bin-hadoop2.6",
"PYTHONPATH": "/home/ctsats/spark-2.0.0-bin-hadoop2.6/python:/home/ctsats/spark-2.0.0-bin-hadoop2.6/python/lib/py4j-0.10.1-src.zip",
"PYTHONSTARTUP": "/home/ctsats/spark-2.0.0-bin-hadoop2.6/python/pyspark/shell.py",
"PYSPARK_PYTHON": "/opt/intel/intelpython27/bin/python2"
}
}
现在,最简单的方法是手动对上面显示的内核进行必要的更改(仅路径)并将其保存在 .../jupyter/kernels
目录的新子文件夹中(这样,它应该如果您再次 运行 一个 jupyter kernelspec list
命令,则可见)。如果您认为这种方法也是一种 hack,那么,我同意您的看法,但它是 Jupyter documentation(第 12 页)中推荐的方法:
However, there isn’t a great way to modify the kernelspecs. One approach uses
jupyter kernelspec list
to find thekernel.json
file and then modifies it, e.g.kernels/python3/kernel.json
, by hand.
如果您还没有 .../jupyter/kernels
文件夹,您仍然可以使用 jupyter kernelspec install
安装新内核 - 尚未尝试过,但请查看 this SO answer .
如果您想将命令行参数传递给 PySpark,您应该在 env
下添加 PYSPARK_SUBMIT_ARGS
设置;例如,这是我各自的 Spark 1.6.0 内核文件的最后一行,我们仍然必须使用外部 spark-csv 包来读取 CSV 文件:
"PYSPARK_SUBMIT_ARGS": "--master local --packages com.databricks:spark-csv_2.10:1.4.0 pyspark-shell"
最后,不要忘记从您的 bash 配置文件中删除所有 PySpark/Jupyter-related 环境变量(只保留 SPARK_HOME
和 PYSPARK_PYTHON
应该没问题)。
另一种可能是使用Apache Toree,但我自己还没有尝试过。