📬📬Я маленький новичок, специализирующийся на разработке программного обеспечения в Шэньянском технологическом университете. Мне нравится программировать и продолжать выдавать полезную информацию.
MapReduce — это модель параллельного программирования для обработки крупномасштабных наборов данных. Благодаря своей эффективности и масштабируемости MapReduce стала предпочтительным решением для многих крупных интернет-компаний для обработки больших данных. В этой статье мы подробно рассмотрим MapReduce и напишем простую программу MapReduce с использованием Java.
MapReduce состоит из двух основных этапов: Map и Reduce. В Этап В картах набор данных разделен на несколько небольших блоков, и каждый небольшой блок обрабатывается Mapfunction и выводит серию пар ключ-значение. В Уменьшить На этапе пары ключ-значение объединяются в меньший набор результатов. Ниже мы подробно объясним принципы каждого этапа.
Этап Входными данными для карты является исходный набор данных. Он делит входные данные на несколько небольших частей, и каждая маленькая часть обрабатывается Mapфункцией. Входные данные функции Mapfunction представляют собой пару ключ-значение, а выходные данные также являются парой ключ-значение. В Mapfunction каждая входная пара ключ-значение обрабатывается для создания набора промежуточных пар ключ-значение, которые будут использоваться как Уменьшить. фазовый ввод.
Уменьшить Входные данные для фазы: Этап. карты Выходной набор промежуточных пар ключ-значение。Reduceфункция Выполните операцию агрегирования для каждого ключа,и выведите результаты в окончательный набор результатов. Результатом функции уменьшения обычно является одна пара ключ-значение.,Но это также может быть несколько пар ключ-значение.
Этап перемешиваниясуществоватьMapи Уменьшить Выполняется между фазами. В Этап В картах каждая задача Map генерирует набор промежуточных пар ключ-значение. В Этап перемешиваниясередина,Эти промежуточные пары ключ-значение будут отсортированы и сгруппированы по ключу.,Чтобы задачи сокращения могли параллельно обрабатывать промежуточные результаты с одинаковыми ключами.
Ниже мы напишем простую программу MapReduce, используя Java. Эта программа будет подсчитывать вхождения каждого слова во входном тексте.
Сначала нам нужно написать функцию Map. Функция Map сопоставляет каждое слово во входном тексте с парой ключ-значение, где ключом является само слово, а значение равно 1. Ниже приведен код функции Map:
public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
context.write(word, one);
}
}
}
Далее мы пишем функцию уменьшения. Функция уменьшения добавляет значения с одним и тем же ключом и выводит результат в виде пары ключ-значение. Ниже приведен код функции уменьшения:
javaCopy codepublic static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable value : values) {
sum += value.get();
}
context.write(key, new IntWritable(sum));
Наконец, мы объединяем функцию Map и функцию уменьшения и передаем их в кластер Hadoop как часть программы MapReduce. Ниже приведена полная программа MapReduce:
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class WordCount {
public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
context.write(word, one);
}
}
}
public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable value : values) {
sum += value.get();
}
context.write(key, new IntWritable(sum));
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "wordcount");
job.setJarByClass(WordCount.class);
job.setMapperClass(Map.class);
job.setCombinerClass(Reduce.class);
job.setReducerClass(Reduce.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
В приведенном выше коде мы сначала определяем класс Map и класс Редукция, затем объединяем их в основной функции и используем класс Job для отправки программы в кластер Hadoop для обработки. Мы указываем пути ввода и вывода с помощью FileInputFormat и FileOutputFormat.
В этой статье представлен принцип MapReduceииспользоватьJavaписатьMapReduceпрограммаметод。MapReduceЭто мощная модель параллельного программирования.,Может использоваться для обработки крупномасштабных наборов данных. Если вы имеете дело с большими наборами данных,Тогда MapReduce может быть вашим первым выбором.