#apache-spark #apache-kafka
#apache-spark #apache-kafka
Вопрос:
Мы используем небольшой кластер spark с 5 узлами, и все эти 5 узлов были связаны с брокерами Kafka.
Мы планируем масштабировать кластер, добавив больше узлов, и для этого может потребоваться дополнительная настройка для подключения к кластеру Kafka .Мы оцениваем лучшие практики интеграции
- Как это на самом деле должно быть интегрировано, чтобы сделать интеграцию максимально простой
- Необходимо ли, чтобы все рабочие узлы были связаны с брокерами, в этом случае они могут быть не масштабируемыми?
Ответ №1:
Я бы посоветовал ознакомиться с документацией spark с интеграцией kafka
https://spark.apache.org/docs/latest/structured-streaming-kafka-integration.html
«Как это на самом деле должно быть интегрировано, чтобы сделать интеграцию максимально простой» :
Я не уверен, что вы имеете в виду, но в основном, когда вы подключаетесь к kafka, вы должны предоставить серверы начальной загрузки: серверы начальной загрузки представляют собой список пар хост / порт, которые используются для установления начального подключения к кластеру Kafka. Эти серверы используются только для первоначального подключения, чтобы обнаружить полное членство в кластере. таким образом, количество узлов кластера kafka не изменит способ интеграции
«Необходимо ли, чтобы все рабочие узлы были связаны с брокерами, в этом случае они могут быть не масштабируемыми?» :
интеграция с spark работает следующим образом (вроде):
- драйвер sprak — подключается к kafka для определения требуемых разделов и смещений
- на основе части 1 разделы назначаются «рабочим» spark, что обычно составляет 1 к 1 от раздела kafka к разделу spark.
- не все рабочие (я полагаю, вы имеете в виду исполнителей) подключаются ко всем узлам kafka, поэтому в этом случае он также масштабируется
примечание: вы можете использовать конфигурацию для дальнейшего разделения количества разделов spark, которые будут считываться из одного раздела kafka — его minPartitions и его из spark 2.4.7
последнее замечание: spark streaming с kafka — очень распространенный и известный вариант использования, который используется в экосистемах с очень большими данными. в качестве первой интуитивной мысли я бы предположил его масштабируемость
Комментарии:
1. Большое спасибо за информацию. Как работает интеграция, если все рабочие не подключены к серверам начальной загрузки (через один драйвер)? Как выглядит интеграция со стороны spark или со стороны kafka? Статья очень высокого уровня, и я ищу реальный опыт.
Ответ №2:
Наткнулся на следующую фразу, просматривая книгу, https://learning.oreilly.com/library/view/stream-processing-with/9781491944233/ch19.html
В частности, фраза The driver does not send data to the executors; instead, it simply sends a few offsets they use to directly consume data.
— кажется, что _все исполнители (рабочие узлы) должны иметь связь с кафкой, поскольку вполне возможно, что задачи могут выполняться на любом исполнителе
Суть доставки данных заключается в том, что драйвер Spark запрашивает смещения и определяет диапазоны смещений для каждого пакетного интервала из Apache Kafka. После получения этих смещений драйвер отправляет их, запуская задачу для каждого раздела, что приводит к параллелизму 1: 1 между разделами Kafka и работающими разделами Spark. Каждая задача извлекает данные, используя свои определенные диапазоны смещений.
Драйвер не отправляет данные исполнителям; вместо этого он просто отправляет несколько смещений, которые они используют для непосредственного использования данных. Как следствие, параллелизм приема данных из Apache Kafka намного лучше, чем устаревшая модель приемника, где каждый поток потреблялся одной машиной.