Flask + Pyspark: двойная зажигательная сессия - PullRequest
0 голосов
/ 11 февраля 2019

Я использую PySpark с Flask, чтобы иметь веб-сервис.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from flask import Flask, jsonify
from pyspark import SparkFiles
from pyspark.ml import PipelineModel
from pyspark.sql import SparkSession, SQLContext
from pyspark.sql.functions import col, udf
from pyspark.sql.types import DoubleType, StringType

app = Flask(__name__)

# DEFINE SPARK SESSION
spark = SparkSession \
    .builder \
    .appName("app") \
    .master("<master>") \
    .config("spark.cores.max", 4) \
    .config("spark.executor.memory", "6g") \
    .getOrCreate()

# LOAD THE REQUIRED FILES
modelEnglish = PipelineModel.load(hdfsUrl + "model-english")
ticketEnglishDf = spark.read.parquet(hdfsUrl + "ticket-df-english.parquet").cache()

modelFrench = PipelineModel.load(hdfsUrl + "model-french")
ticketFrenchDf = spark.read.parquet(hdfsUrl + "ticket-df-french.parquet").cache()

def getSuggestions(ticketId, top = 10):
    # ...

    return ...

@app.route("/suggest/<int:ticketId>")
def suggest(ticketId):
    response = {"id": ticketId, "suggestions": getSuggestions(ticketId)}
    return jsonify(response)

if __name__ == "__main__":

    app.run(debug=True, host="127.0.0.1", port=2793, threaded=True)

Это хорошо работает, когда запрос отправляется на сервер.Но задание Spark дублируется ... и я не знаю почему?

Я уже пытался создать сеанс искры внутри блока условий if __name__ == "__main__":

1 Ответ

0 голосов
/ 11 февраля 2019

Spark использует RDD, которые являются ленивыми коллекциями.Через вызов методов RDD / Dataframe вы фактически собираете конвейер преобразования.Вычисления запускаются только после запуска действия, например collect, count или write.Обычно (если вы не кэшируете коллекцию) она будет пересчитываться снова и снова.Однако кэширование не гарантирует, что коллекция не будет пересчитана.См. Документацию по RDD и кэшированию .

Во-первых, использование Spark в серверном приложении ужасно неправильно.Это распределенная платформа обработки данных, которую следует использовать для пакетных заданий или потоковой передачи.Задания Spark обычно записывают файл или базу данных, и обработка занимает несколько часов (или даже дней) на нескольких машинах для завершения.

Полагаю, ваша модель является результатом конвейера Spark ML.Он должен быть достаточно маленьким, чтобы связать его с вашим серверным приложением и загрузить обычными инструментами ввода-вывода файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...