Примеры Hadoop и Mapreduce: создайте первую программу в Java
В этом руководстве вы научитесь использовать Hadoop с примерами MapReduce. Используемые входные данные Продажиянварь2009.csv. Он содержит информацию, связанную с продажами, такую как название продукта, цена, способ оплаты, город, страна клиента и т. д. Цель состоит в том, чтобы Узнайте количество продуктов, проданных в каждой стране.
Первая программа Hadoop MapReduce
Теперь в этом Учебное пособие по MapReduce, мы создадим наш первый Java Программа MapReduce:
Убедитесь, что у вас установлен Hadoop. Прежде чем приступить к фактическому процессу, измените пользователя на «hduser» (идентификатор, используемый при настройке Hadoop, вы можете переключиться на идентификатор пользователя, используемый во время конфигурации программирования Hadoop).
su - hduser_
Шаг 1)
Создайте новый каталог с именем MapReduceУчебник как показано в примере 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 <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(); } } }
Проверьте права доступа ко всем этим файлам.
и если разрешения на чтение отсутствуют, предоставьте то же самое:
Шаг 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 (т. е. Страна продаж в нашем случае) и поместите в него все скомпилированные файлы классов.
Шаг 4)
Создать новый файл Манифест.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)
Скопируйте файл Продажиянварь2009.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
Открыто часть-r-00000
Объяснение класса SalesMapper
В этом разделе мы разберемся с реализацией Картограф продаж класса.
1. Начнем с указания имени пакета для нашего класса. Страна продаж это имя нашего пакета. Обратите внимание, что результат компиляции, 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 класс-
Пояснение к коду:
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 перейдет в каталог с именем этого пакета: Страна продаж.
Вот строка, определяющая имя пакета, за которой следует код для импорта пакетов библиотеки.
2. Определите класс драйвера, который создаст новое клиентское задание, объект конфигурации и объявит классы Mapper и Редюсер.
Класс драйвера отвечает за запуск нашего задания MapReduce. Hadoop. В этом классе мы указываем имя задания, тип данных ввода/вывода и имена классов картографов и редукторов.
3. В приведенном ниже фрагменте кода мы устанавливаем входные и выходные каталоги, которые используются для использования входного набора данных и создания выходных данных соответственно.
аргумент [0] и аргумент [1] являются аргументами командной строки, передаваемыми с помощью команды, полученной в ходе практического применения MapReduce, т.е.
$HADOOP_HOME/bin/hadoop jar ProductSalePerCountry.jar/inputMapReduce/mapreduce_output_sales
4. Запустите нашу работу
Ниже кода начинается выполнение задания MapReduce:
try { // Run the job JobClient.runJob(job_conf); } catch (Exception e) { e.printStackTrace(); }