Доступ к Spark из приложения Flask
Я написал простое приложение 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 всегда быть запуск и установка последней версии Spark, следуя шагу 5 из этого руководства.
Edit:
Следуя совету дэвидизма, я теперь вместо этого прибегаю к простым программам с возрастающей сложностью, чтобы локализовать ошибку.
Сначала я создал .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)
Это возвращает "успешно импортированные модули Spark". Однако следующий файл .py, который я сделал, возвращает исключение:
from pyspark import SparkContext
sc = SparkContext('local')
rdd = sc.parallelize([0])
print rdd.count()
Это возвращает исключение:
"Процесс Java gateway вышел перед отправкой драйверу его номера порта"
В поисках подобных проблем я нашелэту страницу , но когда я запускаю этот код, ничего не происходит, никакой печати на консоли и никаких сообщений об ошибках. Аналогично, это тоже не помогло, я получаю то же исключение 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 service или открыв новый терминал и отправка POST запросов с помощью команд 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" часть вторая. Вместо Сыс.путь.вставить use 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)
Comments