Использование Hadoop для обработки данных из нескольких источников данных

Подходят ли mapreduce и любые другие технологии Hadoop (HBase, Hive, pig и т. д.) в ситуациях, когда у вас есть несколько входных файлов и когда данные необходимо сравнивать между различными источниками данных.

В прошлом я написал несколько задач по уменьшению карты, используя Hadoop и Pig. Однако эти задачи были довольно простыми, поскольку они включали манипулирование только одним набором данных. Требования, которые у нас есть сейчас, требуют, чтобы мы считывали данные из нескольких источников и выполняли сравнения различных элементов данных в другом источнике данных. Затем мы сообщаем о различиях. Наборы данных, с которыми мы работаем, составляют от 10 до 60 миллионов записей, и до сих пор нам не удавалось выполнять эти задания достаточно быстро.

Есть ли смысл использовать mapreduce для решения таких проблем, или я иду по неправильному пути.

Любые предложения очень ценятся.


person swedstar    schedule 30.05.2012    source источник
comment
Наборы данных предварительно отсортированы и разделены? Как сравниваются наборы данных (ключ в записях или более сложные)?   -  person Chris White    schedule 31.05.2012
comment
Наборы данных поступают от третьих лиц, поэтому я не могу гарантировать порядок сортировки. По сути, мне нужно сопоставить поля адресов из этих источников с основным источником, который мы размещаем, и на основе совпадений мы делаем определенные вещи. Операции сравнения над адресными полями включают довольно сложную логику сопоставления строк.   -  person swedstar    schedule 31.05.2012


Ответы (4)


Думаю, я бы предварительно обработал разные наборы данных в общий формат (обязательно включив столбец идентификатора «источника данных» с одним уникальным значением для каждой строки, поступающей из одного и того же набора данных). Затем переместите файлы в тот же каталог, загрузите весь каталог и обработайте его как единый источник данных, в котором вы сравниваете свойства строк на основе их идентификатора набора данных.

person Nicolas78    schedule 31.05.2012

Да, вы можете объединить несколько наборов данных в задании mapreduce. Я бы порекомендовал получить копию книги/электронной книги Hadoop In Action, в которой рассматривается объединение данных из нескольких источников.

person ditkin    schedule 31.05.2012

Если у вас есть несколько входных файлов, вы можете использовать MapReduce API FileInputFormat.addInputPaths(), в котором можно получить список нескольких файлов, разделенных запятыми, как показано ниже:

FileInputFormat.addInputPaths("dir1/file1,dir2/file2,dir3/file3");

Вы также можете передать несколько входных данных в Mapper в Hadoop с помощью распределенного кеша, дополнительная информация описана здесь: hadoop">множественный ввод в Mapper в hadoop

Если я не ошибаюсь, вы пытаетесь нормализовать структурированные данные в записях, поступающих с нескольких входов, а затем обрабатывать их. Исходя из этого, я думаю, вам действительно нужно взглянуть на эту статью, которая помогла мне в прошлом. Он включал Как нормализовать данные с помощью Hadoop/MapReduce, как показано ниже:

  • Шаг 1: Извлеките пары значений столбца из исходных данных.
  • Шаг 2. Извлечение пар столбцов и значений, отсутствующих в файле основного идентификатора
  • Шаг 3. Рассчитайте максимальный идентификатор для каждого столбца в мастер-файле.
  • Шаг 4. Рассчитайте новый идентификатор для несопоставленных значений
  • Шаг 5: объедините новые идентификаторы с существующими мастер-идентификаторами
  • Шаг 6: Замените значения в исходных данных идентификаторами
person AvkashChauhan    schedule 01.06.2012

Используя MultipleInputs, мы можем это сделать.

MutlipleInputs.addInputPath(job, Mapper1.class, TextInputFormat.class,path1);
MutlipleInputs.addInputPath(job, Mapper2.class, TextInputFormat.class,path2);
job.setReducerClass(Reducer1.class);
//FileOutputFormat.setOutputPath(); set output path here

Если у обоих классов есть общий ключ, то их можно соединить в редюсере и проделать необходимую логику

person sunitha    schedule 02.12.2015