Лучший вариант для поиска данных в спарк - PullRequest
0 голосов
/ 19 октября 2018

У меня есть требование, в котором мне нужно прочитать сообщение из темы kafka, выполнить поиск в наборе данных, а затем отправить сообщение в зависимости от результата поиска данных.Ниже приведен пример, чтобы сделать это немного понятнее.

В теме Kafka получено сообщение xml с полем messageID, содержащим значение 2345

Мы выполняем поиск и подтверждаем, что сообщение с этим идентификатором не имеетбыл отправлен раньше.Если это возвращается false, мы отправляем сообщение и затем добавляем этот messageID к поисковым данным.Если этот messageID уже находится в данных поиска, мы не отправляем его.

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

Есть ли альтернативное, более оптимизированное решение для использования hbase для этих данных поиска, например, для сохранения этих данных в памяти в СДР?Я попытался сделать это, но у меня возникли некоторые трудности, так как контексты искры явно не сериализуемы, поэтому я не мог добавить к существующему набору данных lookuo

Любые предложения очень ценятся!

Большое спасибо

Dan

1 Ответ

0 голосов
/ 20 октября 2018

Spark подходит для обработки больших объемов данных в аналитических целях.Абстракция RDD создается для увеличения ограничения производительности процесса Map-Reduce.Spark не является заменой хранилища ключей / значений, как HBase.
Глядя на вашу проблему, вы видите, что вам требуется слой кэша поверх HBase.Этого можно добиться с помощью Redis или другого механизма распределенного кэширования.
Кэширование RDD здесь не поможет, потому что

  1. Нельзя гарантировать, что все данные находятся в памяти
  2. Парный rdd поддерживает поиск по значению ключа, однако он следует шаблону сокращения карты для поиска ключа.СДР - это абстракция, в которой хранится информация о местоположении Данных и информация DAG Lineage.СДР не материализует данные, если с ними не произойдет какое-либо действие.Теперь, даже если вы храните все данные в кэше, СДР должен искать данные для поиска.Это не похоже на HBase, где у вас есть индекс ключа, и поиск может выполняться в постоянное время.

Теперь вы, вероятно, могли бы создать несколько фильтров Блума, индексировать ваши данные и использовать Spark для поиска.Однако, вероятно, это будет трудно.

...