Передача результатов нескольких последовательных запросов HBase в задание Mapreduce - PullRequest
2 голосов
/ 28 ноября 2011

У меня есть база данных HBase, в которой хранятся списки смежности для ориентированного графа, причем ребра в каждом направлении хранятся в паре семейств столбцов, где каждая строка обозначает вершину.Я пишу задание mapreduce, которое принимает в качестве входных данных все узлы, у которых также есть ребро, указывающее из тех же вершин, что и ребро, направленное на какую-то другую вершину (назначенную в качестве субъекта запроса).Это немного сложно объяснить, но на следующей диаграмме набор узлов, взятых в качестве входных данных, при запросе к вершине 'A', будет {A, B, C}, поскольку все они имеют ребра из вершины'1':

Example graph

Чтобы выполнить этот запрос в HBase, сначала я ищу вершины с ребрами в 'A' в семействе столбцов обратных ребер, получая {1}, идля каждого элемента в этом наборе ищите вершины с ребрами из этого элемента в семействе столбцов передних ребер.

Это должно привести к набору пар ключ-значение: {1: {A,B, C}}.

Теперь я хотел бы взять выходные данные этого набора запросов и передать их заданию hadoop mapreduce, однако я не могу найти способ «связывания» hbase-запросоввместе, чтобы обеспечить ввод для TableMapper в API Hbase mapreduce.До сих пор моя единственная идея состояла в том, чтобы предоставить другой начальный преобразователь, который принимает результаты первого запроса (для таблицы обратных ребер) для каждого результата, выполняет запрос к таблице прямых ребер и возвращает результаты, которые должны быть переданы ввторая работа на карте.Однако выполнение ввода-вывода из задания карты делает меня неловким, так как это, скорее всего, противоречит парадигме mapreduce (и может привести к узкому месту, если несколько картографов одновременно пытаются получить доступ к HBase).Поэтому, может ли кто-нибудь предложить альтернативную стратегию для выполнения такого рода запроса, или предложить какой-либо совет о передовых методах работы с hbase и mapreduce таким образом?Мне также было бы интересно узнать, есть ли какие-либо улучшения в моей схеме базы данных, которые могли бы смягчить эту проблему.

Спасибо,

Тим

1 Ответ

2 голосов
/ 01 марта 2013

Ваша проблема не так хорошо работает с парадигмой Map / Reduce.Я видел проблему кратчайшего пути, решенную многими M / R, соединенными вместе.Это не так эффективно, но необходимо, чтобы получить глобальное представление на уровне редуктора.

В вашем случае кажется, что вы можете выполнить все запросы в вашем маппере, следуя по краям и сохраняя список видимых узлов.

Однако выполнение ввода-вывода из задания карты вызывает у меня беспокойство

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

Убедитесь, что в таблицах HBase сохранен небольшой размер блока, чтобы оптимизировать чтение и иметь как можно меньше HFile для ваших регионов.,Я предполагаю, что ваши данные здесь довольно статичны, поэтому при крупном сжатии HFile объединит воедино и уменьшит количество файлов для чтения.

...