Как обновить 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 в моем контексте.
Любое предложение о том, какой подход лучше или какой-либо другой подход подходит для этого сценария.
ТИА!
Ответы
Ответ 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-соединения, которое ожидает чтения и отправки там обновлений.