2016-03-03 3 views
1

может ли любой организм объяснить мне, что подразумевается под индексированием в Hadoop. Является ли это чем-то вроде традиционной индексации данных, которые мы делаем в РСУБД, поэтому, проведя аналогичную аналогию здесь, в Hadoop, мы индексируем блоки данных и сохраняем физический адрес блоков в некоторой структуре данных. Итак, это будет дополнительное пространство в кластере.Процесс индексирования в Hadoop

В этой теме, но не удалось получить удовлетворительные и детализированные вещи. Любые указатели помогут.

Заранее спасибо

ответ

0

Мы можем определить 2 различных уровней детализации для создания индексов: индекс на основе файла URI или индекса на основе InputSplit. Давайте возьмем два разных примера набора данных.

индекс

В this первого примера 2 файл в наборе данных помещается в 25 блоках, и был идентифицирован как 7 различных InputSplits. Цель, которую вы ищете (выделенная серым цветом) доступна в файле № 1 (блок № 2, № 8 и № 13), а в файле № 2 (блок № 17)

С индексированием на основе файлов вы закончите (полный набор данных здесь), что означает, что ваш проиндексированный запрос будет эквивалентен полному запросу сканирования. С индексированием на основе InputSplit вы получите 4 InputSplits на 7 доступных. Производительность должна быть определенно лучше, чем полный запрос сканирования индекс

Давайте рассмотрим пример second. На этот раз один и тот же набор данных был отсортирован по столбцу, который вы хотите индексировать. Цель, которую вы ищете (выделенная серым цветом), теперь доступна в файле # 1 (блок № 1, № 2, № 3 и № 4).

С индексацию на основе файла, вы будете в конечном итоге только один файл из набора данных С индексации на основе InputSplit, вы будете в конечном итоге с 1 InputSplit 7 доступных Для этого конкретного исследования, я решил использовать пользовательские InputSplit основанный индекс. Я считаю, что такой подход должен быть довольно хорошим балансом между усилиями, которые он предпринимает для реализации, добавленной стоимостью, которую он может принести с точки зрения оптимизации производительности, и его ожидаемой применимостью, независимо от распределения данных.

1

Hadoop хранит данные в файлах и не индексирует их. Чтобы найти что-то, нам нужно запустить задание MapReduce, проходящее через все данные. Hadoop эффективен там, где данные слишком велики для базы данных. С очень большими наборами данных стоимость восстановления индексов настолько высока, что вы не можете легко индексировать изменяющиеся данные.

Однако мы можем использовать индексирование в HDFS, используя два типа: индексирование на основе файлов & Индексирование на основе InputSplit. Предположим, что у нас есть 2 файла для хранения в HDFS для обработки. Первый - 500 МБ, а второй - около 250 МБ. Следовательно, у нас будет 4 InputSplits по 128 Мбайт каждый по 1-му файлу и 3 InputSplits во втором файле. Мы можем применить 2 типа индексирования для упомянутого случая - 1. При индексировании на основе файлов вы получите 2 файла (полный набор данных здесь), что означает, что ваш проиндексированный запрос будет эквивалентен полному запросу сканирования 2 . При индексировании на основе InputSplit вы получите 4 InputSplits. Производительность должна быть определенно лучше, чем полный запрос сканирования.

Теперь, чтобы для реализации индекса InputSplits нам необходимо выполнить следующие шаги: индекс

  1. сборки из вашего полного набора данных - это может быть achived, написав работу MapReduce, чтобы извлечь значение, которое мы хотим индекс, и выводит его вместе с хешем InputSplit MD5.
  2. Получить InputSplit (ы) для индексированного значения вы ищете - выход из программы MapReduce будет Уменьшенными файлы (содержащие индексы, основанных на InputSplits), которые будут храниться в HDFS
  3. Выполнить фактическую MapReduce работу на индексированных InputSplits только. - Это может быть сделано Hadoop, так как он может получить количество InputSplit, которое будет использоваться с помощью FileInputFormat.class. Мы создадим собственный класс IndexFileInputFormat, расширяющий файл FileInputFormat.class по умолчанию и переопределяя его метод getSplits(). Вы должны прочитать файл, который вы создали на предыдущем шаге, добавить все индексированные InputSplits в список, а затем сравнить этот список с тем, который был возвращен суперклассом. Вы вернетесь к JobTracker только в InputSplits, которые были найдены в вашем индексе.
  4. В классе драйвера мы должны использовать этот класс IndexFileInputFormat. Нам нужно установить как InputFormatClass с помощью - Чтобы использовать наш пользовательский индекс IndexFileInputFormat В классе драйвера нам необходимо предоставить job.setInputFormatClass (IndexFileInputFormat.class);

Для образца кода и другие подробности смотрите это -

https://hadoopi.wordpress.com/2013/05/24/indexing-on-mapreduce-2/

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