Множественная ошибка SparkContexts в учебнике

Я пытаюсь запустить самый простой учебник pyspark Spark + Python - см. http://spark.apache.org/docs/0.9.0/quick-start.html

Когда я пытаюсь инициализировать новый SparkContext,

from pyspark import SparkContext
sc = SparkContext("local[4]", "test")

Я получаю следующую ошибку:

ValueError: Cannot run multiple SparkContexts at once

Мне интересно, загрузили ли мои предыдущие попытки запуска кода примера что-то в память, которые не были устранены. Есть ли способ перечислить текущие SparkContexts уже в памяти и/или очистить их, чтобы код примера работал?

Ответы

Ответ 1

Оказывается, что работающий. /bin/pyspark интерактивно АВТОМАТИЧЕСКИ НАГРУЖАЕТ SPARKCONTEXT. Вот что я вижу при запуске pyspark:

Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 0.9.1
      /_/

Using Python version 2.6.6 (r266:84292, Feb 22 2013 00:00:18)
Spark context available as sc.

... так что вы можете либо запустить "del sc" в начале, либо продолжить, и использовать "sc" как автоматически определенный.

Другая проблема с примером заключается в том, что он, похоже, смотрит на обычную локальную файловую систему NFS, тогда как он действительно пытается посмотреть файловую систему HDFS для Hadoop. Я должен был загрузить файл README.md в местоположении $SPARK_HOME, используя перед запуском код "hadoop fs -put README.md README.md".

Ниже приведена модифицированная программа-пример, в которой я запускал интерактивно:

from pyspark import SparkContext
logFile = "README.md"
logData = sc.textFile(logFile).cache()
numAs = logData.filter(lambda s: 'a' in s).count()
numBs = logData.filter(lambda s: 'b' in s).count()
print "Lines with a: %i, lines with b: %i" % (numAs, numBs)

и здесь находится модифицированная версия автономного файла python:

"""SimpleApp.py"""
from pyspark import SparkContext
logFile = "README.md"  # Should be some file on your system
sc = SparkContext("local", "Simple App")
logData = sc.textFile(logFile).cache()
numAs = logData.filter(lambda s: 'a' in s).count()
numBs = logData.filter(lambda s: 'b' in s).count()
print "Lines with a: %i, lines with b: %i" % (numAs, numBs)

который я могу выполнить с помощью $SPARK_HOME/bin/pyspark SimpleApp.py

Ответ 2

Вы пытались использовать sc.stop(), прежде чем пытались создать другой SparkContext?

Ответ 3

Это происходит потому, что, когда вы вводите "pyspark" в терминале, система автоматически инициализирует SparkContext (возможно, объект?), поэтому вы должны остановить его перед созданием нового.

Вы можете использовать

sc.stop()

прежде чем создавать новый SparkContext.

Кроме того, вы можете использовать

sc = SparkContext.getOrCreate()

вместо

sc = SparkContext()

Я новичок в Spark, и я мало знаю о значении параметров функции SparkContext(), но код, показанный выше, работал у меня.

Ответ 4

Вместо настройки пользовательских конфигураций в SparkContext в приглашении PySpark вы можете установить их во время запуска PySpark.

например. pyspark --master yarn --queue my_spark_pool1 --conf spark.driver.extraLibraryPath = "$ {LD_LIBRARY_PATH}" --conf spark.executorEnv.LD_LIBRARY_PATH = "$ {LD_LIBRARY_PATH}"

Он применит эти conf к объекту sc в PySpark.