先决条件: Hadoop 和 MapReduce
完成以下任务所需的设置。
- Java安装
- Hadoop安装
我们的任务是计算输入文件中每个字符出现的频率。我们正在使用Java来实现这个特定场景。但是,MapReduce 程序也可以用Python或 C++ 编写。执行以下步骤完成查找每个字符出现的任务。
例子:
输入
GeeksforGeeks
输出
F 1
G 2
e 4
k 2
o 1
r 1
s 2
步骤 1:首先打开Eclipse -> 然后选择File -> New -> Java Project -> Name it CharCount -> 然后选择use an execution environment -> 选择JavaSE-1.8然后next -> Finish 。
第 2 步:在项目中创建三个Java类。将它们命名为CharCountDriver (具有主要函数)、 CharCountMapper 、 CharCountReducer。
Mapper 代码:您必须将此程序复制并粘贴到CharCountMapper Java类文件中。
Java
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.MapReduceBase;
import org.apache.hadoop.mapred.Mapper;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reporter;
public class CharCountMapper extends MapReduceBase implements Mapper{
public void map(LongWritable key, Text value,OutputCollector output,
Reporter reporter) throws IOException{
String line = value.toString();
String tokenizer[] = line.split("");
for(String SingleChar : tokenizer)
{
Text charKey = new Text(SingleChar);
IntWritable One = new IntWritable(1);
output.collect(charKey, One);
}
}
}
Java
import java.io.IOException;
import java.util.Iterator;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reducer;
import org.apache.hadoop.mapred.Reporter;
public class CharCountReducer extends MapReduceBase
implements Reducer {
public void
reduce(Text key, Iterator values,
OutputCollector output,
Reporter reporter) throws IOException
{
int sum = 0;
while (values.hasNext()) {
sum += values.next().get();
}
output.collect(key, new IntWritable(sum));
}
}
Java
import java.io.IOException;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.TextInputFormat;
import org.apache.hadoop.mapred.TextOutputFormat;
public class CharCountDriver {
public static void main(String[] args)
throws IOException
{
JobConf conf = new JobConf(CharCountDriver.class);
conf.setJobName("CharCount");
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);
conf.setMapperClass(CharCountMapper.class);
conf.setCombinerClass(CharCountReducer.class);
conf.setReducerClass(CharCountReducer.class);
conf.setInputFormat(TextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);
FileInputFormat.setInputPaths(conf,
new Path(args[0]));
FileOutputFormat.setOutputPath(conf,
new Path(args[1]));
JobClient.runJob(conf);
}
}
Reducer 代码:您必须将以下程序复制粘贴到CharCountReducer Java类文件中。
Java
import java.io.IOException;
import java.util.Iterator;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reducer;
import org.apache.hadoop.mapred.Reporter;
public class CharCountReducer extends MapReduceBase
implements Reducer {
public void
reduce(Text key, Iterator values,
OutputCollector output,
Reporter reporter) throws IOException
{
int sum = 0;
while (values.hasNext()) {
sum += values.next().get();
}
output.collect(key, new IntWritable(sum));
}
}
驱动程序代码:您必须将以下程序复制粘贴到CharCountDriver Java类文件中。
Java
import java.io.IOException;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.TextInputFormat;
import org.apache.hadoop.mapred.TextOutputFormat;
public class CharCountDriver {
public static void main(String[] args)
throws IOException
{
JobConf conf = new JobConf(CharCountDriver.class);
conf.setJobName("CharCount");
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);
conf.setMapperClass(CharCountMapper.class);
conf.setCombinerClass(CharCountReducer.class);
conf.setReducerClass(CharCountReducer.class);
conf.setInputFormat(TextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);
FileInputFormat.setInputPaths(conf,
new Path(args[0]));
FileOutputFormat.setOutputPath(conf,
new Path(args[1]));
JobClient.runJob(conf);
}
}
第 3 步:现在我们需要为我们导入的包添加一个外部 jar。根据你的Hadoop版本下载Hadoop Common和Hadoop MapReduce Core的jar包。您可以使用以下命令检查 Hadoop 版本:
hadoop version
第 4 步:现在我们将这些外部 jar 添加到我们的CharCount项目中。右键单击CharCount -> 然后选择Build Path -> 单击Configure Build Path并选择Add External jars …。并从它的下载位置添加 jars 然后单击 -> Apply and Close 。
第 5 步:现在将项目导出为 jar 文件。右键单击CharCount选择Export .. 并转到Java -> JAR 文件单击 -> Next并选择您的导出目的地,然后单击 -> Next 。通过单击 -> Browse选择 Main Class 作为CharCount ,然后单击 -> Finish -> Ok 。
现在 Jar 文件已成功创建并保存在/ Documents目录中,在我的例子中名为charectercount.jar 。
第 6 步:创建一个简单的文本文件并向其中添加一些数据。
nano test.txt
您还可以手动或使用其他编辑器(如 Vim 或 gedit)向文件中添加文本。
要查看文件的内容,请使用 Linux 中可用的cat命令。
cat test.txt
第 7 步:启动我们的 Hadoop 守护进程
start-dfs.sh
start-yarn.sh
第 8 步:将您的 test.txt 文件移动到 Hadoop HDFS。
句法:
hdfs dfs -put /file_path /destination
在下面的命令中 / 显示了我们 HDFS 的根目录。
hdfs dfs -put /home/dikshant/Documents/test.txt /
检查文件是否存在于 HDFS 的根目录中。
hdfs dfs -ls /
第 9 步:现在使用以下命令运行 Jar 文件并在CharCountResult文件中生成输出。
句法:
hadoop jar /jar_file_location /dataset_location_in_HDFS /output-file_name
命令:
hadoop jar /home/dikshant/Documents/charectercount.jar /test.txt /CharCountResult
第 10 步:现在移至localhost:50070/ ,在实用程序下选择 Browse the file system 并在/CharCountResult目录中下载part-r-00000以查看结果。我们还可以使用cat命令检查结果,即part-r-00000文件,如下所示。
hdfs dfs -cat /CharCountResult/part-00000