Интерактивные Запросы Kafka - Доступ к большим данным между экземплярами

Мы планируем запустить приложение kafka streams, распределенное на двух машинах. Каждый экземпляр хранит свои данные Ktable на своем собственном компьютере. Задача, с которой мы сталкиваемся здесь,

  1. У нас есть миллион записей в Ktable. Нам нужно перебрать все данные Ktable (RocksDB) и сгенерировать отчет.
  2. Допустим, 500K записей хранятся в каждом экземпляре. Невозможно получить все записи из другого экземпляра в одном GET через http (если не доступна какая-либо потоковая технология TCP) . В основном нам нужны два экземпляра данных в одном вызове и генерировать отчет.

Предлагаемое решение: мы думаем иметь общее местоположение (state.dir) для этих двух экземпляров. Так что эти два экземпляра будут хранить данные Ktable в одном каталоге, и идея состоит в том, чтобы получить все данные из одного экземпляра без интерактивного запроса с помощью просто звоню,

final ReadOnlyKeyValueStore<Key, Result> allDataFromTwoInstance =
        streams.store("result",
            QueryableStoreTypes.<Key, Result>keyValueStore())

    KeyValueIterator<Key, ReconResult> iterator = allDataFromTwoInstance.all();
    while (iterator.hasNext()) {
       //append to excel report
    }

Вопрос: Будет ли вышеуказанное решение работать без проблем? Если нет, есть ли альтернативное решение для этого?

Пожалуйста, предложите. Заранее спасибо

2 ответа

Решение

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

Другая альтернатива, которая приходит на ум, - это потоковая передача данных между узлами по требованию. Это имеет смысл, особенно если создание отчета является нечастой операцией или когда набор данных не может уместиться на одном узле. По сути, вы можете следовать рекомендациям по документации для запросов к удаленным узлам Kafka Streams здесь:

http://kafka.apache.org/0110/documentation/streams/developer-guide

а для RPC используйте каркас, поддерживающий потоковую передачу, например, akka-http.

Потоковая передача на стороне сервера:

http://doc.akka.io/docs/akka-http/current/java/http/routing-dsl/source-streaming-support.html

Использование потокового ответа:

http://doc.akka.io/docs/akka-http/current/java/http/implications-of-streaming-http-entity.html

Это не будет работать. Даже если у вас есть общий доступ state.dirкаждый экземпляр загружает только свой собственный раздел / осколок данных и не знает о других данных.

Я думаю, вы можете использовать GlobalKTable чтобы получить полную локальную копию, если данные: http://docs.confluent.io/current/streams/concepts.html

Другие вопросы по тегам