Jupyter NotebookとAnacondaでSparkを使用できるようにしようとしています。ここで、.bash_profileは次のようになります。
PATH="/my/path/to/anaconda3/bin:$PATH"
export Java_HOME="/my/path/to/jdk"
export PYTHON_PATH="/my/path/to/anaconda3/bin/python"
export PYSPARK_PYTHON="/my/path/to/anaconda3/bin/python"
export PATH=$PATH:/my/path/to/spark-2.1.0-bin-hadoop2.7/bin
export PYSPARK_DRIVER_PYTHON=jupyter
export PYSPARK_DRIVER_PYTHON_OPTS="notebook" pyspark
export SPARK_HOME=/my/path/to/spark-2.1.0-bin-hadoop2.7
alias pyspark="pyspark --conf spark.local.dir=/home/puifais --num-executors 30 --driver-memory 128g --executor-memory 6g --packages com.databricks:spark-csv_2.11:1.5.0"
/my/path/to/spark-2.1.0-bin-hadoop2.7/bin/spark-Shell
と入力すると、コマンドラインシェルでSparkを正常に起動できます。出力sc
は空ではありません。正常に動作しているようです。
pyspark
と入力すると、Jupyter Notebookが正常に起動します。新しいPython3ノートブックを作成すると、次のエラーが表示されます。
[IPKernelApp] WARNING | Unknown error in handling PYTHONSTARTUP file /my/path/to/spark-2.1.0-bin-hadoop2.7/python/pyspark/Shell.py:
Jupyter Notebookのsc
は空です。
誰でもこの状況を解決するのを助けることができますか?
明確にしたいだけです。エラーの終わりのコロンの後には何もありません。また、この post を使用して独自の起動ファイルを作成しようとしました。ここに引用するので、そこに行く必要はありません。
次のように、短い初期化スクリプトinit_spark.pyを作成しました。
from pyspark import SparkConf, SparkContext conf = SparkConf().setMaster("yarn-client") sc = SparkContext(conf = conf)
〜/ .ipython/profile_default/startup /ディレクトリに配置します
私がこれをしたとき、エラーは次のようになりました:
[IPKernelApp] WARNING | Unknown error in handling PYTHONSTARTUP file /my/path/to/spark-2.1.0-bin-hadoop2.7/python/pyspark/Shell.py:
[IPKernelApp] WARNING | Unknown error in handling startup files:
Condaは多くの依存関係を正しく管理するのに役立ちます...
スパークをインストールします。 sparkが/ opt/sparkにインストールされている場合、これを〜/ .bashrcに含めます。
export SPARK_HOME=/opt/spark
export PATH=$SPARK_HOME/bin:$PATH
Spark以外に必要なすべての依存関係を持つconda環境を作成します。
conda create -n findspark-jupyter-openjdk8-py3 -c conda-forge python=3.5 jupyter=1.0 notebook=5.0 openjdk=8.0.144 findspark=1.1.0
環境を活性化する
$ source activate findspark-jupyter-openjdk8-py3
Jupyter Notebookサーバーを起動します。
$ jupyter notebook
ブラウザで、新しいPython3ノートブックを作成します
次のスクリプトを使用してPIを計算してみてください( this から借用)
import findspark
findspark.init()
import pyspark
import random
sc = pyspark.SparkContext(appName="Pi")
num_samples = 100000000
def inside(p):
x, y = random.random(), random.random()
return x*x + y*y < 1
count = sc.parallelize(range(0, num_samples)).filter(inside).count()
pi = 4 * count / num_samples
print(pi)
sc.stop()
PYSPARK_DRIVER_PYTHON=jupyter
を設定するなどのくだらないハックが「ソリューション」に昇格し、明らかにugly結果、たとえばpyspark
を入力してPySparkシェルの代わりにJupyterノートブックを入力するなど、ダウンストリームに潜んでいる未確認の問題、たとえば 上記の設定でspark-submit
を使用してみてください ... :(
(誤解しないでください、それはあなたのせいではなく、私はあなたを責めていません。ここでSOでこの「解決策」が提案され、受け入れられ、賛成...)。
Jupyterノートブックをカスタマイズして他の言語(ここでは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に付属する「デフォルト」カーネルです(これがシステムに存在する唯一の可能性があります)。残りについては、さらに2つのPythonカーネル(caffe
&tensorflow
)、R 1(ir
)、および2つのPySparkカーネルがあります。 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"
}
}
私は詳細を/my/path/to
などに変更することを気にしませんでしたが、私たちのケースにはいくつかの違いがあることがすでにわかりました(Intel Python 2.7ではなく、Anaconda = Python 3)、しかし、うまくいけばアイデアが得られます(ところで、connection_file
について心配しないでください-私もどちらも使いません)。
さて、あなたにとって最も簡単な方法は、上記のカーネルに必要な変更(パスのみ)を手動で行い、.../jupyter/kernels
ディレクトリの新しいサブフォルダーに保存することです(実行すると表示されるはずです)再びjupyter kernelspec list
コマンド)。このアプローチもハックだと思うなら、私はあなたに同意しますが、それは Jupyterのドキュメント (12ページ)で推奨されているものです:
ただし、kernelspecsを変更する優れた方法はありません。 1つのアプローチでは、
jupyter kernelspec list
を使用してkernel.json
ファイルを見つけ、それを変更します。kernels/python3/kernel.json
、手で。
.../jupyter/kernels
フォルダーがまだない場合は、jupyter kernelspec install
を使用して新しいカーネルをインストールできます。試していないが、 this SO answer 。
最後に、すべてのPySpark関連の環境変数をbashプロファイルから削除することを忘れないでください(SPARK_HOME
のみがOKである必要があります)。そして、pyspark
と入力すると、Jupyterノートブックではなく、PySparkシェルを使用していることに気付くでしょう。
[〜#〜] update [〜#〜](コメントの後):コマンドライン引数をPySparkに渡したい場合は、 PYSPARK_SUBMIT_ARGS
設定env
;たとえば、ここにSpark 1.6.0のそれぞれのカーネルファイルの最後の行があり、CSVファイルを読み取るために外部spark-csvパッケージを使用する必要がありました。
"PYSPARK_SUBMIT_ARGS": "--master local --packages com.databricks:spark-csv_2.10:1.4.0 pyspark-Shell"
ここを少しいじった後、sparkmagicをインストールしました(新しいバージョンのSparkを再インストールした後)。私はそれだけでうまくいくと思う。
その少し前にいじってみたので確信はありませんが、構成ファイルを手でいじるよりもはるかに簡単であるため、これを暫定的な回答としています。