准备工作:
- Eclipse
- Maven
- JDK1.8
- hadoop集群(我使用的是华为的MRS服务)
安装JDK+Eclipse
安装Maven
- 官方下载
- 解压后放在喜欢的文件夹中,并设置好系统PATH路径
- win+cmd 输入 mvn –version检测是否安装成功
配置eclipse的Maven
- eclipse–>Window–>Preferences
- 点击add后,定位到Maven所在的目录finish
- 将maven选项勾选上
- User Settings 将Global Setting的路径定位到/Maven目录/conf/settings.xml
- 点击OK
新建Maven工程
File–>New–>Project
输入Maven,点击Maven Project ,点击Next
构建完成后再目录结构中,修改pos.xml配置文件
再 中间加入以下依赖内容
1 | <name>MyWordCount</name> |
ctrl+s保存,右键项目Refresh 刷新。
这个时候会下载相应的依赖包,可能会很久
我们要写的主程序是在src/main/java中com.MyWordCount包下,可以把原来的文件删除,然后开始写我们需要的Wordcount程序
WordCountMain1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35package com.MyWordCount;
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.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class WordCountMain {
public static void main(String[] args) throws Exception {
//1.创建一个job和任务入口
Job job = Job.getInstance(new Configuration());
job.setJarByClass(WordCountMain.class); //main方法所在的class
//2.指定job的mapper和输出的类型<k2 v2>
job.setMapperClass(WordCountMapper.class);//指定Mapper类
job.setMapOutputKeyClass(Text.class); //k2的类型
job.setMapOutputValueClass(IntWritable.class); //v2的类型
//3.指定job的reducer和输出的类型<k4 v4>
job.setReducerClass(WordCountReducer.class);//指定Reducer类
job.setOutputKeyClass(Text.class); //k4的类型
job.setOutputValueClass(IntWritable.class); //v4的类型
//4.指定job的输入和输出
FileInputFormat.setInputPaths(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
//5.执行job
job.waitForCompletion(true);
}
}
WordCountReducer1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24package com.MyWordCount;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
// k3 v3 k4 v4
public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
protected void reduce(Text k3, Iterable<IntWritable> v3,Context context) throws IOException, InterruptedException {
//对v3求和
int total = 0;
for(IntWritable v:v3){
total += v.get();
}
//输出 k4 单词 v4 频率
context.write(k3, new IntWritable(total));
}
}
WordCountMapper1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.MyWordCount;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
// 泛型 k1 v1 k2 v2
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
protected void map(LongWritable key1, Text value1, Context context)
throws IOException, InterruptedException {
//数据: I like MapReduce
String data = value1.toString();
//分词:按空格来分词
String[] words = data.split(" ");
//输出 k2 v2
for(String w:words){
context.write(new Text(w), new IntWritable(1));
}
}
}
编译打包
win+cmd,进入到这个项目的目录中:**/MyWordCount
执行mvn打包命令: mvn clean package
注意:要保持网络畅通,因为项目打包时会下载一些文件。
回到Eclipse在target 刷新就能看到生成好的jar文件了
使用华为云MRS服务测试程序
确定已经完成了MRS服务订购安装,OBS桶的搭建
服务列表–>对象储存服务–>桶(注意桶和MRS必须在同一个大区)–>对象–>新建文件夹(program)和新建文件夹(input)
进入这两个文件夹,并上传刚才打包好的jar文件,和需要运行的文本文件
服务列表–>MapReduce服务–>现有集群–>进入–>文件管理–>导入数据
作业管理–>添加
执行参数可以不用填写1
hadoop jar ../MyWordCount-0.0.1-SNAPSHOT.jar MyWordCount /input /output
这个命令系统会自动生成,直接点击确定即可。
注意output文件夹一定不能存在,需要由程序自行建立,否则会报错
可以查看日志,来看程序运行情况,以及报错,最后的结果是储存在hdfs中了,我们再按照前面步骤,将其导出至obs中,就可以进行结果的下载了。
目前解决的问题只有这么多,比较大的坑点一个是本地程序的打包过程,还有就是华为MRS服务似乎没有办法直接从obs中调用程序和数据,必须要转移到hdfs中,才可以使用。