MapReduce分区/自定义输入输出

一、分区实现:
MapperReduce程序中默认只有reducer组件,只有一个分区。
分区的实现是key的哈希算法实现。
分区只负责将对应的key-value键值对放在那个reducer组件中去执行
1、创建自定义分区类,继承Partitioner
2、在Partitioner指定类型和Reducer组件的输入类型相同
3、在getPartition(key,value)方法设定分区策略(自定义)
4、在驱动程序中设定 job.setPartitionerClass()分区类
5、指定分区的数量(必须和分区策略相对应)

代码实现:

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Partitioner;
/*
 * 泛型类型的是由Reducer的输入类型决定的
 */
public class FlowPartition extends Partitioner<Text, FlowBean>{

	@Override
	public int getPartition(Text key, FlowBean value, int numPartitions) {
		String addr=key.toString();
		if("北京".equals(addr)){
			return 0;//0号分区
		}else if("上海".equals(addr)){
			return 1;//1号分区
		}else{
			return 2;//2号分区
		}
	}
	

}

Driver中:

	//指定使用自定义分区
	job.setPartitionerClass(FlowPartition.class);
	//指定有多少个reducer组件(分区)
	job.setNumReduceTasks(3);

二、自定义格式输入:
-默认mapper输入为LongWritable,Text若要修改输入类型需要自定义

步骤:
1.创建自定义格式输入类,继承FileInputFormat<K,V>
-K,V为指定输入类型 即mapper组件的输入类型
2.添加createRecordReader()
-在该方法中需要返回一个真正读取数据的对象
-(该对象是RecordReader本身或它的一个子类)
-RecordReader本身返回的K,V
-K:字符偏移量
-V:每行数据
3、创建一个RecordReader子类
-在该类中,首先需要指定输入mapper的key,value
-类型必须和自定义格式输入类中指定的相同
-指定输入文件FileSplit;行读取器LineReader
4.重写5个方法:
-initialize()
为FileSplit/LineReader初始化
-nextKeyValue()
为key、value指定具体的内容
-getCurrentKey()
返回Key
-getCurrentValue()
返回value
-close()
关闭资源:LineReader
5.在步骤2中返回一个RcordReader子类对象。
6.在Mapper组件中使用的key、value的类型必须和上面指定相同。
7.在驱动程序中通过 job.setInputFormatClass 方法指定自定义输入类型。

代码实现:

关注公众号" 编译未来 "

回复 " mapreduce "获取

在这里插入图片描述

三、自定义格式输出:
-输出key、value之间用指定符号分隔
-指定输出文件名称(完全、不完全替代)

1.定义自定义输出类,继承FileOutputFormat类,有两个泛型,将FileOutputFormat类上的泛型添加到自定义输出类上
2.重写getRecordWriter();返回一个RecordWriter的实例或子类对象;
3.创建RecordWriter的类,重写writer()、close()方法。
-定义输出流,定义带参的构造函数,用来对输出流初始化。
-write方法用来向最终结果文件输出数据。
-可以在该方法中定制输出格式
-close方法用来关闭输出流
4.在自定义输出类的getRecordWriter()方法中
-可以通过调用 super.getDefaultWorkFile()方法,来获取用户输入的路径
-由该路径指定文件系统,以及确定输出流
5.将该输出流传递给RecorWriter的子类实例。

代码实现:

关注公众号" 编译未来 "

回复 " mapreduce "获取

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值