Hadoop MapReduce字数统计程序
时间:2020-01-09 10:34:32 来源:igfitidea点击:
在系统上安装Hadoop并完成初始验证后,我们将希望编写第一个MapReduce程序。在深入探究MapReduce编程的复杂性之前,第一步是Hadoop中的字数统计MapReduce程序,它也被称为Hadoop框架的" Hello World"。
因此,这是一个简单的用Java编写的Hadoop MapReduce字数统计程序,可开始进行MapReduce编程。
你需要什么
- 如果我们有像Eclipse这样的IDE来编写Java代码,那将是很好的。
- 文本文件,即输入文件。应该将其复制到HDFS。这是Map任务将处理的文件,并产生(键,值)对。该Map任务输出将成为Reduce任务的输入。
处理
这些是在Hadoop中执行Word count MapReduce程序所需的步骤。
- 通过执行start-dfs和start-yarn脚本来启动守护程序。
- 在HDFS中创建一个输入目录,我们将在其中保留文本文件。
bin/hdfs dfs -mkdir /user bin/hdfs dfs -mkdir /user/input
- 将我们创建的文本文件复制到/ usr / input目录。
bin/hdfs dfs -put /home/theitroad/Documents/theitroad/Hadoop/count /user/input
我创建了一个名为count的文本文件,其内容如下
This is a test file. This is a test file.
如果要验证文件是否已复制,可以运行以下命令-
bin/hdfs dfs -ls /user/input Found 1 items -rw-r--r-- 1 theitroad supergroup 42 2017-12-22 18:12 /user/input/count
字数统计MapReduce Java代码
import java.io.IOException; 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 { // Map function public static class WordMapper 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 { // Splitting the line on spaces String[] stringArr = value.toString().split("\s+"); for (String str : stringArr) { word.set(str); context.write(word, one); } } } // Reduce function public static class CountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{ private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable 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(); Job job = Job.getInstance(conf, "word count"); job.setJarByClass(WordCount.class); job.setMapperClass(WordMapper.class); job.setReducerClass(CountReducer.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); } }
我们至少需要给定的jar来编译MapReduce代码,我们将在Hadoop安装的share目录中找到它们。
运行字数统计MapReduce程序
成功编译代码后,创建一个jar。如果我们使用的是eclipse IDE,则可以通过右键单击项目–导出– Java(Jar File)来使用它创建jar。
创建jar之后,我们需要运行以下命令来执行MapReduce代码。
bin/hadoop jar /home/theitroad/Documents/theitroad/Hadoop/wordcount.jar org.theitroad.WordCount /user/input /user/output
在上面的命令中
/home/theitroad/Documents/theitroad/Hadoop/wordcount.jar是jar的路径。
org.theitroad.WordCount是我们需要运行的Java类的标准名称。
/ user / input是输入文件的路径。
/ user / output是输出路径
在java程序的main方法中,有这两行–
FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1]));
在此将设置输入和输出目录。
要详细了解MapReduce程序的字数解释,请查看此文章MapReduce如何在Hadoop中工作
执行后,我们可以检查输出目录中的输出。
bin/hdfs dfs -ls /user/output Found 2 items -rw-r--r-- 1 theitroad supergroup 0 2017-12-22 18:15 /user/output/_SUCCESS -rw-r--r-- 1 theitroad supergroup 31 2017-12-22 18:15 /user/output/part-r-00000
可以通过列出创建的输出文件的内容来验证输出。
bin/hdfs dfs -cat /user/output/part-r-00000
This 2 a 2 file. 2 is 2 test 2