使用MapReduce进行词频统计


因为在虚拟机上调试程序不如Windows方便,因此我们先在Windows上调试好后再移植到linux上。

配置Windows下的Maven和Hadoop环境

  1. 下载apache-maven-3.6.3-bin.tar.gz

  2. 配置maven的windows环境变量。
    在我的电脑图标单击右键,打开属性,选择左侧的高级系统设置。打开环境变量一栏,在用户变量Path变量中添加%MAVEN_HOME%\bin%HADOOP_HOME%\bin系统变量中新建变量名MAVEN_HOMEHADOOP_HOME,变量值D:\Linux\apache-maven-3.6.3\D:\Linux\Windows\hadoop-2.8.5(即解压路径)。
    在这里插入图片描述

  3. 配置setting.xml文件。打开.\apache-maven-3.6.3\conf\setting.xml,在图示位置添加<localRepository>d:\Linux\MavenRepo\</localRepository>。这个路径表示本地仓库,由用户自己设置。
    在这里插入图片描述

  4. 启动Eclipse,打开preference选项。
    在这里插入图片描述
    找到Maven的配置项目,在User Setting中上传刚才配置好的setting.xml文件,点击更新设置,应用并保存。
    在这里插入图片描述

  5. 修改Hadoop配置文件。打开准备在Windows上运行的Hadoop的文件:hadoop-2.8.5\etc\hadoop\hadoop-env.cmd,将对应语句改为set JAVA_HOME=D:\JAVA\jdk1.8.0_202
    在这里插入图片描述

  6. 下载winutils的Windows版本。由于本机的Hadoop版本是2.8.5,因此选择最相近的2.8.3版本下载。
    在这里插入图片描述

  7. 用下载的hadoop-2.8.3\bin\文件夹覆盖hadoop-2.8.5\bin\文件夹
    在这里插入图片描述

  8. hadoop-2.8.5\bin\hadoop.dll粘贴到C:\Windows\System32\
    在这里插入图片描述

在Eclipse上创建Java项目

在file中选择New中的Others新建一个Maven项目。
在这里插入图片描述
在这里插入图片描述
勾选创建简单项目,接下来填写注册信息即可。
在这里插入图片描述
2. 在workspace下的项目路径中创建lib文件夹
在这里插入图片描述
将需要的hadoop库拷贝到lib文件夹中
在这里插入图片描述

  1. 拷贝完成后,点击工程右键,配置路径

在这里插入图片描述
将刚才lib文件夹中的包全部导入
在这里插入图片描述

调试程序

  1. 在工程中创建包com.wordcount以及对应的类WordcountDriver,WordcountMapper,WordcountReducer。其中WordcountMapper用来切分单词,WordcountReducer用来统计单词数目,WordcountDriver用来控制程序。
    在这里插入图片描述
    WordcountMapper
package com.WordCount;

import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.LongWritable;

import java.io.IOException;

//KEYIN 输入数据的key
//VALUEIN 输入数据的value
//KEYOUT 输出数据的key的类型 
//VALUEOUT 输出数据value的类型 

public class WordcountReducer extends
		Reducer<Text, LongWritable, Text, LongWritable> {
	protected void reduce(Text key,
			Iterable<LongWritable> values,
			Reducer<Text, LongWritable, Text, LongWritable>.Context context)
			throws IOException, InterruptedException {
		long sum = 0;

		// 计算每一个key的value之和
		for (LongWritable v : values) {
			sum += v.get();
		}

		context.write(key, new LongWritable(sum));
	}
}

WordcountReducer

package com.WordCount;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
//import com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider.Text;
//注意不要将com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider.Text 和 org.apache.hadoop.io.Text 弄混了
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WordcountCounter {
	public static void main(String[] args)
			throws IOException, ClassNotFoundException,
			InterruptedException {
		// 获取job对象
		Job job = Job.getInstance(new Configuration());

		// 设置jar的存储位置
		job.setJarByClass(WordcountCounter.class);

		// 使WordcountCounter和MapperClass,ReducerClass产生关联
		job.setMapperClass(WordcountMapper.class);
		job.setReducerClass(WordcountReducer.class);

		// 设置WordcountCounter阶段输出数据的key和value类型
		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(LongWritable.class);

		// 设置最终数据输出数据的key和value类型
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(LongWritable.class);

		// 选择Master作为文件来源和输出
		FileInputFormat.setInputPaths(job,
				new Path(args[0]));
		FileOutputFormat.setOutputPath(job,
				new Path(args[1]));

		// 提交 job
		boolean result = job.waitForCompletion(true);
		System.exit(result ? 0 : 1);
	}
}
  1. 在Project上点击右键选择Run As中的Run Configuration,在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
  2. 点击Run即开始运行。在这里插入图片描述
    在这里插入图片描述

将程序部署到Linux虚拟机上

  1. 之前我们已经修改过pom.xml文件,为了将程序打包成jar格式,需要在pom.xml中的<project> </project>之间继续添加如下内容
<build>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.3.2</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>

			<plugin>
				<artifactId>maven-assembly-plugin</artifactId>

				<configuration>
					<descriptorRefs>
						<descriptorRef>jar-with-dependencies</descriptorRef>
					</descriptorRefs>
					<archive>
						<manifest>
							<mainClass>com.WordCount.WordcountReducer</mainClass>
							//使用main函数所在的类的全名
						</manifest>
					</archive>
				</configuration>
				<executions>
					<execution>
						<id>make-assembly</id> 
						<phase>package</phase> 
						<goals>
							<goal>single</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

同时,我们需要将Windows->Preferences中的jre路径改成jdk路径。在这里插入图片描述
修改完成后,在工程上单击右键,选择Run As中的Maven install运行。在这里插入图片描述
当结果出现BUILD SUCCESS时,说明打包成功。
在这里插入图片描述
打包后的jar包存放在D:\eclipse-workspace\CQU\target中,选择不带deoendencies的包,改名为wordcount.jar,上传到master节点中。
在这里插入图片描述
在这里插入图片描述
因为之前的配置文件规定了输入输出文件都在Hadoop集群中,因此我们将要处理的文件wordcount.txt上传到hdfs中。

#hdfs dfs -mkdir /local/
#hdfs dfs -put /opt/softwares/word.txt /local/

然后执行程序

hadoop jar /opt/softwares/wordcount.jar com.WordCount.WordcountReducer /local/word.txt /local/output

要注意,通用的Hadoop执行jar应用的命令格式是#hadoop jar *.jar [mainclass] [input] [output],其中主类必须写全名,输出路径不能是已经存在的。执行完毕后,在Hadoop系统中打开/local/output,找到输出结果,下载并查看,可以看到程序成功地进行了计数。
在这里插入图片描述
在这里插入图片描述

常见问题

  1. 如果显示无法找到源代码,有可能是hadoop-2.8.5\share\中的source文件没有导入到workplace中,按上述操作添加缺失的包即可。
  2. 在同时导入MapReduce和Mapred包时,某些类会发生冲突,此时优先选择较新的MapReduce包。
  3. 在这里插入图片描述
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值