Доступ к Spark из приложения Flask

Я написал простое приложение колбы, чтобы передать некоторые данные в Spark. Скрипт работает в IPython Notebook, но не тогда, когда я пытаюсь запустить его на собственном сервере. Я не думаю, что контекст Spark работает в сценарии. Как заставить Spark работать в следующем примере?

from flask import Flask, request
from pyspark import SparkConf, SparkContext

app = Flask(__name__)

conf = SparkConf()
conf.setMaster("local")
conf.setAppName("SparkContext1")
conf.set("spark.executor.memory", "1g")
sc = SparkContext(conf=conf)

@app.route('/accessFunction', methods=['POST'])
def toyFunction():
    posted_data = sc.parallelize([request.get_data()])
    return str(posted_data.collect()[0])

if __name__ == '__main_':
    app.run(port=8080)

в IPython Notebook я не определяю SparkContext потому что он автоматически настроен. Я не помню, как я это сделал, я следил за некоторыми блогами.

на сервере Linux, который я установил то .py, чтобы всегда работать и устанавливать последнюю искру, следуя шагу 5 данное руководство.

редактировать:

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

во-первых, я создал .py только со скриптом из ответа ниже (после соответствующей настройки ссылок):

import sys
try:
    sys.path.append("your/spark/home/python")
    from pyspark import context
    print ("Successfully imported Spark Modules")
except ImportError as e:
    print ("Can not import Spark Modules", e)

Это возвращает " успешно импортировано Искровые Модули". Однако следующий .файл py, который я сделал, возвращает исключение:

from pyspark import SparkContext
sc = SparkContext('local')
rdd = sc.parallelize([0])
print rdd.count()

Это возвращает исключение:

"процесс шлюза Java вышел перед отправкой драйвера его номер порта"

Поиск вокруг подобных проблем, которые я нашел на этой странице но когда я запускаю этот код, ничего не происходит, нет печати на консоли и никаких сообщений об ошибке. Аналогично,этой тоже не помогло, я получаю то же исключение Java gateway, что и выше. Я также установили anaconda, как я слышал, это может помочь объединить python и java, опять же без успеха...

какие-либо предложения о том, что попробовать дальше? Я в растерянности.

3 ответов


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

редактирование кода: Мне действительно нужно было инициализировать контекст Spark, добавив следующее в преамбулу моего кода:

from pyspark import SparkContext
sc = SparkContext('local')

таким образом, полный код будет:

from pyspark import SparkContext
sc = SparkContext('local')

from flask import Flask, request
app = Flask(__name__)

@app.route('/whateverYouWant', methods=['POST'])  #can set first param to '/'

def toyFunction():
    posted_data = sc.parallelize([request.get_data()])
    return str(posted_data.collect()[0])

if __name__ == '__main_':
    app.run(port=8080)    #note set to 8080!

редактирование настройки: Важно, чтобы файл (yourrfilename.py) находится в правильном каталоге, а именно его необходимо сохранить в папку / home/ubuntu / spark-1.5.0-bin-hadoop2.6.

затем выполните следующую команду в каталоге:

./bin/spark-submit yourfilename.py

, который инициирует службу в 10.0.0.XX: 8080 / accessFunction/.

обратите внимание, что порт должен быть установлен в 8080 или 8081: Spark разрешает только веб-интерфейс для этих портов по умолчанию для master и worker соответственно

вы можете проверить услуга с услугой restful или путем открытия нового терминала и отправки почтовых запросов с командами cURL:

curl --data "DATA YOU WANT TO POST" http://10.0.0.XX/8080/accessFunction/

я смог исправить эту проблему, добавив местоположение PySpark и py4j в путь в моем flaskapp.тут WSGI файл. Вот полное содержание:

import sys
sys.path.insert(0, '/var/www/html/flaskapp')
sys.path.insert(1, '/usr/local/spark-2.0.2-bin-hadoop2.7/python')
sys.path.insert(2, '/usr/local/spark-2.0.2-bin-hadoop2.7/python/lib/py4j-0.10.3-src.zip')

from flaskapp import app as application

измените свой .файл py, как показано в связанном руководстве "использование IPython Notebook with Spark", часть вторая точка. Insted sys.путь.вставить использовать sys.путь.добавлять. Попробуйте вставить этот фрагмент:

import sys
try:
    sys.path.append("your/spark/home/python")
    from pyspark import context
    print ("Successfully imported Spark Modules")
except ImportError as e:
    print ("Can not import Spark Modules", e)