2015-11-25 2 views
0

У меня есть Incomming поток искры данных, глотает сообщения, содержащие идентификаторы устройств:Спарка Streaming играя с Hbase

{deviceId=123 , deviceState: "turned off" } 

Я хочу присоединиться к этой таблице информации об устройстве:

{deviceId=123 , deviceInfo: "The red refrigirator" } 

Чтобы денормализованных такие как:

{deviceId=123 , deviceState: "turned off", deviceInfo: "The red refrigirator" } 

Таблица device_info хранится в HBASE. Теперь вот в чем проблема: Время от времени таблица hbase «device-info» может быть изменена: в таблицу добавлено новое устройство, информация для существующего устройства изменена и т. Д. Эти изменения являются NOT в реальном времени, я могу терпеть несколько минут задержки с обновлениями.

Я вижу три подхода к проблеме:

  1. Не с помощью искры присоединяется: Для каждой записи в DATASTREAM, выполнить один поиск Hbase для DEVICE_INFO по идентификатору.

    • Это должно работать, но оно кажется крайне низким и потенциально неэффективным.
  2. Создание RDD из HBase в начале программы, используя «newAPIHadoopRDD», а затем присоединиться к нему с каждым новым microbatch в потоке данных.

    • Я мог бы пропустить любые обновления таблицы hbase. (Будет ли таблица HBase когда-нибудь перепроверен?)
  3. Для каждого microbatch в Incomming Datastream (ds.foreachRdd): Создать RDD из HBase (newAPIHadoopRDD), а затем вызвать присоединиться.

    • Это кажется опасным: создание так много новых RDD от hbase для каждого искрового потока может добавить слишком много латентности.

Какой подход, который я должен предпринять?

+0

Я встречался с этой проблемой, вы поняли это? – tintin

ответ

1

Я сделал бы # 1 с небольшой модификацией. Я бы

  1. Обработать все сообщения в памяти и создать набор идентификаторов устройств для поиска.
  2. Выполните мультигит в HBase, чтобы найти идентификаторы устройства и поместить в хэш-карту.
  3. Пробейте хэш-карту, чтобы собрать объединенную запись.

Это позволит вам сократить количество сетевых вызовов (multiget) и удалить повторяющиеся вызовы для одного и того же устройства (установить против списка).

Мы сделали это в сращивающей машине для проверки внешнего ключа и значительно увеличили нашу производительность (2-3X).

Удачи.

+0

Привет, Джон, у меня такая же проблема. Сколько здесь ожидаемая латентность? Я имею в виду, что делать multiget на hbase и затем заполнять данные в HashMap. Вся операция слишком дорогостоящая? –

+1

Это зависит от мощности поступающих данных, и если вы можете уменьшить до достаточно маленького набора. В других случаях различные стратегии объединения имеют больше смысла. Викас вы можете немного подробнее рассказать? –

Смежные вопросы