📜  如何在 MapReduce Hadoop 中执行字符计数程序?

📅  最后修改于: 2021-10-27 06:52:28             🧑  作者: Mango

先决条件: Hadoop 和 MapReduce

完成以下任务所需的设置。

  1. Java安装
  2. 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 (具有主要函数)、 CharCountMapperCharCountReducer。

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