В этом руководстве вы научитесь использовать Hadoop с примерами MapReduce. Используемые входные данные: SalesJan2009.csv. Он содержит информацию, связанную с продажами, такую как название продукта, цена, способ оплаты, город, страна клиента и т. Д. Цель состоит в том, чтобы узнать количество продуктов, проданных в каждой стране.
В этом руководстве вы узнаете:
- Первая программа Hadoop MapReduce
- Объяснение класса SalesMapper
- Объяснение класса SalesCountryReducer
- Объяснение класса SalesCountryDriver
Первая программа Hadoop MapReduce
Теперь в этом руководстве по MapReduce мы создадим нашу первую программу Java MapReduce:
Убедитесь, что у вас установлен 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,OutputCollectoroutput,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, являются типом данных входной пары " ключ-значение" для редуктора.
Вывод картографа имеет вид
Последние два типа данных, Text и IntWritable, представляют собой выходные данные, генерируемые редуктором в виде пары ключ-значение.
Каждый класс редуктора должен быть расширен от класса MapReduceBase и должен реализовывать интерфейс Reducer .
2. Определение функции «уменьшить» -
public void reduce( Text t_key,Iteratorvalues,OutputCollector output,Reporter reporter) throws IOException {
Входными данными для метода reduce () является ключ со списком из нескольких значений.
Например, в нашем случае это будет-
<Объединенные Арабские Эмираты, 1>, <Объединенные Арабские Эмираты, 1>, <Объединенные Арабские Эмираты, 1>, <Объединенные Арабские Эмираты, 1>, <Объединенные Арабские Эмираты, 1>, <Объединенные Арабские Эмираты, 1>.
Редуктору передается как <Объединенные Арабские Эмираты, {1,1,1,1,1,1}>
Итак, чтобы принимать аргументы этой формы, используются первые два типа данных, а именно: Text и 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();}