WordCount,第一个MapReduce程序

本文介绍了如何在Hadoop上运行WordCount MapReduce程序,该程序读取多本电子书,统计每个单词的出现次数,并展示运行过程与结果。用户首先准备输入数据,然后启动MapReduce任务,查看HDFS上的输出结果,最后通过Hadoop的网页接口监控任务状态。
摘要由CSDN通过智能技术生成

本文假设你已经安装并配置好了Hadoop。什么?如果你还不会的话,请看看这一篇文章《在Ubuntu Linux上安装Apache Hadoop》。我们将在Hadoop上运行我们的第一个MapReduce程序WordCount。该程序从txt文件中读取若干篇文章,计算每个单词出现的次数,最终以txt文件的形式输出计算结果。在计算结果中,我们可以看到每一行的开头是一个出现在文章中的单词,以及该单词在所有文章中出现的次数。如果你现在不知道什么是MapReduce,那也没有关系。本文的目的是通过运行WordCount,作为一个示例,演示如何运行MapReduce程序。至于什么是MapReduce,MapReduce的机制,如何编写MapReduce程序,将在以后讨论。


0.准备

我从Project Gutenberg上找了3本英文电子书,用作WordCount的输入,请选择Plain Text UTF-8格式下载:

The Outline of Science, Vol. 1 (of 4) by J. Arthur Thomson

The Notebooks of Leonardo Da Vinci

Ulysses by James Joyce

我将三本电子书存储在/tmp/gutenberg中,让我们通过ls命令来看一下:


如果你的Hadoop还没有进行格式化,或者没有启动,现在请格式化后启动。

/usr/local/hadoop/hadoop-1.2.1/bin/hadoop namenode -format
/usr/local/hadoop/hadoop-1.2.1/bin/start-all.sh
在我们运行MapReduce程序之前,我们首先需要将位于本地文件系统上的三本电子书复制到HDFS上。

cd /usr/local/hadoop/hadoop-1.2.1/
bin/hadoop dfs -copyFromLocal /tmp/gutenberg /user/hduser/gutenberg
bin/hadoop dfs -ls /user/hduser
bin/hadoop dfs -ls /user/hduser/gutenberg
上述命令的输出结果如下图所示:



1.启动MapReduce程序

完成上面的步骤之后,现在让我们运行WordCount。

cd /usr/local/hadoop/hadoop-1.2.1
bin/hadoop jar hadoop-examples-1.2.1.jar wordcount /user/hduser/gutenberg /user/hduser/gutenberg-output
这条命令将从HDFS中读取/user/hduser/gutenberg目录下的文件进行计算处理,并将结果存储到HDFS中的/user/hduser/gutenberg-output目录。

如果一切顺利,你将看到下图所示的结果:


现在,我们去HDFS中看看输出结果:

cd /usr/local/hadoop/hadoop-1.2.1 
/bin/hadoop dfs -ls /user/hduser
/user/hduser目录中有:


该目录中存放了我们的输入文件夹,文件夹中有3本电子书,和一个输出文件夹,用来存放计算结果。

/user/hduser/gutenberg-output目录中有:


该目录中存放了3个文件,计算结果在part-r-00000文件中。

如果你想修改Reduce的tasks,比如讲Reduce的tasks修改为16,可以输入以下命令:

cd /usr/local/hadoop/hadoop-1.2.1
bin/hadoop jar hadoop-examples-1.2.1.jar wordcount -D mapred.reduce.tasks=16 /user/hduser/gutenberg /user/hduser/gutenberg-output


2.从HDFS中取得你的计算结果

到目前为止,所有的输出结果只是在HDFS上,没有取回本地。但由于我们采用伪分布模式,所有在HDFS上的文件其实都在一台机器上。通过输入以下命令,可以直接在HDFS上读取计算结果:

cd /usr/local/hadoop/hadoop-1.2.1
bin/hadoop dfs -cat /user/hduser/gutenberg-output/part-r-00000
当然,你也可以选择从HDFS复制计算结果到本地:
cd /usr/local/hadoop/hadoop-1.2.1
mkdir /tmp/gutenberg-output
bin/hadoop dfs -getmerge /user/hduser/gutenberg-output /tmp/gutenberg-output
head /tmp/gutenberg-output/gutenberg-output
你可以看到下图所示的输出结果:

可以看到part-r-00000的前10行内容,第一列是3篇电子书中出现的单词,第二列是该单词出现的次数。这正是我们想要看到的结果。


3.Hadoop的网页接口

你在conf/hadoop-default.xml中可以看到Hadoop提供的网页接口:

NameNode http://localhost:50070/

JobTracker http://localhost:50030/

TaskTracker http://localhost:50060/


4.参考资料


Hadoop第一个WordCount程序是一个非常简单的程序,它的主要目的是计算一个文本文件中每个单词出现的次数。 以下是一个基本的WordCount程序: 1. 创建一个Java项目并导入Hadoop库。 2. 创建一个Java类并实现以下Mapper和Reducer: Mapper类: ```java import java.io.IOException; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; public class WordCountMapper extends Mapper<LongWritable, Text, Text, LongWritable> { private final static LongWritable one = new LongWritable(1); private Text word = new Text(); @Override public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); String[] words = line.split(" "); for (String w : words) { word.set(w); context.write(word, one); } } } ``` Reducer类: ```java import java.io.IOException; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; public class WordCountReducer extends Reducer<Text, LongWritable, Text, LongWritable> { @Override public void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException { long sum = 0; for (LongWritable val : values) { sum += val.get(); } context.write(key, new LongWritable(sum)); } } ``` 3. 在应用程序的main()方法中,创建一个Job并设置Mapper和Reducer类: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class WordCount { 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(WordCountMapper.class); job.setCombinerClass(WordCountReducer.class); job.setReducerClass(WordCountReducer.class); job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(LongWritable.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(LongWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } } ``` 4. 在命令行中运行程序,并指定输入和输出文件路径: ```bash hadoop jar WordCount.jar WordCount /input /output ``` 其中,/input是输入文件路径,/output是输出文件路径。 这是最基本的WordCount程序,你可以根据需要进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值