2011-01-27 3 views
3

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

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

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

государственной статической силы (таблица String, сканирования Scan, Класс картографа, Класс outputKeyClass, Класс outputValueClass, org.apache.hadoop.mapreduce.Job работа) initTableMapperJob бросает IOException

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

Благодаря

ответ

9

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

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

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

+0

Не могли бы вы проверить http: // stackoverflow.com/questions/11353911/extend-hadoops-tableinputformat-to-scan-with-pre-used-used-for-distribution? – marcog

0

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

орг/Apache/Hadoop/HBase/фильтр/FilterList.java

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

+2

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

+0

Пришлось сгладить из-за проблемы упоминания StackUnderflow. Для миллиардов строк выполнение фильтра происходит очень медленно. – Gattster

0

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

Чтобы настроить работу карты, вы можете использовать функцию

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 упоминается в комментариях Dave L'S.

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