调用MapReduce对文件中各个单词出现的次数进行统计

要求:

1.将待分析的文件(不少于10000英文单词)上传到HDFS。

2.调用MapReduce对文件中各个单词出现的次数进行统计。

3.将统计结果下载本地。

作业分析:

我们需要实现的是调用MapReduce对文件中各个单词出现的次数进行统计。要求在Linux系统中实现上述操作。首先要安装Ubuntu系统,然后要配置Java环境,安装JDK。Ubuntu提供了一个健壮,功能丰富的计算环境。

简述操作步骤:

1、在eclipse中创建项目

2、导入所需要的jar包

3、创建JAVA文件,并允许,检测功能

4、建立myapp目录,导出jar文件到这个目录下

5、建立wordcout工程,并导入所需的jar包

6、创建JAVA文件,运行,并导出包到myapp目录下

7、启动Hadoop,首先删除HDFS中与当前Linux用户hadoop对应的input和output目录

8、新建input目录,并把需要分析的文件传到该目录下

9、使用hadoop jar命令运行程序,查看分析结果

10、最后,.将统计结果下载至本地

详细步骤:

一:首先在eclipse中创建文件,开始创建一个JAVA工程,单机“NEXt”

 二:如图导入工程所需要的JAR包,把剩余的其他JAR包都添加进来。需要注意的是,当需要选中某个目录下的所有JAR包时,可以使用“Ctrl+A”组合键进行全选操作。全部添加完毕以后,就可以点击界面右下角的“Finish”按钮,完成Java工程HDFSExample的创建。

1、在新建好的工程中,右键选择new->Class,如图创建名为“HDFSFileIfExist”的源代码文件

 2、在新建的源代码中,输入图上代码并运行

 代码如下:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class HDFSFileIfExist {undefined
public static void main(String[] args){undefined
try{undefined
String fileName = “test”;
Configuration conf = new Configuration();
conf.set(“fs.defaultFS”, “hdfs://localhost:9000”);
conf.set(“fs.hdfs.impl”, “org.apache.hadoop.hdfs.DistributedFileSystem”);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(new Path(fileName))){undefined
System.out.println(“文件存在”);
}else{undefined
System.out.println(“文件不存在”);
}

运行后结果为:

 

3、在Hadoop安装目录下,新建一个myapp文件夹,用来存放自己编写的Hadoop程序

如下图:

在这里插入图片描述

4、选择相对应的路径

在这里插入图片描述 在终端中查看命令,并运行导出的文件,是否为“文件不存在”

 

 三、通过Eclipse运行MapReduce

1、MapReduce安装配置过程,参考林子雨安装具体步骤:http://dblab.xmu.edu.cn/blog/hadoop-build-project-using-eclipse/

 

 

 

 

 2、新建Wordcout工程,跟上面创建HDFSFileIfExist工程一样,导入所需要的JAR包,并复制一下代码运行程序

 代码如下:

package org.apache.hadoop.examples;
 
import java.io.IOException;
import java.util.Iterator;
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 WordCount {
    public WordCount() {
    }
 
    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: wordcount <in> [<in>...] <out>");
            System.exit(2);
        }
 
        Job job = Job.getInstance(conf, "word count");
        job.setJarByClass(WordCount.class);
        job.setMapperClass(WordCount.TokenizerMapper.class);
        job.setCombinerClass(WordCount.IntSumReducer.class);
        job.setReducerClass(WordCount.IntSumReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
 
        for(int i = 0; i < otherArgs.length - 1; ++i) {
            FileInputFormat.addInputPath(job, new Path(otherArgs[i]));
        }
 
        FileOutputFormat.setOutputPath(job, new Path(otherArgs[otherArgs.length - 1]));
        System.exit(job.waitForCompletion(true)?0:1);
    }
 
    public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
        private IntWritable result = new IntWritable();
 
        public IntSumReducer() {
        }
 
        public void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
            int sum = 0;
 
            IntWritable val;
            for(Iterator i$ = values.iterator(); i$.hasNext(); sum += val.get()) {
                val = (IntWritable)i$.next();
            }
 
            this.result.set(sum);
            context.write(key, this.result);
        }
    }
 
    public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
        private static final IntWritable one = new IntWritable(1);
        private Text word = new Text();
 
        public TokenizerMapper() {
        }
 
        public void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
            StringTokenizer itr = new StringTokenizer(value.toString());
 
            while(itr.hasMoreTokens()) {
                this.word.set(itr.nextToken());
                context.write(this.word, one);
            }
 
        }
    }
}

3、运行后在左侧DFS任务栏中刷新,会出现input与output文件夹

4、导出wordcout工程到myapp目录中

 

 四:配置好相关的文件后,开始在终端进行操作,提前准备好需要检测的文件(1W个英语单词文本,可以在相关英文论文爬下来,拉进后放在/usr/local/hadoop中)

1、进入hadoop安装目录,并启动hadoop,进入myapp文件夹,使用ls命令查看文件内容

 2、首先删除HDFS中与当前Linux用户hadoop对应的input和output目录(即HDFS中的“/user/hadoop/input”和“/user/hadoop/output”目录

 说明:因为之前运行过wordcout程序,所以已经生成了Input 与output,所以需要删除重新生成才能运行,否则会报错。使用mkdir 命令创建新的Input文件夹

3、通过-put命令,把需要检测的文件夹放入input中

 4、使用hadoop jar命令运行程序,命令如下
cd /usr/local/hadoop
./bin/hadoop jar ./myapp/WordCount.jar input output

得到下图:

 5、使用-cat命令,查看output文件内容,查看词频统计结果

 6、最后,.将统计结果下载至本地,如下图

 

 

 调用MapReduce对文件中各个单词出现次数进行统计的实验到这里就结束了,在实验过程中,有warning警告可以忽略,但是要注意output中是否存在文件在执行命令,不然会有报错的可能性。

 

 

 

 

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>