自定义Mapper类
class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable>
{ … }
- 自定义mapper类都必须实现Mapper类,有4个类型参数,分别是:
- Object:Input Key Type-------------K1
- Text: Input Value Type-----------V1
- Text: Output Key Type-----------K2
- IntWritable: Output Value Type—V2
- 自定义mapper类须继承Mapper类,重写map方法;
- 执行一次map函数,即处理一行数据;
自定义Reducer类
class IntSumReducer
extends Reducer<Text, IntWritable, Text, IntWritable>
{ … }
- 自定义Reducer类都必须实现Reducer类,有4个类型参数,分别是:
- Text: Input Key Type-------------K2
- IntWritable: Input Value Type-----------V2
- Text: Output Key Type-----------K3
- IntWritable: Output ---------V3
- 自定义Reducer类须继承Reducer类,重写Reduce方法
- 执行一次Reduce函数,即处理一个Key的数据(values);
Hadoop的序列化格式
- 序列化(Serialization)是指把结构化对象转化为字节流。
- 反序列化(Deserialization)是序列化的逆过程。即把字节流转回结构化对象。
- Java序列化(java.io.Serializable)
Hadoop序列化格式特点:
- 紧凑:高效使用存储空间。
- 快速:读写数据的额外开销小
- 可扩展:可透明地读取老格式的数据
- 互操作:支持多语言的交互
Hadoop序列化的作用
- 序列化在分布式环境的作用:进程间通信,永久存储。
- Hadoop节点间通信
Writable接口
Writable接口是根据 DataInput 和 DataOutput 实现的简单、有效的序列化对象。
- MR的任意Key和Value必须实现Writable接口
- MR的任意key必须实现WritableComparable接口。
Hadoop序列化类型,与java基本类型的转换操作:get,set
自定义类型
Context
它是mapper的一个内部类,简单的说是为了在map或是
reduce任务中跟踪App的状态,很自然的MapContext就是记
录了map执行的上下文,在mapper类中,这个context可以存
储一些job conf的信息,如运行时参数、输入文件分片信息
等
InputFormat
• TextInputFormat,默认的格式,每一行是一个单
独的记录,并且作为value,文件的偏移值作为key
• KeyValueInputFormat,这个格式每一行也是一个
单独的记录,但是Key和Value用Tab隔开,是默认
的OutputFormat,可以作为中间结果,作为下一
步MapReduce的输入。
• SequenceFileInputFormat
- 基于块进行压缩的格式
- 对于几种类型数据的序列化和反序列化操作
- 用来将数据快速读取到Mapper类中
Partitioner类
在Map工作完成之后,每一个 Map函数会将结果
“传到” 对应的Reducer所在的节点,此时,用户可以提供一个Partitioner类,用
来决定一个给定的(key,value)对传输的具体位置;
Combiner类
Map端会产生大量的输出,Combiner作用就是在
map端对输出先做一次合并,以减少传输到
Reducer的数据量;
Output Format
Maper、Reducer类的setup、cleaup方法
在run方法中调用了三个方法:setup方法,
map方法,cleanup方法。其中setup方法和
cleanup方法默认是不做任何操作,且它们
只被执行一次。但是setup方法一般会在map
函数之前执行一些准备工作,如作业的一些
配置信息等;cleanup方法则是在map方法运
行完之后最后执行的,该方法是完成一些结
尾清理的工作,如:资源释放等