Как интегрировать Apache Spark с веб-приложением Spring MVC для интерактивных пользовательских сеансов

Я пытаюсь создать систему рекомендаций для редакторов с помощью Apache Spark MLlib. Я написал код для рекомендации в java и его работоспособность при запуске с помощью команды spark-submit.

Моя команда запуска выглядит так:

bin/spark-submit --jars /opt/poc/spark-1.3.1-bin-hadoop2.6/mllib/spark-mllib_2.10-1.0.0.jar --class "com.recommender.MovieLensALSExtended" --master local[4] /home/sarvesh/Desktop/spark-test/recommender.jar /home/sarvesh/Desktop/spark-test/ml-latest-small/ratings.csv /home/sarvesh/Desktop/spark-test/ml-latest-small/movies.csv

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

Я хочу создать веб-приложение Spring MVC, которое может взаимодействовать с Apache Spark Context и давать мне результаты по запросу.

Мой вопрос в том, как я могу создать приложение, которое взаимодействует с Apache Spark, который работает в кластере. Таким образом, когда запрос поступает на контроллер, он должен выполнить запрос пользователя и получить тот же результат, что и команда spark-submit, выводимая на консоль.

Насколько я искал, я обнаружил, что мы можем использовать Spark SQL, интегрироваться с JDBC. Но я не нашел хорошего примера.

Спасибо заранее.

Ответ 1

Чтобы взаимодействовать с моделью данных (вызывать метод invoke?), вы могли бы создать службу отдыха внутри драйвера. Эта служба прослушивает запросы и вызывает метод прогнозирования модели с вводом запроса и возвращает результат.

http4s (https://github.com/http4s/http4s) можно использовать для этой цели.

Spark SQL не имеет значения, поскольку он предназначен для обработки аналитики данных (что вы уже сделали), с возможностями sql.

Надеюсь, что это поможет.

Ответ 2

просто передайте контекст искры и сеанс как bean в Spring

@Bean
public SparkConf sparkConf() {
    SparkConf sparkConf = new SparkConf()
            .setAppName(appName)
            .setSparkHome(sparkHome)
            .setMaster(masterUri);

    return sparkConf;
}

@Bean
public JavaSparkContext javaSparkContext() {
    return new JavaSparkContext(sparkConf());
}

@Bean
public SparkSession sparkSession() {
    return SparkSession
            .builder()
            .sparkContext(javaSparkContext().sc())
            .appName("Java Spark Ravi")
            .getOrCreate();
}

Аналогично для конфигурации на основе xml

Здесь присутствует полный рабочий код с spring и искра

https://github.com/ravi-code-ranjan/spark-spring-seed-project

Ответ 3

Для такой ситуации был разработан интерфейс REST для обедов и обмена контекстом искровых работ

Посмотрите здесь документацию:

https://github.com/spark-jobserver/spark-jobserver

Ответ 4

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