Примеры Hadoop и Mapreduce: создайте первую программу в Java

В этом руководстве вы научитесь использовать Hadoop с примерами MapReduce. Используемые входные данные Продажиянварь2009.csv. Он содержит информацию, связанную с продажами, такую ​​как название продукта, цена, способ оплаты, город, страна клиента и т. д. Цель состоит в том, чтобы Узнайте количество продуктов, проданных в каждой стране.

Первая программа Hadoop MapReduce

Теперь в этом Учебное пособие по MapReduce, мы создадим наш первый Java Программа MapReduce:

Первая программа Hadoop MapReduce

Данные о продажах, январь 2009 г.

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

su - hduser_

Первая программа Hadoop MapReduce

Шаг 1)

Создайте новый каталог с именем MapReduceУчебник как показано в примере MapReduce ниже.

sudo mkdir MapReduceTutorial

Первая программа Hadoop MapReduce

Дать разрешения

sudo chmod -R 777 MapReduceTutorial

Первая программа Hadoop MapReduce

SalesMapper.java

package SalesCountry;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.*;

public class SalesMapper extends MapReduceBase implements Mapper <LongWritable, Text, Text, IntWritable> {
	private final static IntWritable one = new IntWritable(1);

	public void map(LongWritable key, Text value, OutputCollector <Text, IntWritable> output, Reporter reporter) throws IOException {

		String valueString = value.toString();
		String[] SingleCountryData = valueString.split(",");
		output.collect(new Text(SingleCountryData[7]), one);
	}
}

SalesCountryReducer.java

package SalesCountry;

import java.io.IOException;
import java.util.*;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.*;

public class SalesCountryReducer extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> {

	public void reduce(Text t_key, Iterator<IntWritable> values, OutputCollector<Text,IntWritable> output, Reporter reporter) throws IOException {
		Text key = t_key;
		int frequencyForCountry = 0;
		while (values.hasNext()) {
			// replace type of value with the actual type of our value
			IntWritable value = (IntWritable) values.next();
			frequencyForCountry += value.get();
			
		}
		output.collect(key, new IntWritable(frequencyForCountry));
	}
}

ПродажиСтранаДрайвер.java

package SalesCountry;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapred.*;

public class SalesCountryDriver {
    public static void main(String[] args) {
        JobClient my_client = new JobClient();
        // Create a configuration object for the job
        JobConf job_conf = new JobConf(SalesCountryDriver.class);

        // Set a name of the Job
        job_conf.setJobName("SalePerCountry");

        // Specify data type of output key and value
        job_conf.setOutputKeyClass(Text.class);
        job_conf.setOutputValueClass(IntWritable.class);

        // Specify names of Mapper and Reducer Class
        job_conf.setMapperClass(SalesCountry.SalesMapper.class);
        job_conf.setReducerClass(SalesCountry.SalesCountryReducer.class);

        // Specify formats of the data type of Input and output
        job_conf.setInputFormat(TextInputFormat.class);
        job_conf.setOutputFormat(TextOutputFormat.class);

        // Set input and output directories using command line arguments, 
        //arg[0] = name of input directory on HDFS, and arg[1] =  name of output directory to be created to store the output file.

        FileInputFormat.setInputPaths(job_conf, new Path(args[0]));
        FileOutputFormat.setOutputPath(job_conf, new Path(args[1]));

        my_client.setConf(job_conf);
        try {
            // Run the job 
            JobClient.runJob(job_conf);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Загрузите файлы здесь

Первая программа Hadoop MapReduce

Проверьте права доступа ко всем этим файлам.

Первая программа Hadoop MapReduce

и если разрешения на чтение отсутствуют, предоставьте то же самое:

Первая программа Hadoop MapReduce

Шаг 2)

Экспортируйте путь к классам, как показано в примере Hadoop ниже.

export CLASSPATH="$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.2.0.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-common-2.2.0.jar:$HADOOP_HOME/share/hadoop/common/hadoop-common-2.2.0.jar:~/MapReduceTutorial/SalesCountry/*:$HADOOP_HOME/lib/*"

Первая программа Hadoop MapReduce

Шаг 3)

Компилировать Java файлы (эти файлы находятся в каталоге Final-MapReduceHandsOn). Его файлы классов будут помещены в каталог пакета.

javac -d . SalesMapper.java SalesCountryReducer.java SalesCountryDriver.java

Первая программа Hadoop MapReduce

Это предупреждение можно смело игнорировать.

Эта компиляция создаст каталог в текущем каталоге с именем пакета, указанным в исходном файле Java (т. е. Страна продаж в нашем случае) и поместите в него все скомпилированные файлы классов.

Первая программа Hadoop MapReduce

Шаг 4)

Создать новый файл Манифест.txt

sudo gedit Manifest.txt

добавьте в него следующие строки,

Main-Class: SalesCountry.SalesCountryDriver

Первая программа Hadoop MapReduce

SalesCountry.SalesCountryDriver это имя основного класса. Обратите внимание, что вам нужно нажать клавишу ввода в конце этой строки.

Шаг 5)

Создать Jar-файл

jar cfm ProductSalePerCountry.jar Manifest.txt SalesCountry/*.class

Первая программа Hadoop MapReduce

Убедитесь, что файл jar создан.

Первая программа Hadoop MapReduce

Шаг 6)

Запустить Hadoop

$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh

Шаг 7)

Скопируйте файл Продажиянварь2009.csv в ~/inputMapReduce

Теперь используйте команду ниже для копирования ~/inputMapReduce в HDFS.

$HADOOP_HOME/bin/hdfs dfs -copyFromLocal ~/inputMapReduce /

Первая программа Hadoop MapReduce

Мы можем смело игнорировать это предупреждение.

Проверьте, действительно ли файл скопирован или нет.

$HADOOP_HOME/bin/hdfs dfs -ls /inputMapReduce

Первая программа Hadoop MapReduce

Шаг 8)

Запустите задание MapReduce

$HADOOP_HOME/bin/hadoop jar ProductSalePerCountry.jar /inputMapReduce /mapreduce_output_sales

Первая программа Hadoop MapReduce

Это создаст выходной каталог с именем mapreduce_output_sales на HDFS. Содержимое этого каталога будет представлять собой файл, содержащий данные о продажах продукции по странам.

Шаг 9)

Результат можно увидеть через командный интерфейс как:

$HADOOP_HOME/bin/hdfs dfs -cat /mapreduce_output_sales/part-00000

Первая программа Hadoop MapReduce

Результаты также можно увидеть через веб-интерфейс, как

Откройте r в веб-браузере.

Первая программа Hadoop MapReduce

Теперь выберите «Просмотр файловой системы» , а затем перейдите в /mapreduce_output_sales

Первая программа Hadoop MapReduce

Открыто часть-r-00000

Первая программа Hadoop MapReduce

Объяснение класса SalesMapper

В этом разделе мы разберемся с реализацией Картограф продаж класса.

1. Начнем с указания имени пакета для нашего класса. Страна продаж это имя нашего пакета. Обратите внимание, что результат компиляции, SalesMapper.класс перейдет в каталог с именем этого пакета: Страна продаж.

После этого импортируем пакеты библиотек.

Ниже снимок показывает реализацию Картограф продаж класс-

Объяснение класса SalesMapper

Пример пояснения кода:

1. Определение класса SalesMapper.

общедоступный класс SalesMapper расширяет MapReduceBase и реализует Mapper {

Каждый класс картографа должен быть расширен из КартаReduceBase класс, и он должен реализовать картопостроитель интерфейс.

2. Определение функции «карта» —

public void map(LongWritable key,
         Text value,
OutputCollector<Text, IntWritable> output,
Reporter reporter) throws IOException

Основная часть класса Mapper представляет собой 'карта()' метод, который принимает четыре аргумента.

При каждом звонке в 'карта()' метод, ключ-значение пара ('ключ' и 'ценить' в этом коде) передается.

'карта()' Метод начинается с разделения входного текста, полученного в качестве аргумента. Он использует токенизатор для разделения этих строк на слова.

String valueString = value.toString();
String[] SingleCountryData = valueString.split(",");

Здесь, '' используется в качестве разделителя.

После этого формируется пара с использованием записи по 7-му индексу массива. «Одностранные данные» и значение '1'.

output.collect(new Text(SingleCountryData[7]), один);

Мы выбираем запись по 7-му индексу, потому что нам нужно Страна данные и они расположены по 7-му индексу в массиве «Одностранные данные».

Обратите внимание, что наши входные данные имеют формат ниже (где Страна в 7th индекс, с 0 в качестве начального индекса)-

Дата_транзакции,Продукт,Цена,Тип_платежа,Имя,Город,Штат,Страна,Account_Created,Last_Login,Latitude,Longitude

Результатом работы Mapper снова является ключ-значение пара, которая выводится с использованием 'собирать()' метод «Коллектор выходных данных».

Объяснение класса SalesCountryReducer

В этом разделе мы разберемся с реализацией ПродажиСтранаReducer класса.

1. Начнем с указания имени пакета для нашего класса. Страна продаж это имя нашего пакета. Обратите внимание, что результат компиляции, SalesCountryReducer.класс перейдет в каталог с именем этого пакета: Страна продаж.

После этого импортируем пакеты библиотек.

Ниже снимок показывает реализацию ПродажиСтранаReducer класс-

Объяснение класса SalesCountryReducer

Пояснение к коду:

1. Определение класса SalesCountryReducer.

Публичный класс SalesCountryReducer расширяет MapReduceBase и реализует Редуктор. {

Здесь первые два типа данных, 'Текст' и «Незаписываемый» — это тип данных входного значения ключа в редуктор.

Вывод картографа имеет вид , . Этот вывод картографа становится входом для редуктора. Итак, чтобы согласовать его с типом данных, Текст и IntWritable используются здесь в качестве типа данных.

Последние два типа данных, «Текст» и «IntWritable», представляют собой тип выходных данных, генерируемых редуктором в форме пары ключ-значение.

Каждый класс редуктора должен быть расширен от КартаReduceBase класс, и он должен реализовать Редуктор интерфейс.

2. Определение функции уменьшения.

public void reduce( Text t_key,
             Iterator<IntWritable> values,                           
             OutputCollector<Text,IntWritable> output,
             Reporter reporter) throws IOException {

Вход в уменьшения () Метод представляет собой ключ со списком нескольких значений.

Например, в нашем случае это будет:

, , , , , .

Это передается редуктору как

Итак, чтобы принять аргументы этой формы, используются первые два типа данных, а именно: Текст и Итератор. Текст это тип данных ключа и Итератор — это тип данных для списка значений этого ключа.

Следующий аргумент имеет тип Выходной коллектор который собирает выходной сигнал фазы редуктора.

уменьшения () Метод начинается с копирования значения ключа и инициализации счетчика частоты равным 0.

Текстовый ключ = t_key;
интервал частотыForCountry = 0;

Затем, используя 'пока' В цикле мы перебираем список значений, связанных с ключом, и вычисляем окончательную частоту, суммируя все значения.

 while (values.hasNext()) {
            // replace type of value with the actual type of our value
            IntWritable value = (IntWritable) values.next();
            frequencyForCountry += value.get();
            
        }

Теперь мы помещаем результат в выходной коллектор в виде ключ и получил подсчет частоты.

Ниже код делает это:

output.collect(key, new IntWritable(frequencyForCountry));

Объяснение класса SalesCountryDriver

В этом разделе мы разберемся с реализацией ПродажиСтранаДрайвер класс

1. Начнем с указания имени пакета для нашего класса. Страна продаж это имя нашего пакета. Обратите внимание, что результат компиляции, SalesCountryDriver.class перейдет в каталог с именем этого пакета: Страна продаж.

Вот строка, определяющая имя пакета, за которой следует код для импорта пакетов библиотеки.

Объяснение класса SalesCountryDriver

2. Определите класс драйвера, который создаст новое клиентское задание, объект конфигурации и объявит классы Mapper и Редюсер.

Класс драйвера отвечает за запуск нашего задания MapReduce. Hadoop. В этом классе мы указываем имя задания, тип данных ввода/вывода и имена классов картографов и редукторов.

Объяснение класса SalesCountryDriver

3. В приведенном ниже фрагменте кода мы устанавливаем входные и выходные каталоги, которые используются для использования входного набора данных и создания выходных данных соответственно.

аргумент [0] и аргумент [1] являются аргументами командной строки, передаваемыми с помощью команды, полученной в ходе практического применения MapReduce, т.е.

$HADOOP_HOME/bin/hadoop jar ProductSalePerCountry.jar/inputMapReduce/mapreduce_output_sales

Объяснение класса SalesCountryDriver

4. Запустите нашу работу

Ниже кода начинается выполнение задания MapReduce:

try {
    // Run the job 
    JobClient.runJob(job_conf);
} catch (Exception e) {
    e.printStackTrace();
}