Hadoop & Примеры Mapreduce: создание первой программы на Java

Содержание:

Anonim

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

В этом руководстве вы узнаете:

  • Первая программа Hadoop MapReduce
  • Объяснение класса SalesMapper
  • Объяснение класса SalesCountryReducer
  • Объяснение класса SalesCountryDriver

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

Теперь в этом руководстве по MapReduce мы создадим нашу первую программу Java MapReduce:

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

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

su - hduser_

Шаг 1)

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

sudo mkdir MapReduceTutorial

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

sudo chmod -R 777 MapReduceTutorial

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  {private final static IntWritable one = new IntWritable(1);public void map(LongWritable key, Text value, OutputCollector  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 {public void reduce(Text t_key, Iterator values, OutputCollector 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 valueIntWritable value = (IntWritable) values.next();frequencyForCountry += value.get();}output.collect(key, new IntWritable(frequencyForCountry));}}

SalesCountryDriver.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 jobJobConf job_conf = new JobConf(SalesCountryDriver.class);// Set a name of the Jobjob_conf.setJobName("SalePerCountry");// Specify data type of output key and valuejob_conf.setOutputKeyClass(Text.class);job_conf.setOutputValueClass(IntWritable.class);// Specify names of Mapper and Reducer Classjob_conf.setMapperClass(SalesCountry.SalesMapper.class);job_conf.setReducerClass(SalesCountry.SalesCountryReducer.class);// Specify formats of the data type of Input and outputjob_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 jobJobClient.runJob(job_conf);} catch (Exception e) {e.printStackTrace();}}}

Скачать файлы здесь

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

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

Шаг 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/*"

Шаг 3)

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

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

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

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

Шаг 4)

Создайте новый файл Manifest.txt

sudo gedit Manifest.txt

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

Main-Class: SalesCountry.SalesCountryDriver

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

Шаг 5)

Создайте файл Jar

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

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

Шаг 6)

Запустить Hadoop

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

Шаг 7)

Скопируйте файл SalesJan2009.csv в ~ / inputMapReduce

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

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

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

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

$HADOOP_HOME/bin/hdfs dfs -ls /inputMapReduce

Шаг 8)

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

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

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

Шаг 9)

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

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

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

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

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

Открыть part-r-00000

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

В этом разделе мы поймем реализацию класса SalesMapper .

1. Начнем с указания имени пакета для нашего класса. SalesCountry - это название нашего пакета. Обратите внимание, что выходные данные компиляции SalesMapper.class попадут в каталог, названный этим именем пакета: SalesCountry .

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

Ниже моментальных показана реализация SalesMapper class-

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

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

открытый класс SalesMapper расширяет MapReduceBase, реализует Mapper {

Каждый класс сопоставления должен быть расширен от класса MapReduceBase и должен реализовывать интерфейс Mapper .

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

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

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

При каждом вызове «карта ()» методе ключ-значение пары ( «ключ» и «значение» в этом коде) передается.

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

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

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

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

output.collect (новый текст (SingleCountryData [7]), один);

Мы выбираем запись в 7-м индексе, потому что нам нужны данные о стране, и она находится в 7-м индексе в массиве SingleCountryData .

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

Transaction_date, Product, Price, Payment_Type, Name, City, State, Country , Account_Created, Last_Login, Latitude, Longitude

Результатом сопоставления снова является пара " ключ-значение", которая выводится с использованием метода "collect ()" объекта "OutputCollector" .

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

В этом разделе мы поймем реализацию класса SalesCountryReducer .

1. Начнем с указания имени пакета для нашего класса. SalesCountry - это название нашего пакета. Обратите внимание, что выходные данные компиляции SalesCountryReducer.class попадут в каталог, названный этим именем пакета: SalesCountry .

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

Ниже моментальных показана реализация SalesCountryReducer class-

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

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

открытый класс SalesCountryReducer расширяет MapReduceBase, реализует Reducer {

Здесь первые два типа данных, Text и IntWritable, являются типом данных входной пары " ключ-значение" для редуктора.

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

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

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

2. Определение функции «уменьшить» -

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

Входными данными для метода reduce () является ключ со списком из нескольких значений.

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

<Объединенные Арабские Эмираты, 1>, <Объединенные Арабские Эмираты, 1>, <Объединенные Арабские Эмираты, 1>, <Объединенные Арабские Эмираты, 1>, <Объединенные Арабские Эмираты, 1>, <Объединенные Арабские Эмираты, 1>.

Редуктору передается как <Объединенные Арабские Эмираты, {1,1,1,1,1,1}>

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

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

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

Текстовый ключ = t_key; int frequencyForCountry = 0;

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

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

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

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

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

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

В этом разделе мы разберемся с реализацией класса SalesCountryDriver.

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

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

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

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

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

arg [0] и arg [1] - это аргументы командной строки, переданные с командой, заданной в практическом руководстве MapReduce, т. е.

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

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

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

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