HBase Mapreduce на нескольких объектах сканирования

Я просто пытаюсь оценить HBase для некоторых вещей анализа данных, которые мы делаем.

HBase будет содержать данные о наших событиях. Ключ будет eventId + время. Мы хотим провести анализ нескольких типов событий (4–5) в диапазоне дат. Общее количество типов событий составляет около 1000.

Проблема с запуском задания mapreduce для таблицы hbase заключается в том, что initTableMapperJob (см. ниже) берет только 1 объект сканирования. Из соображений производительности мы хотим сканировать данные только для 4-5 типов событий в заданном диапазоне дат, а не для 1000 типов событий. Если мы воспользуемся описанным ниже методом, то, я думаю, у нас не будет такого выбора, потому что он требует только 1 объект сканирования.

public static void initTableMapperJob (таблица строк, сканирование сканирования, сопоставление классов, класс outputKeyClass, класс outputValueClass, задание org.apache.hadoop.mapreduce.Job) выдает IOException

Можно ли запустить mapreduce для списка объектов сканирования? любой обходной путь?

Спасибо


person StackUnderflow    schedule 27.01.2011    source источник


Ответы (3)


TableMapReduceUtil.initTableMapperJob настраивает ваше задание на использование TableInputFormat, что, как вы заметили, требует одного Scan.

Похоже, вы хотите сканировать несколько сегментов таблицы. Для этого вам нужно будет создать свой собственный InputFormat, что-то вроде MultiSegmentTableInputFormat. Расширьте TableInputFormatBase и переопределите метод getSplits, чтобы он вызывал super.getSplits один раз для каждого начального/конечного сегмента строки таблицы. (Проще всего было бы TableInputFormatBase.scan.setStartRow() каждый раз). Объедините InputSplit экземпляров, возвращенных в один список.

Затем самостоятельно настройте задание для использования своего пользовательского файла MultiSegmentTableInputFormat.

person Dave L.    schedule 31.01.2011
comment
Не могли бы вы проверить stackoverflow.com/questions/11353911/ ? - person moinudin; 06.07.2012

Вы ищете класс:

org/apache/hadoop/hbase/filter/FilterList.java

Каждое сканирование может иметь фильтр. Фильтр может быть довольно сложным. Список фильтров позволяет указать несколько отдельных фильтров, а затем выполнить И или ИЛИ между всеми компонентными фильтрами. Вы можете использовать это для создания произвольного логического запроса по строкам.

person David    schedule 28.01.2011
comment
проблема с этим подходом заключается в том, что HBase должен будет хотя бы прочитать эти значения с диска, прежде чем фильтровать их. Производительность будет низкой, если у вас есть миллиарды строк. - person StackUnderflow; 29.01.2011
comment
Пришлось понизить голосование из-за проблемы, о которой упоминает StackUnderflow. Для миллиардов строк выполнение фильтра очень медленно. - person Gattster; 26.03.2013

Я попробовал подход Дэйва Л., и он прекрасно работает.

Для настройки задания карты вы можете использовать функцию

  TableMapReduceUtil.initTableMapperJob(byte[] table, Scan scan,
  Class<? extends TableMapper> mapper,
  Class<? extends WritableComparable> outputKeyClass,
  Class<? extends Writable> outputValueClass, Job job,
  boolean addDependencyJars, Class<? extends InputFormat> inputFormatClass)

где inputFormatClass относится к MultiSegmentTableInputFormat, упомянутому в комментариях Дэйва Л.

person Vijay B    schedule 01.04.2013