使用IDEA编写第一个MapReduce程序(Java)
上两篇文章已经搭建好了hadoop为伪分布式集群,这节我们是编写第一个MapReduce程序(单词字母检查)
1.安装Idea
2.创建maven程序
3.编写程序,导入hadoop jar包
4.打包使用shell命令运行
1.安装Idea
下载安装即可:Idea官网
2.创建maven程序
安装好maven之后(配置环境变量),即可创建maven程序了


创建完成,然后添加依赖jar包,和Eclipse一样,要给项目添加相关依赖包,否则会出错。
点击Idea的File菜单,然后点击“Project Structure”菜单,如下图所示:

导入jar包:
选择hadoop的包,我用得是hadoop3.*。把下面的依赖包都加入到工程中,否则会出现某个类找不到的错误。
(1)”/usr/local/hadoop/share/hadoop/common”目录下的hadoop-common-2.6.1.jar和haoop-nfs-2.6.1.jar;
(2)/usr/local/hadoop/share/hadoop/common/lib”目录下的所有JAR包;
(3)“/usr/local/hadoop/share/hadoop/hdfs”目录下的haoop-hdfs-2.6.1.jar和haoop-hdfs-nfs-2.7.1.jar;
(4)“/usr/local/hadoop/share/hadoop/hdfs/lib”目录下的所有JAR包。
3.编写程序,打包运行
Mapper类:
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
public class WordcountMap extends Mapper<LongWritable,Text,Text,IntWritable> {
public void map(LongWritable key,Text value,Context context)throws IOException,InterruptedException{
String line = value.toString();//读取一行数据
String str[] = line.split("");//因为英文字母是以“ ”为间隔的,因此使用“ ”分隔符将一行数据切成多个单词并存在数组中
for(String s :str){//循环迭代字符串,将一个单词变成<key,value>形式,及<"hello",1>
context.write(new Text(s),new IntWritable(1));
}
}
}
Reduce类:
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.io.Text;
import java.io.IOException;
public class WordcountReduce extends Reducer<Text,IntWritable,Text,IntWritable> {
public void reduce(Text key, Iterable<IntWritable> values,Context context)throws IOException,InterruptedException{
int count = 0;
for(IntWritable value: values) {
count++;
}
context.write(key,new IntWritable(count));
}
}
入口类:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
public class WordCount {
public static void main(String[] args)throws Exception{
Configuration conf = new Configuration();
//获取运行时输入的参数,一般是通过shell脚本文件传进来。
String [] otherArgs = new GenericOptionsParser(conf,args).getRemainingArgs();
if(otherArgs.length < 2){
System.err.println("必须输入读取文件路径和输出路径");
System.exit(2);
}
Job job = new Job();
job.setJarByClass(WordCount.class);
job.setJobName("wordcount app");
//设置读取文件的路径,都是从HDFS中读取。读取文件路径从脚本文件中传进来
FileInputFormat.addInputPath(job,new Path(args[0]));
//设置mapreduce程序的输出路径,MapReduce的结果都是输入到文件中
FileOutputFormat.setOutputPath(job,new Path(args[1]));
//设置实现了map函数的类
job.setMapperClass(WordcountMap.class);
//设置实现了reduce函数的类
job.setReducerClass(WordcountReduce.class);
//设置reduce函数的key值
job.setOutputKeyClass(Text.class);
//设置reduce函数的value值
job.setOutputValueClass(IntWritable.class);
System.exit(job.waitForCompletion(true) ? 0 :1);
}
}
代码写好之后,开始jar包,按照下图打包。点击“File”,然后点击“Project Structure”,弹出如下的界面。

依次点击"Artifacts" -> “+” -> “JAR” -> “From modules with dependencies”,然后弹出一个选择入口类的界面,选择刚刚写好的WordCount类,如下图(我这里没有用wordCount类):

点击“Build”之后就会生成一个jar包。jar的位置看下图,依次点击File->Project Structure->Artifacts就会看到如下的界面:

4.打包使用shell命令运行
然后将jar包放入hadoop主机,使用下图命令即可运行jar包(第一个是hadoop关键字,第二个jar一样,第三个是jar包名称,如果jar包有main方法入口则不需要制定方法名,如果没有则需要制定类名和方法名,第四个是args数组参数)
下图我是用另外的hadoop运行jar包的命令测试,格式一样,大家修改就行。

最后是将生成的hdfs文件系统输出文件导入到本地文件系统(-get 参数是将hdfs文件复制到本地文件系统,从本地复制到hdfs是 -CopyFromLocal)
输出文件 :hadoop fs -get /output/sampleout/part-r-00000 /home/test1/
这样我们就可以在/home/test文件夹下看到输出文件了。

2142

被折叠的 条评论
为什么被折叠?



