因为在虚拟机上调试程序不如Windows方便,因此我们先在Windows上调试好后再移植到linux上。
配置Windows下的Maven和Hadoop环境
-
配置maven的windows环境变量。
在我的电脑图标单击右键,打开属性,选择左侧的高级系统设置。打开环境变量一栏,在用户变量的Path
变量中添加%MAVEN_HOME%\bin
和%HADOOP_HOME%\bin
,系统变量中新建变量名MAVEN_HOME
和HADOOP_HOME
,变量值D:\Linux\apache-maven-3.6.3\
和D:\Linux\Windows\hadoop-2.8.5
(即解压路径)。
-
配置
setting.xml
文件。打开.\apache-maven-3.6.3\conf\setting.xml,在图示位置添加<localRepository>d:\Linux\MavenRepo\</localRepository>
。这个路径表示本地仓库,由用户自己设置。
-
启动Eclipse,打开preference选项。
找到Maven的配置项目,在User Setting中上传刚才配置好的setting.xml
文件,点击更新设置,应用并保存。
-
修改Hadoop配置文件。打开准备在Windows上运行的Hadoop的文件:
hadoop-2.8.5\etc\hadoop\hadoop-env.cmd
,将对应语句改为set JAVA_HOME=D:\JAVA\jdk1.8.0_202
-
下载winutils的Windows版本。由于本机的Hadoop版本是2.8.5,因此选择最相近的2.8.3版本下载。
-
用下载的
hadoop-2.8.3\bin\
文件夹覆盖hadoop-2.8.5\bin\
文件夹
-
将
hadoop-2.8.5\bin\hadoop.dll
粘贴到C:\Windows\System32\
中
在Eclipse上创建Java项目
在file中选择New中的Others新建一个Maven项目。
勾选创建简单项目,接下来填写注册信息即可。
2. 在workspace下的项目路径中创建lib文件夹
将需要的hadoop库拷贝到lib文件夹中
- 拷贝完成后,点击工程右键,配置路径
将刚才lib文件夹中的包全部导入
调试程序
- 在工程中创建包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);
}
}
- 在Project上点击右键选择Run As中的Run Configuration,
- 点击Run即开始运行。
将程序部署到Linux虚拟机上
- 之前我们已经修改过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,找到输出结果,下载并查看,可以看到程序成功地进行了计数。
常见问题
- 如果显示无法找到源代码,有可能是
hadoop-2.8.5\share\
中的source文件没有导入到workplace中,按上述操作添加缺失的包即可。 - 在同时导入MapReduce和Mapred包时,某些类会发生冲突,此时优先选择较新的MapReduce包。