Приключение в трансформации данных привидениями

HadoopHadoopBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабе вы научитесь настраивать форматы вывода и ввода в Hadoop MapReduce для эффективной обработки данных. С помощью руководства от Ghost Tutor вы приобретете навыки работы с разными типами данных и раскроете все возможности экосистемы Hadoop. Готовьтесь к увлекательному путешествию, чтобы овладеть искусством вычислений в сверхъестественном мире!


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL hadoop(("Hadoop")) -.-> hadoop/HadoopMapReduceGroup(["Hadoop MapReduce"]) hadoop(("Hadoop")) -.-> hadoop/HadoopYARNGroup(["Hadoop YARN"]) hadoop(("Hadoop")) -.-> hadoop/HadoopHiveGroup(["Hadoop Hive"]) hadoop/HadoopMapReduceGroup -.-> hadoop/setup_jobs("Setting up MapReduce Jobs") hadoop/HadoopMapReduceGroup -.-> hadoop/mappers_reducers("Coding Mappers and Reducers") hadoop/HadoopMapReduceGroup -.-> hadoop/handle_io_formats("Handling Output Formats and Input Formats") hadoop/HadoopYARNGroup -.-> hadoop/yarn_jar("Yarn Commands jar") hadoop/HadoopHiveGroup -.-> hadoop/import_export_data("Importing and Exporting Data") hadoop/HadoopHiveGroup -.-> hadoop/process("Process Control Function") hadoop/HadoopHiveGroup -.-> hadoop/storage_formats("Choosing Storage Formats") hadoop/HadoopHiveGroup -.-> hadoop/integration("Integration with HDFS and MapReduce") subgraph Lab Skills hadoop/setup_jobs -.-> lab-288974{{"Приключение в трансформации данных привидениями"}} hadoop/mappers_reducers -.-> lab-288974{{"Приключение в трансформации данных привидениями"}} hadoop/handle_io_formats -.-> lab-288974{{"Приключение в трансформации данных привидениями"}} hadoop/yarn_jar -.-> lab-288974{{"Приключение в трансформации данных привидениями"}} hadoop/import_export_data -.-> lab-288974{{"Приключение в трансформации данных привидениями"}} hadoop/process -.-> lab-288974{{"Приключение в трансформации данных привидениями"}} hadoop/storage_formats -.-> lab-288974{{"Приключение в трансформации данных привидениями"}} hadoop/integration -.-> lab-288974{{"Приключение в трансформации данных привидениями"}} end

Создание классов Mapper и Reducer

В этом шаге мы углубимся в суть Hadoop MapReduce и создадим свои собственные классы Mapper и Reducer.

Исследование файла с данными

Сначала используйте команду su - hadoop, чтобы сменить идентификацию. Файл с данными data.txt хранится в директории /user/hadoop/input HDFS, которая содержит содержимое разговоров некоторых людей. Используйте следующую команду, чтобы просмотреть содержимое:

hdfs dfs -cat /user/hadoop/input/data.txt

Пользовательский Mapper

Далее мы создадим пользовательский класс Mapper под названием WordCountMapper, который наследуется от Mapper. Этот Mapper будет обрабатывать входные данные и генерировать пары ключ-значение, при этом учитывайте, что обрабатываемые данные - это содержимое каждой строки разговора, а не имена людей. Смотрите следующий пример, чтобы дополнить метод map в WordCountMapper.java в директории /home/hadoop/.

@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
    // Преобразуем объект Text в строку
    String line = value.toString();
    // Разбиваем строку с помощью StringTokenizer
    StringTokenizer tokenizer = new StringTokenizer(line);
    // Перебираем каждый токен и записываем его в контекст
    while (tokenizer.hasMoreTokens()) {
        // Устанавливаем текущее слово
        word.set(tokenizer.nextToken().trim());
        // Записываем слово и его количество в контекст
        context.write(word, one);
    }
}

Затем используйте следующую команду, чтобы скомпилировать код в версии java 8:

javac -source 8 -target 8 -cp $HADOOP_HOME/share/hadoop/common/hadoop-common-3.3.6.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:. WordCountMapper.java

Пользовательский Reducer

Наконец, мы создадим пользовательский класс Reducer под названием WordCountReducer, который наследуется от Reducer. Этот Reducer будет агрегировать значения для каждого ключа и генерировать окончательный результат. Дополните метод reduce в WordCountReducer.java в директории /home/hadoop/ следующим примером.

@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context)
        throws IOException, InterruptedException {
    // Инициализируем переменную для хранения суммы количества для каждого слова
    int sum = 0;
    // Перебираем все количества для текущего слова и вычисляем общую сумму
    for (IntWritable value : values) {
        sum += value.get();
    }
    // Устанавливаем окончательное количество для текущего слова
    result.set(sum);
    // Записываем слово и его окончательное количество в контекст
    context.write(key, result);
}

Затем используйте следующую команду, чтобы скомпилировать код в версии java 8:

javac -source 8 -target 8 -cp $HADOOP_HOME/share/hadoop/common/hadoop-common-3.3.6.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:. WordCountReducer.java

Создание пользовательских форматов ввода и вывода

В этом шаге мы укажем форматы ввода и вывода для задачи MapReduce.

Пользовательский формат ввода

Сначала создадим пользовательский формат ввода для чтения данных из определенного источника. Определим класс под названием PersonInputFormat, который наследуется от TextInputFormat и переопределяет метод getCurrentValue для обработки формата ввода. Дополните метод getCurrentValue в PersonInputFormat.java в директории /home/hadoop/ следующим примером.

@Override
public synchronized Text getCurrentValue() {
    // Возвращаем значение текущей записи, делим ее по ":", удаляем начальные и конечные пробелы и устанавливаем в объект Text.
    Text value = new Text();
    Text line = super.getCurrentValue();
    String[] parts = line.toString().split(":");
    if (parts.length == 2) {
        value.set(parts[1].trim());
    }
    return value;
}

Затем используйте следующую команду, чтобы скомпилировать код в версии java 8:

javac -source 8 -target 8 -cp $HADOOP_HOME/share/hadoop/common/hadoop-common-3.3.6.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:. PersonInputFormat.java

Пользовательский формат вывода

Далее создадим пользовательский формат вывода. Определим класс под названием CSVOutputFormat, который наследуется от TextOutputFormat. Дополните метод write в CSVOutputFormat.java в директории /home/hadoop/ следующим примером.

// Записываем пару ключ-значение в выходной поток в формате CSV
@Override
public void write(Text key, IntWritable value) throws IOException, InterruptedException {
    out.writeBytes(key.toString() + "," + value.toString() + "\n");
}

Затем используйте следующую команду, чтобы скомпилировать код в версии java 8:

javac -source 8 -target 8 -cp $HADOOP_HOME/share/hadoop/common/hadoop-common-3.3.6.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:. CSVOutputFormat.java

Интеграция с Driver

В этом последнем шаге мы изменим класс WordCountDriver, чтобы использовать пользовательские форматы ввода и вывода, которые мы создали ранее.

Пользовательский Driver

Дополните функцию main в WordCountDriver.java в директории /home/hadoop/ следующим примером.

// Устанавливаем классы Mapper и Reducer
job.setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class);

// Устанавливаем класс формата ввода в пользовательский формат ввода PersonInputFormat
job.setInputFormatClass(PersonInputFormat.class);

// Устанавливаем класс формата вывода в пользовательский формат вывода CSVOutputFormat
job.setOutputFormatClass(CSVOutputFormat.class);

Запуск задачи

Для запуска задачи Hadoop MapReduce с пользовательскими форматами ввода и вывода следуйте этим шагам:

  1. Скомпилируйте WordCountDriver.java с использованием соответствующих зависимостей Hadoop.

    javac -source 8 -target 8 -cp $HADOOP_HOME/share/hadoop/common/hadoop-common-3.3.6.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:. WordCountDriver.java
  2. Создайте JAR-файл, содержащий скомпилированные классы.

    jar -cvf mywordcount.jar *.class
  3. Запустите класс WordCountDriver с соответствующими путями ввода и вывода. Убедитесь, что путь вывода ранее не существовал.

    hadoop jar./mywordcount.jar WordCountDriver /user/hadoop/input /output

Эта команда запустит задачу Hadoop MapReduce с использованием пользовательских форматов ввода и вывода, которые мы определили.

Просмотр результатов вывода

Используйте следующую команду, чтобы проверить, успешно ли сгенерирован файл результата:

hdfs dfs -ls /output
hdfs dfs -cat /output/part.csv

Резюме

Поздравляем! В этом лабе вы успешно изучили сложности Hadoop MapReduce и освоили настройку форматов ввода и вывода под руководством Ghost Tutor. От создания классов Mapper и Reducer до преодоления таких проблем, как обработка несжимаемых файлов ввода, вы приобрели ценный опыт. С помощью практических заданий вы углубили свое понимание возможностей Hadoop MapReduce и теперь готовы с уверенностью справляться с задачами по обработке данных. Этот путь не только улучшил ваши технические навыки, но и расширил ваше представление о потенциале Hadoop MapReduce для обработки больших данных.