Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Hadoop Tutorial. Пишем свой grep

Anna | 5.06.2014 | нет комментариев

Доброго времени суток, дорогое програсообщество. Не так давным-давно я начал постигать работу с крупными данными (Map/Reduce, NoSQL…) и дюже стремительно узнал о фреймворке с открытым начальным кодом Apache Hadoop, за постижение которого сразу и принялся.

Данный пост рассчитан на новичков, которые тоже не так давным-давно начали постигать Hadoop. В посте будет разобрано малое приложение построенное на этом фреймворке(Эдакий Hello World!). Кому увлекательно, благо пожаловать под кат.

Данный топик не рассматривает процесс установки, настройки и задач с запуском, впрочем источники для постижения вы можете посмотреть внизу. Мной в работе были использованы следующие спецтехнологии:

  • Linux Ubuntu 13.04;
  • Oracle Java 1.7;
  • Hadoop 1.1.2;
  • Intellij IDEA 12;

От того что счетчик слов (он же Word Count) продемонстрирован в подавляющем большинстве туториалов, я решил разнообразить эту тему и в качестве примера разобрал grep.
Наша реализация будет получать на вход:

  • Папку с файлами(Файл) для поиска совпадений по регулярному выражению;
  • Путь для сохранения итогов;
  • Регулярное выражение;

На выходе мы получим файл(ы) которые содержат полные пути к файлам(ключи) в которых нашлись совпадения и строки(значения) с этими совпадениями в файле.

Каждый процесс обработки данных построен на парадигме MapReduce. Суть ее в том, что мы разделяем всю работу на два этапа: map и reduce.
Выходит, преступим.

Map

На этом шаге мы в качестве довода получаем ключ и значение. Дальше эти данные проходят обработку подавая на выход список ключей и список значений.
Наша реализация map функции:

/*
* Маппер.
* Пример построен с применением нового API org.apache.hadoop.mapreduce.*
*/
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileSplit;

import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* LongWritable - Тип входного ключа(Номер строки).
* Text - Тип входного значения (Строка под номером ключа).
* Text - Тип выходного ключа(Полный путь к файлу).
* Text - Тип выходного значения(Строка из файла с совпадением).
*/
public class RegexMapper extends Mapper<LongWritable, Text, Text, Text>{
    private Pattern pattern;
    private Text    keyOut; //В качестве ключа на выход будет взят полный путь к файлу.

    /*
    * Способ setup() вызывается перед вызовом способа map()(тот, что переопределен ниже).
    * Применяется для отделения подготовительных действий от самой map() функции.
    */
    @Override
    public void setup(Context context) throws IOException{
        /*
        * Берем сохраненный довод(регулярное выражение),
        * тот, что был сохранен в Driver-классе(будет описан дальше).
        */
        pattern = Pattern.compile(context.getConfiguration().get("regex"));

        //Получаем полный путь входной строки файла (valueIn).
        Path filePath = ((FileSplit) context.getInputSplit()).getPath();
        keyOut        = new Text(filePath.toString());
    }

    /*
    * Сам map() способ. Создаем матчер и ищем в строке совпадения. В случае нахожде-
    * ния записываем полный путь файла в качестве ключа(keyOut - получен в setup()
    * способе) и строку из этого файла в качестве значения(valueIn - получена 
    * как довод способа). 
    */
    @Override
    public void map(LongWritable key, Text valueIn, Context context) 
                                 throws IOException, InterruptedException {
        Matcher matcher = pattern.matcher(valueIn.toString());

        //По скольку входным значением является только одна строка файла, то нам доста-
        //точно обнаружить правда бы одно совпадение, что бы строка подходила условиям поиска.
        if (matcher.find())
            context.write(keyOut, valueIn); //Запись пары ключ значение
    }
}

Вот и все. Переходим к reduce.

Reduce

На этапе reduce мы получаем в качестве довода один ключ и все сk!div>

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB