web-dev-qa-db-ja.com

Jupyter NotebookとAnacondaで動作するようにSparkを構成する

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:
12
puifais

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()
7
Alain Domissy

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カーネル(caffetensorflow)、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"
42
desertnaut

ここを少しいじった後、sparkmagicをインストールしました(新しいバージョンのSparkを再インストールした後)。私はそれだけでうまくいくと思う。

その少し前にいじってみたので確信はありませんが、構成ファイルを手でいじるよりもはるかに簡単であるため、これを暫定的な回答としています。

0
matanster