WordCount案例
- 导入相关jar包——share文件夹下的hadoop文件夹下的common、hdfs、mapreduce文件夹下所有jar包,以及mapreduce文件夹下的依赖jar包,即lib文件夹下的所有jar包。
import org.apache.hadoop.mapreduce.Mapper;
/**KEYIN:map task 读取到的数据的key类型,是一行的起始偏移量Long类型;
VALUEIN:map task 读取到的数据的value类型,是是一行的内容 String类型;
KEYOUT:用户的自定义的map方法要返回的结果的key类型,在此案例中我们需要反悔的是单词String类型;
VALUEOUT:用户的自定义的map方法要返回的结果的value类型,在此案例中我们需要返回的是整数Integer类型;
在mapreduce中,map产生的数据需要传输给reduce,需要进行序列化和反序列化,而jdk中原生序列化机制太过冗余,所以,hadoop提供了自己的序列化机制,所以mapreduce传输的数据类型就必须实现hadoop自己的序列化接口。
hadoop为常用的jdk基本数据类型 Long,Float,Integer,String等数据类型封装了自己的实现了hadoop序列化接口的类型:LongWritable,FloatWritable,IntWritable,Text
*/
// public class WordCountMapper extends Mapper<KEYIN,VALUEIN,KEYOUT,VALUEOUT>{
}
public class WordCountMapper extends Mapper<LongWritable,Text,Text,IntWritable>{
@overide
protect void map(LongWrightable key,Text value,Context context) throws IOException{
//切单词
String line = value.toString();
String[] words = line.split(" ");
for(String word:words){
context.write(new Text(word),new IntWritable(1));
}
}
}
public class WordCountReducer extends Reduce<Text,IntWritable,Text,IntWritable>{
protected void reduce(Text key,Iterable<IntWritable> values,Context context){
Iterator<IntWritable> iterator = values.Iterator;
int count = 0;
while(iterator.hasNext()){
IntWritable value = iterator.next;
count += value.get();
}
context.write(key,new IntWritable(count));
}}
//提交作业的类
public class JobSubmit{
public static void main(String [] args){
Configuration conf = new Configuration;
//job运行时要访问的默认文件系统
conf.set("fs.defaultFS","文件所在机器ip");
//设置job提交去哪运行
conf.set("mapreduce.framework.name","yarn");
conf.set("yarn.resourcemanager.hostname","词namenode的hostname");
Job job = Job.getInstance(conf);
//封装参数:jar包所在位置
job.setJarByClass("JobSubmit.class");
//本次job所调用的mapper、reducer实现类
job.setMapperClass(WordCountMpper.class);
job.setReducerClass(WordCountReducer.class);
//本次job的mapper实现类、reducer实现类产生的结果数据的key、value类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
job.setReduceOutputKeyClass(Text.class);
job.setReduceOutputValueClass(IntWritable.class);
//本次job要处理的输入数据集所在的路径、最终结果的输出路径
FileInputFormat.setInputPaths(job,new Path("lujing"));
FileOutputFormat.setOutputPath(job,new Path("lujing"));
//想要启动的reduce task 的数量
job.setNumReduceTask(2);
//提交job给yarn
boolean res = job.waitForCompletion(true);
}
}
内容整理来自网络、相关书籍等,仅供学习参考