Введение
В древних руинах погибшей цивилизации группа современных исследователей случайно обнаружила скрытый храм, посвященный богу знаний и мудрости. Стены храма были украшены сложными иероглифами, содержащими секреты передовой системы обработки данных, использованной древними священнослужителями.
Один из исследователей, опытный инженер Hadoop, принял роль Высокого священника, расшифровывая иероглифы и раскрывая тайны храма. Задача заключалась в реконструкции древней системы обработки данных, используя мощь распределенного кеша Hadoop для эффективной обработки больших наборов данных, так же, как это делали древние священнослужители несколько веков назад.
Подготовьте набор данных и код
В этом шаге мы настроим необходимые файлы и код для имитации древней системы обработки данных.
Сначала смените пользователя на hadoop, а затем перейдите в домашнюю директорию пользователя hadoop:
su - hadoop
Создайте новую директорию с именем distributed-cache-lab и перейдите в нее:
mkdir distributed-cache-lab
cd distributed-cache-lab
Далее создайте текстовый файл с именем ancient-texts.txt с таким содержанием:
Мудрость веков вечна.
Знание - путь к просветлению.
Принимайте тайны вселенной.
Этот файл будет представлять древние тексты, которые мы хотим обработать.
Теперь создайте Java-файл с именем AncientTextAnalyzer.java с таким кодом:
import java.io.BufferedReader;
import java.io.FileReader;
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.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;
import org.apache.hadoop.util.GenericOptionsParser;
public class AncientTextAnalyzer {
public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}
public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length!= 2) {
System.err.println("Usage: AncientTextAnalyzer <in> <out>");
System.exit(2);
}
Job job = Job.getInstance(conf, "Ancient Text Analyzer");
job.setJarByClass(AncientTextAnalyzer.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
System.exit(job.waitForCompletion(true)? 0 : 1);
}
}
Этот код представляет собой простую программу MapReduce, которая подсчитывает количество вхождений каждого слова в входной файл. Мы будем использовать этот код для демонстрации использования распределенного кеша в Hadoop.
Компилируйте и упакуйте код
В этом шаге мы скомпилируем Java-код и создадим JAR-файл для развертывания.
Сначала убедитесь, что в вашем classpath есть Hadoop core JAR-файл. Вы можете скачать его с веб-сайта Apache Hadoop или использовать тот, который предоставлен в вашей установке Hadoop.
Скомпилируйте файл AncientTextAnalyzer.java:
javac -source 8 -target 8 -classpath "/home/hadoop/hadoop/share/hadoop/common/hadoop-common-3.3.6.jar:/home/hadoop/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:/home/hadoop/hadoop/share/hadoop/common/lib/*" AncientTextAnalyzer.java
Теперь создайте JAR-файл с скомпилированными классовыми файлами:
jar -cvf ancient-text-analyzer.jar AncientTextAnalyzer*.class
Запустите задачу MapReduce с использованием распределенного кеша
В этом шаге мы запустим MapReduce-задание и воспользуемся распределенным кешем, чтобы предоставить входной файл для всех узлов в кластере.
Сначала скопируйте входной файл ancient-texts.txt в Hadoop Distributed File System (HDFS):
hadoop fs -mkdir /input
hadoop fs -put ancient-texts.txt /input/ancient-texts.txt
Далее запустите MapReduce-задание с параметром распределенного кеша:
hadoop jar ancient-text-analyzer.jar AncientTextAnalyzer -files ancient-texts.txt /input/ancient-texts.txt /output
Эта команда запустит MapReduce-задание AncientTextAnalyzer, используя параметр -files для распределения файла ancient-texts.txt по всем узлам в кластере. Входной путь - /input/ancient-texts.txt, а выходной путь - /output.
После завершения задания вы можете проверить выходные данные:
hadoop fs -cat /output/part-r-00000
Вы должны увидеть вывод подсчета слов, похожий на:
Embrace 1
Knowledge 1
The 1
ages 1
enlightenment. 1
eternal. 1
is 2
mysteries 1
of 2
path 1
the 4
to 1
universe. 1
wisdom 1
Резюме
В этом лабаратории мы исследовали мощь функции распределенного кеша Hadoop, реализовав систему анализа древних текстов. Используя распределенный кеш, мы смогли эффективно распределить входной файл по всем узлам кластера, что позволило проводить параллельную обработку и уменьшить накладные расходы на передачу данных по сети.
Благодаря этому практическому опыту, я получил более глубокое понимание того, как распределенный кеш Hadoop может оптимизировать обработку данных в распределенных вычислительных средах. Кеширование часто используемых данных по всему кластеру позволяет значительно повысить производительность и уменьшить трафик сети, особенно при работе с большими наборами данных или сложными вычислениями.
此外,эта лабораторная работа дала мне практический опыт работы с Hadoop MapReduce, Java-программированием и выполнением заданий на кластере Hadoop. Комбинация теоретических знаний и практического опыта повысила мой навык в обработке больших данных и подготовила меня к более сложным задачам, связанным с Hadoop.



