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