WordCount的编写
WordCount是MapReuduce的一个入门小程序,需要编写三个类,分别对应MR中的Map阶段、Reduce阶段以及任务提交阶段。
WcMap编写
package MRwordcount;
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;
/***
* mapper类
* 数据输入类型是K,V类型--》LongWritable, Text
* 数据输出类型是K,V类型--》Text, IntWritable
*/
public class WcMap extends Mapper<LongWritable, Text,Text, IntWritable> {
//快捷键
//实现父类 alt+insert
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//获取一行数据,MapReduce默认按行读取
String line = value.toString();
//切分数据,按空格切分
String[] fields = line.split(" ");
//遍历获取每一个单词
for(String s:fields){
//输出并拼接
//System.out.println(s);
context.write(new Text(s),new IntWritable(0));
}
}
}
WcReduce编写
package MRwordcount;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
/***
* Reducer类
* 数据输入类型K,V--》Text, IntWritable
* 数据输出类型K,V--》Text, IntWritable
*/
public class WcReduce extends Reducer<Text, IntWritable,Text, IntWritable> {
//直接实现父类方法 快捷键ctrl+o
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
//定义一个计数器
int count=0;
//累加计数
for(IntWritable value :values){
//IntWritable转换成int类型
count++;
}
//输出
context.write(key,new IntWritable(count));
}
}
WcDriver编写
package MRwordcount;
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;
import java.io.IOException;
public class WcDriver {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
//实例化配置文件
Configuration conf = new Configuration();
//定义一个job任务
Job job = Job.getInstance(conf);
//配置job的信息
job.setJarByClass(WcDriver.class);
//指定自定义的mapper、mapper的数据类型到job中
job.setMapperClass(WcMap.class);
job.setOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//指定自定义的reduce以及reduce的输出数据类型,总输出类型
job.setReducerClass(WcReduce.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//配置输入数据的路径,这一部分演示的在本地运行
FileInputFormat.setInputPaths(job,new Path("D:\\BigdataTest\\WordCount.txt"));
//配置输出数据的路径
FileOutputFormat.setOutputPath(job,new Path("D:\\BigdataTest\\WordRes"));
/*//配置输入数据的路径,这一部分是打包上传到集群运行
FileInputFormat.setInputPaths(job,new Path(args[0]));
//配置输出数据的路径
FileOutputFormat.setOutputPath(job,new Path(args[1]));*/
//提交任务
job.waitForCompletion(true);
}
}
结果展示
输入文件:
输出结果:
jar包集群上运行
上面的过程都是在本地运行的,接下来将写好的程序打包,上传到集群运行。
打包
可以使用maven的自动打包。
打好的包可以在控制台中找到它的本地路径:
上传到集群并运行
linux系统的上传下载命令分别是rz、sz,使用rz命令上传jar包和需要输入的数据文件。
将数据文件上传到HDFS。
hdfs dfs -moveFromLocal D:\\BigdataTest\\WordCount.txt /mytest
运行jar包:
hadoop jar /opt/module/hadoop-2.8.4/myjar/hadooptest-1.0-SNAPSHOT.jar MRwordcount.WcDriver /mytest/WordCount.txt /mytest/output
需要注意的是,指定要运行的包含main函数的类的名字要写全(包含包的名字)。
查看最终结果: