Подтвердить что ты не робот

Как обновить RDD?

Мы разрабатываем среду Spark, в которой мы перемещаем исторические данные в RDD-наборы.

В принципе, RDD является неизменным, только для чтения, на котором мы выполняем операции. Исходя из этого, мы переместили исторические данные в RDD, и мы делаем такие вычисления, как фильтрация/сопоставление и т.д. На таких RDD.

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

HistoricalData имеет форму RDD. Я создаю другое RDD на основе области запроса и сохраняю ссылку на это RDD в ScopeCollection

До сих пор я мог думать о нижних подходах -

Подход1: трансляция изменения:

  • Для каждого запроса на изменение мой сервер выбирает область действия RDD и запускает задание
  • В задании примените фазу карты на этом RDD -

    2.а для каждого node в RDD выполните поиск по широковещанию и создайте новое значение, которое теперь обновляется, тем самым создавая новый RDD
    2.b. теперь я делаю все вычисления снова на этом новом RDD на этапе 2.a. как умножение, сокращение и т.д.
    2.c. Я сохраняю эту ссылку RDD обратно в моем ScopeCollection

Approach2: создать RDD для обновлений

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

Подход 3:

Я подумал о создании потокового RDD, где я постоянно обновляю тот же RDD и делаю повторное вычисление. Но, насколько я понимаю, он может принимать потоки от Флюма или Кафки. Если в моем случае значения генерируются в самом приложении на основе взаимодействия с пользователем. Следовательно, я не вижу никаких точек интеграции потокового RDD в моем контексте.

Любое предложение о том, какой подход лучше или какой-либо другой подход подходит для этого сценария.

ТИА!

4b9b3361

Ответ 1

Представленная здесь информация о пользователях является хорошим совпадением для Spark Streaming. В двух других вариантах есть вопрос: "Как вы отправляете повторное вычисление RDD?"

Spark Streaming предлагает платформу для непрерывного представления работы Spark на основе некоторого потока входящих данных и сохранения этих данных в форме RDD. Кафка и Флюм - только два возможных источника потока.

Вы можете использовать Socket-связь с SocketInputDStream, считывая файлы в каталоге с помощью FileInputDStream или даже с использованием общей очереди с QueueInputDStream. Если ни один из этих вариантов не подходит вашему приложению, вы можете написать свой собственный InputDStream.

В этом случае, используя Spark Streaming, вы будете читать свой базовый RDD и использовать входящий поток для постепенного преобразования существующих данных и поддержания развитого состояния в памяти. dstream.transform позволит вам объединить базовый RDD с данными, собранными в течение заданного интервала между пакетами, а операция updateStateByKey может помочь вам построить состояние в памяти, адресованное ключами. Дополнительную информацию см. В документации .

Без дополнительной информации о приложении сложно перейти на уровень кода на том, что возможно использовать Spark Streaming. Я предлагаю вам изучить этот путь и задать новые вопросы для любых конкретных тем.

Ответ 2

Я предлагаю взглянуть на IndexedRDD implementation, которая предоставляет обновляемую RDD пар ключей. Это может дать вам некоторые идеи.

Идея основана на знании ключа и позволяет вам обновлять обновленный фрагмент данных с помощью тех же ключей уже созданного RDD. Во время обновления можно отфильтровать предыдущую версию данных.

Имея исторические данные, я бы сказал, что вам нужно иметь идентификатор события.

Что касается потоковой передачи и потребления, можно использовать порт TCP. Таким образом, драйвер может открыть искрообразование TCP-соединения, которое ожидает чтения и отправки там обновлений.