Forwarded from ✨swiftness
#Spark #Streaming #BigData #Structured
Spark Structured Streaming - это масштабируемый и отказоустойчивый механизм потоковой обработки данных на основе движка SparkSQL (см.
По итогу мы можем работать со стандартным инструментарием SQL-запросов через DataFrame API или операции Scala в DataSet API, чем Spark Structured отличается от Spark Streaming. Ключевая идея структурированной потоковой передачи состоит в том, чтобы обрабатывать поток данных в режиме реального времени как таблицу, которая постоянно обновляется - добавляются новые записи.
Эта неограниченная по глубине таблица продолжает увеличиваться по мере поступления новых данных и непрерывно обрабатывается с помощью долго выполняющегося запроса. Результаты обработки записываются в выходную таблицу. Каждый интервал триггера (скажем, каждую секунду) к входной таблице добавляются новые строки, которые в конечном итоге обновляют таблицу результатов (выходную таблицу).
На вход Spark Structured Streaming принимает файлы или данные из Kafka. Вывод данных определяет то, что именно будет записано во внешнее хранилище. Существует несколько режимов в Spark Structured Streaming:
⚙️ Режим добавления: во внешнее хранилище будут записаны только новые строки, добавленные в таблицу результатов с момента последнего триггера. Это применимо только к запросам, в которых не предполагается изменение существующих строк в таблице результатов.
⚙️ Режим обновления: во внешнее хранилище будут записываться только те строки, которые были обновлены в таблице результатов с момента последнего триггера.
⚙️ Полный режим: вся обновленная таблица результатов будет записана во внешнее хранилище. Storage Connector должен решить, как обрабатывать запись всей таблицы.
Какие же основные достоинства у этого механизма по сравнению с обычным Spark Streaming?
📍Мы используем DataFrame/DataSet вместо RDD, что обеспечивает более высокий уровень абстракции и позволяет гибко манипулировать данными, включая поддержку всех этапов оптимизации SQL-запросов
📍Начиная со Spark 2.3, в Spark Structured Streaming вместо микропакетной обработки поддерживается непрерывная, которая работает с минимальной задержкой (до 1 миллисекунды), что существенно ускоряет обработку данных.
📍Повысилась надежность и отказоустойчивость за счет условий восстановления после любой (!) ошибки - например, через воспроизводимость источника данных в случае сбоя.
📍Обработка времени события - времени, когда событие действительно (вне Spark) произошло. Это позволяет повысить точность вычислений и обработать события, которые пришли в Spark с опозданием.
Таким образом, для полноценной отказоустойчивой потоковой обработки, на мой взгляд, лучше использовать Spark Structured Streaming.
Spark Structured Streaming - это масштабируемый и отказоустойчивый механизм потоковой обработки данных на основе движка SparkSQL (см.
официальную документацию Spark). Движок Spark SQL заботится о том, чтобы поток данных обрабатывался постепенно и непрерывно, обновляя конечный результат по мере поступления новых потоковых данных. По итогу мы можем работать со стандартным инструментарием SQL-запросов через DataFrame API или операции Scala в DataSet API, чем Spark Structured отличается от Spark Streaming. Ключевая идея структурированной потоковой передачи состоит в том, чтобы обрабатывать поток данных в режиме реального времени как таблицу, которая постоянно обновляется - добавляются новые записи.
Эта неограниченная по глубине таблица продолжает увеличиваться по мере поступления новых данных и непрерывно обрабатывается с помощью долго выполняющегося запроса. Результаты обработки записываются в выходную таблицу. Каждый интервал триггера (скажем, каждую секунду) к входной таблице добавляются новые строки, которые в конечном итоге обновляют таблицу результатов (выходную таблицу).
На вход Spark Structured Streaming принимает файлы или данные из Kafka. Вывод данных определяет то, что именно будет записано во внешнее хранилище. Существует несколько режимов в Spark Structured Streaming:
⚙️ Режим добавления: во внешнее хранилище будут записаны только новые строки, добавленные в таблицу результатов с момента последнего триггера. Это применимо только к запросам, в которых не предполагается изменение существующих строк в таблице результатов.
⚙️ Режим обновления: во внешнее хранилище будут записываться только те строки, которые были обновлены в таблице результатов с момента последнего триггера.
⚙️ Полный режим: вся обновленная таблица результатов будет записана во внешнее хранилище. Storage Connector должен решить, как обрабатывать запись всей таблицы.
Какие же основные достоинства у этого механизма по сравнению с обычным Spark Streaming?
📍Мы используем DataFrame/DataSet вместо RDD, что обеспечивает более высокий уровень абстракции и позволяет гибко манипулировать данными, включая поддержку всех этапов оптимизации SQL-запросов
📍Начиная со Spark 2.3, в Spark Structured Streaming вместо микропакетной обработки поддерживается непрерывная, которая работает с минимальной задержкой (до 1 миллисекунды), что существенно ускоряет обработку данных.
📍Повысилась надежность и отказоустойчивость за счет условий восстановления после любой (!) ошибки - например, через воспроизводимость источника данных в случае сбоя.
📍Обработка времени события - времени, когда событие действительно (вне Spark) произошло. Это позволяет повысить точность вычислений и обработать события, которые пришли в Spark с опозданием.
Таким образом, для полноценной отказоустойчивой потоковой обработки, на мой взгляд, лучше использовать Spark Structured Streaming.
👍11