Настройка Spark для работы с Jupyter Notebook и Anaconda

я провел несколько дней, пытаясь заставить Spark работать с моим блокнотом Jupyter и Anaconda. Вот что мое .файл выглядит так:

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 в порядке. Когда я создаю новый ноутбук Python3, появляется эта ошибка:

[IPKernelApp] WARNING | Unknown error in handling PYTHONSTARTUP file /my/path/to/spark-2.1.0-bin-hadoop2.7/python/pyspark/shell.py: 

и sc в моем Jupyter Блокнот пуст.

может кто-нибудь помочь решить эту ситуацию?


просто хочу уточнить: после двоеточия в конце ошибки ничего нет. Я также попытался создать свой собственный файл запуска, используя этот в должности и я цитирую здесь, чтобы вам не пришлось смотреть туда:

Я создал короткий сценарий инициализации init_spark.py следующим образом:

from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("yarn-client")
sc = SparkContext(conf = conf)

и положил его в ~/.ipython / profile_default/запуск/ каталог

когда я это сделал, ошибка потом стал:

[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:

2 ответов


Conda может помочь правильно управлять многими зависимостями...

установить spark. Предполагая, что spark установлен в /opt /spark, включите это в свой~/.bashrc следующее:

export SPARK_HOME=/opt/spark
export PATH=$SPARK_HOME/bin:$PATH

создайте среду conda со всеми необходимыми зависимостями, кроме spark:

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:

$ jupyter notebook

в вашем браузере создайте новый ноутбук Python3

попробуйте вычислить PI со следующим скриптом (заимствованным из этой)

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, были повышены до "решений" и теперь имеют тенденцию становиться стандартными практиками, несмотря на то, что они, очевидно, приводят к некрасиво результатов, как писать pyspark и в конечном итоге с блокнотом Jupyter вместо оболочки PySpark, плюс еще-невидимые проблемы, скрывающиеся ниже по течению, например, когда вы попробуйте использовать spark-submit с вышеуказанными настройками... :(

(не понимаю неправильно, это не ваша вина, и я не обвиняю вас; я видел десятки сообщений здесь, где это "решение" было предложено, принято и одобрено...).

существует один и только один правильный способ настроить ноутбук Jupyter для работы с другими языками (PySpark здесь), и это использование Jupyter ядер.

первое, что нужно сделать, это запустить 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 один (ir) и два ядра 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 etc., и вы уже можете видеть, что есть некоторые различия между нашими случаями (я использую Intel Python 2.7, а не Anaconda Python 3), но, надеюсь, вы получите идею (кстати, не беспокойтесь о connection_file - я тоже не использую).

теперь самый простой способ для вас-вручную внести необходимые изменения (только пути) в мой выше показано ядро и сохраните его в новой подпапке