**调用MapReduce对文件中各个单词出现的次数进行统计**
Posted 金豈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了**调用MapReduce对文件中各个单词出现的次数进行统计**相关的知识,希望对你有一定的参考价值。
把本地文件系统的“/home/hadoop/ljk.txt”上传到HDFS中的当前用户目录的input目录下,也就是上传到HDFS的“/user/hadoop/input/”目录下:
-
./bin/hdfs dfs -put /home/hadoop/ljk.txt input
可以使用ls命令查看一下文件是否成功上传到HDFS中,具体如下:
-
./bin/hdfs dfs –ls input
首先,启动Eclipse
直接采用默认的设置“/home/hadoop/workspace”,工作空间目录位于hadoop用户目录“/home/hadoop”下。
Eclipse启动以后,呈现的界面如下图所示。
创建一个Java工程。
在“Project name”后面输入工程名称“WordCount”,选中“Use default location”,让这个Java工程的所有文件都保存在“/home/hadoop/workspace/WordCount”目录下。
进入下一步
需要在这个界面中加载该Java工程所需要用到的JAR包,这些JAR包中包含了与Hadoop相关的Java API。这些JAR包都位于Linux系统的Hadoop安装目录下,就是在“/usr/local/hadoop/share/hadoop”目录下。点击界面中的“Libraries”选项卡,然后,点击界面右侧的“Add External JARs…”按钮,弹出如下图所示界面。
为了编写一个MapReduce程序,一般需要向Java工程中添加以下JAR包:
(1)“/usr/local/hadoop/share/hadoop/common”目录下的hadoop-common-2.7.1.jar和haoop-nfs-2.7.1.jar;
(2)“/usr/local/hadoop/share/hadoop/common/lib”目录下的所有JAR包;
(3)“/usr/local/hadoop/share/hadoop/mapreduce”目录下的所有JAR包,但是,不包括lib、lib-examples和sources目录,具体如下图所示。
(4)“/usr/local/hadoop/share/hadoop/mapreduce/lib”目录下的所有JAR包。
比如,如果要把“/usr/local/hadoop/share/hadoop/common”目录下的hadoop-common-2.7.1.jar和haoop-nfs-2.7.1.jar添加到当前的Java工程中,可以在界面中点击相应的目录按钮,进入到common目录,然后,界面会显示出common目录下的所有内容(如下图所示)。
最后把所需的jar导入,按下finish
找到开始创建好的工程名称“WordCount”,然后在该工程名称上点击鼠标右键,在弹出的菜单中选择“New–>Class”菜单。
在该文件中输入完整的词频统计程序代码:
-
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 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);
-
-
-
-
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);
-
-
-
在弹出的菜单中选择“Run as”,继续在弹出来的菜单中选择“Java Application”。
然后,会弹出如下图所示界面。
点击界面右下角的“OK”按钮,开始运行程序。程序运行结束后,会在底部的“Console”面板中显示运行结果信息。
下面就可以把Java应用程序打包生成JAR包,部署到Hadoop平台上运行。现在可以把词频统计程序放在“/usr/local/hadoop/myapp”目录下。如果该目录不存在,可以使用如下命令创建:
首先,请在Eclipse工作界面左侧的“Package Explorer”面板中,在工程名称“WordCount”上点击鼠标右键,在弹出的菜单中选择“Export”,如下图所示。
然后,会弹出如下图所示界面。
在该界面中,选择“Runnable JAR file”,然后,点击“Next>”按钮,弹出如下图所示界面。
点击finish后全点ok
可以看到,“/usr/local/hadoop/myapp”目录下已经存在一个WordCount.jar文件。
在运行程序之前,需要启动Hadoop,命令如下:
在启动Hadoop之后,需要首先删除HDFS中与当前Linux用户hadoop对应的input和output目录(即HDFS中的“/user/hadoop/input”和“/user/hadoop/output”目录),这样确保后面程序运行不会出现问题,具体命令如下:
然后,再在HDFS中新建与当前Linux用户hadoop对应的input目录,即“/user/hadoop/input”目录,具体命令如下:
然后把ljk.txt,上传到HDFS中的“/user/hadoop/input”目录下,命令如下:
如果HDFS中已经存在目录“/user/hadoop/output”,则使用如下命令删除该目录(因为我没创建过output所以不需要删除,此处为资料密令):
-
cd /usr/local/hadoop
-
./bin/hdfs dfs -rm -r /user/hadoop/output
现在,就可以在Linux系统中,使用hadoop jar命令运行程序,命令如下:
上面命令执行以后,当运行顺利结束时,屏幕上会显示类似如下的信息:
词频统计结果已经被写入了HDFS的“/user/hadoop/output”目录中,可以执行如下命令查看词频统计结果:
上面命令执行后,会在屏幕上显示如下词频统计结果:
把统计结果下载保存到output文件夹
感谢您能看到这里,日后也会更新更多这方面的知识;博主也会更深入去学习,日后能更好地和大家进行交流哦!
以上是关于**调用MapReduce对文件中各个单词出现的次数进行统计**的主要内容,如果未能解决你的问题,请参考以下文章