大数据词频统计作业

一、 需求描述
Hadoop综合大作业 要求:
1.将待分析的文件(不少于10000英文单词)上传到HDFS。
2.调用MapReduce对文件中各个单词出现的次数进行统计。
3.将统计结果下载本地。
4.写一篇博客描述你的分析过程和分析结果。
本次大作业,我们需要实现的是调用MapReduce对文件中各个单词出现的次数进行统计。要求在Linux系统中实现上述操作。首先要安装Ubuntu系统,然后要配置Java环境,安装JDK。Ubuntu提供了一个健壮,功能丰富的计算环境。

二、环境介绍
jdk-8u301-linux-x64
大数据词频统计作业

hadoop-3.2.2
大数据词频统计作业

eclipse-4.7.0-linux.gtk.x86_64
大数据词频统计作业

三、数据来源及数据上传
The Old Curiosity Shop(老古董店英语版)txt下载-电子书下载-拉米阅读 (lmeee.com)
四、数据上传结果查看
1、首先启动hdfs
大数据词频统计作业

2、将桌面的lasttest.txt上传到hdfs
大数据词频统计作业

大数据词频统计作业
大数据词频统计作业

五、数据处理过程的描述

  1. 在Eclipse中创建项目
    在“Project name”后面输入工程名称“WordCount”,选中“Use default location”,让这个Java工程的所有文件都保存到“/home/hadoop/workspace/WordCount”目录下。在“JRE”这个选项卡中,可以选择当前的Linux系统中已经安装好的JDK,比如jdk1.8.0_162。然后,点击界面底部的“Next>”按钮,进入下一步的设置。
    大数据词频统计作业

  2. 为项目添加需要用到的JAR包
    需要在这个界面中加载该Java工程所需要用到的JAR包,这些JAR包中包含了与Hadoop相关的Java API。这些JAR包都位于Linux系统的Hadoop安装目录下,对于本教程而言,就是在“/usr/local/hadoop/share/hadoop”目录下。点击界面中的“Libraries”选项卡,然后,点击界面右侧的“Add External JARs…”
    大数据词频统计作业

  3. 编写Java应用程序
    创建类
    大数据词频统计作业

在该界面中,只需要在“Name”后面输入新建的Java类文件的名称,这里采用名称“WordCount”,其他都可以采用默认设置,然后,点击界面右下角“Finish”按钮
大数据词频统计作业

可以看出,Eclipse自动创建了一个名为“WordCount.java”的源代码文件,并且包含了代码“public class WordCount{}”,请清空该文件里面的代码,然后在该文件中输入完整的词频统计程序代码,具体如下:
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 […] ");
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 values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
int sum = 0;
IntWritable val;
for(Iterator i$ = values.iterator(); iKaTeX parse error: Expected '}', got 'EOF' at end of input: … (IntWritable)i.next();
}
this.result.set(sum);
context.write(key, this.result);
}
}
}
4. 编译打包程序
现在就可以编译上面编写的代码。可以直接点击Eclipse工作界面上部的运行程序的快捷按钮,当把鼠标移动到该按钮上时,在弹出的菜单中选择“Run as”,继续在弹出来的菜单中选择“Java Application”
点击界面右下角的“OK”按钮,开始运行程序。程序运行结束后,会在底部的“Console”面板中显示运行结果信息
大数据词频统计作业

下面就可以把Java应用程序打包生成JAR包,部署到Hadoop平台上运行。现在可以把词频统计程序放在“/usr/local/hadoop/myapp”目录下。如果该目录不存在,可以使用如下命令创建:
cd /usr/local/hadoop
mkdir myapp
大数据词频统计作业

请在Eclipse工作界面左侧的“Package Explorer”面板中,在工程名称“WordCount”上点击鼠标右键,在弹出的菜单中选择“Export”

大数据词频统计作业
大数据词频统计作业

在该界面中,“Launch configuration”用于设置生成的JAR包被部署启动时运行的主类,需要在下拉列表中选择刚才配置的类“WordCount-WordCount”。在“Export destination”中需要设置JAR包要输出保存到哪个目录,比如,这里设置为“/usr/local/hadoop/myapp/WordCount.jar”。在“Library handling”下面选择“Extract required libraries into generated JAR”。
大数据词频统计作业

可以看到,“/usr/local/hadoop/myapp”目录下已经存在一个WordCount.jar文件。
大数据词频统计作业

5. 运行程序
现在,就可以在Linux系统中,使用hadoop jar命令运行程序
大数据词频统计作业
大数据词频统计作业

将结果保存到output文件夹中
六、处理结果的下载及命令行展示
抓取output里的统计数据:
大数据词频统计作业
大数据词频统计作业

将数据下载到桌面:
大数据词频统计作业
大数据词频统计作业
大数据词频统计作业

七、经验总结
对于Mpareduce的个人理解,就是输入的文件被切片Split,通过RecordRead根据InputSplit中的信息来处理InputSqlit中的具体信息,将其转换为合适的Map任务读取的键值对,输入给Map任务。数据被map处理结束后交给OutputCollector收集器。在collect中,会先对其进行分区处理,默认使用Hash分区(分区的作用就是根据key或value及reduce的数量来决定当前的这对输出数据最终应该交由哪个reduce task处理),然后写入内存缓冲区buffer(缓冲区的作用是批量收集map结果,减少磁盘IO的影响), 每个MapTask都有一个内存缓冲区, 收集map处理结果。当map task的输出结果很多时,就可能会撑爆内存,所以需要在一定条件下将缓冲区中的数据临时写入磁盘,然后重新利用这块缓冲区。这个从内存往磁盘写数据的过程被称为Spill,译为溢写(这个溢写是由单独线程来完成,不影响往缓冲区写map结果的线程)。当溢写线程启动后,需要对这80MB空间(整个缓冲区有个溢写的比例, 这个比例默认是0.8,也就是当缓冲区的数据已经达到阈值(buffer size * spill percent = 100MB * 0.8 = 80MB),溢写线程启动,锁定这80MB的内存,执行溢写过程。Map task的输出结果还可以往剩下的20MB内存中写,互不影响)内的key做排序(Sort)。排序是MapReduce模型默认的行为,这里的排序也是对序列化的字节做的排序。在内存缓冲区中进行排序, 规约, 当整个MapTask任务结束后, 合并这些磁盘中的临时文件, 生成最终的输出文件, 等待reduceTask拉取

上一篇:调用MapReduce进行词频统计


下一篇:一个Java程序员应该掌握的10项技能