jobmain
package com.naixue.sort;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import java.io.IOException;
/**
* @author LIAO
* @create 2020-07-26 20:38
* 排序的主类,将map和reducer串联起来
*/
public class JobMain {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration configuration = new Configuration();
//一、初始化一个job
Job job = Job.getInstance(configuration, "sort");
//二、设置job的相关信息 8个小步骤
//1、设置输入的路径,让程序找到源文件
job.setInputFormatClass(TextInputFormat.class);
TextInputFormat.addInputPath(job,new Path("D://input/test3.txt"));
//2、设置Mapper类,并设置k2 v2
job.setMapperClass(SortMapper.class);
job.setMapOutputKeyClass(MySortBean.class);
job.setMapOutputValueClass(NullWritable.class);
//3 4 5 6
//7、设置Reducer类,并设置k3 v3
job.setReducerClass(SortReducer.class);
job.setOutputKeyClass(MySortBean.class);
job.setOutputValueClass(NullWritable.class);
//8、设置输出的路径
job.setOutputFormatClass(TextOutputFormat.class);
TextOutputFormat.setOutputPath(job,new Path("D://wordoutsort"));
//三、等待完成
boolean b = job.waitForCompletion(true);
System.out.println(b);
System.exit(b ? 0 : 1);
}
}
mybean
package com.naixue.sort;
import org.apache.hadoop.io.WritableComparable;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
/**
* @author LIAO
* @create 2020-07-26 20:16
* 排序的实例化对象
*/
public class MySortBean implements WritableComparable<MySortBean> {
private String word;
private int num;
public String getWord() {
return word;
}
public void setWord(String word) {
this.word = word;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
@Override
public String toString() {
return "MySortBean{" +
"word='" + word + '\'' +
", num=" + num +
'}';
}
/**
* 比较器,按照我们自己指定的规则进行排序
* 排序规则:
* 要求第一列按照字典顺序进行排列,第一列相同的时候, 第二列按照升序进行排列。
* @param o
* @return
*/
@Override
public int compareTo(MySortBean o) {
//1、先对第一列进行排序 word
int result = this.word.compareTo(o.word);
//2、第一列相同的时候,num排序
if (result == 0){
return this.num - o.num;
}
return result;
}
//实现序列化
@Override
public void write(DataOutput out) throws IOException {
out.writeUTF(word);
out.writeInt(num);
}
//实现反序列化
@Override
public void readFields(DataInput in) throws IOException {
this.word = in.readUTF();
this.num = in.readInt();
}
}
sortmapper
package com.naixue.sort;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
/**
* @author LIAO
* @create 2020-07-26 20:26
* Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>
* KEYIN:文本偏移量
* VALUEIN:一行的文本
* KEYOUT:MySortBean
* VALUEOUT:NullWritable
*/
public class SortMapper extends Mapper<LongWritable,Text,MySortBean,NullWritable> {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//1、拆分,将一行文本进行拆分
String[] split = value.toString().split(" ");
//2、将相应的值给写入到MySortBean对象中
MySortBean mySortBean = new MySortBean();
mySortBean.setWord(split[0]);
mySortBean.setNum(Integer.parseInt(split[1]));
//3、写入到上下文
context.write(mySortBean,NullWritable.get());
}
}
sortreducer
package com.naixue.sort;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
/**
* @author LIAO
* @create 2020-07-26 20:26
* Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>
* KEYIN:文本偏移量
* VALUEIN:一行的文本
* KEYOUT:MySortBean
* VALUEOUT:NullWritable
*/
public class SortMapper extends Mapper<LongWritable,Text,MySortBean,NullWritable> {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//1、拆分,将一行文本进行拆分
String[] split = value.toString().split(" ");
//2、将相应的值给写入到MySortBean对象中
MySortBean mySortBean = new MySortBean();
mySortBean.setWord(split[0]);
mySortBean.setNum(Integer.parseInt(split[1]));
//3、写入到上下文
context.write(mySortBean,NullWritable.get());
}
}