Считать с потоками Кафки - PullRequest
1 голос
/ 17 апреля 2019

У меня есть вопрос с потоковой передачей в целом, но для целей вопроса давайте ограничимся Kafka Streams. Давайте еще больше сузим сферу, ограничив нашу задачу только подсчетом слов или подсчетом в целом. Скажем, у меня есть поток некоторого ключа и значения, ключ может быть строкой (и скажем, у нас может быть много строк, кроме пустых строк, состоящих из любого символа в мире), а значение является целым числом, теперь мы создаем приложение для подсчета слов, если общее количество слов в словаре составляет триллион, мы не можем хранить их в каком-либо локальном кэше. Если слово w встречается со значением x, мне нужно обновить существующий счет для w до X+x, предполагая, что X был предыдущий счет, как я буду создавать это приложение. Я не могу хранить триллион слов в KTable или любом другом локальном хранилище, встроенном в Kafka. Как мне создать это приложение? Мое понимание неверно относительно потоков или как они работают.

Ответы [ 2 ]

4 голосов
/ 18 апреля 2019

Поскольку Kafka Streams масштабируется горизонтально, вы можете развернуть столько экземпляров приложений, сколько захотите.Таким образом, на самом деле должно быть возможно построить это приложение.Обратите внимание, что состояние KTable будет закрыто на всех машинах.

Если вы предполагаете триллион ключей, а каждый ключ имеет размер около 100 байт, вам потребуется около 100 ТБ памяти.Чтобы освободить место, на практике вы можете выделить 200 ТБ.Таким образом, 100 экземпляров по 2 ТБ каждый должны выполнить эту работу.

Для этого в вашей теме ввода должно быть 100 разделов, что, впрочем, не является проблемой для Кафки.

0 голосов
/ 18 апреля 2019

(+ 1 к тому, что сказал Матиас Дж. Сакс в своем ответе.)

Альтернативный подход заключается в использовании вероятностного подсчета, который значительно уменьшает объем памяти и объем памяти;то есть использовать вероятностную структуру данных, такую ​​как Count-min Sketch (CMS), вместо линейной структуры данных, такой как Kafka Streams 'KTable или Java HashMap.

.доступен пример под названием ProbabilisticCounting, который демонстрирует, как выполнять вероятностный подсчет с CMS в потоках Kafka: https://github.com/confluentinc/kafka-streams-examples ( прямая ссылка для Confluent Platform версии 5.2.1 / Apache Kafka 2.2.1)

Я успешно использовал вероятностный подсчет для подобных случаев, когда пространство ключей очень велико (в вашем случае: триллионы ключей).

...