1、map的输入是无法控制的,它一行行读取进来
2、但是我们可以将它输入的value进行切割,组装成我们想要的key对象,以方便排序后在传输到reduce。
所以一般我们这么干:把需要排序的字段组装成自定义对象作为key,这个自定义对象需要实现writebleCompareble接口,
重写里面的compareto方法就行可以自定义排序了。
3、只要你在map中用的是自定义的bean作为key,那么这个信息一定是排序好的,并且交到同一个reduce中。
4、自定义patitionor
使用:job.setPartitionerClass(Mypatitionor.class);
5、自定义GroupingComparator类规则来告诉reduce的iterator对key的判断。
使用:job.setGroupingComparatorClass(ReduceCompareble.class);
6、自定义bean作为key,实现多个字段的排序
public class OrderBean implements WritableComparable<OrderBean> {
private String orderID;
private Double amount;
[@Override](https://my.oschina.net/u/1162528)
public void readFields(DataInput input) throws IOException {
orderID = input.readUTF();
amount = input.readDouble();
}
[@Override](https://my.oschina.net/u/1162528)
public void write(DataOutput output) throws IOException {
output.writeUTF(orderID);
output.writeDouble(amount);
}
[@Override](https://my.oschina.net/u/1162528)
public int compareTo(OrderBean o) {
int cmp = this.orderID.compareTo(o.getOrderID());
if (cmp == 0) { //表示第一级相等,那么在判断第二级
//compareTo默认是升序排序,加一个“-”表示降序排序。
cmp = -this.amount.compareTo(o.getAmount());
}
return cmp;
}
[@Override](https://my.oschina.net/u/1162528)
public String toString() {
return this.orderID + "\t" + this.amount;
}
}
7、combiner组件的使用:
就是在map阶段,整理排序后输出到磁盘的结果,和merge合并的文件结果。以减少reduce下载map运行结果的网络带宽。它的父类也是Reducer,但是他和reduce的不同在于运行的位置不一样。注意:使用combiner的前提是不能够影响业务,比如说求平均值。
8、mapreduce的计数器使用
-
1、counter计数器的结果图
-
2、获取counter
-
3、counter自增1
后面的构造器参数是组名和字段名,可以定义多个计数器,用来记录不同的信息。
9、获取map端的信息来自于那个表(在setup方法中定义即可,不要再map方法中获取。)
10、在map端进行join的时候,可以使用addCacheFile
-
1、指定cachefile的文件
-
2、在map端获取