mapreduce,数据结构和类型介绍

mapreduce,数据结构和类型介绍

特别数据类型介绍
Hadoop提供了如下内容的数据类型,这些数据类型都实现了WritableComparable接口,以便用这些类型定义的数据可以被序列化进行网络传输和文件存储,以及进行大小比较。
BooleanWritable:标准布尔型数值
ByteWritable:单字节数值
DoubleWritable:双字节数
FloatWritable:浮点数
IntWritable:整型数
LongWritable:长整型数
Text:使用UTF8格式存储的文本
NullWritable:当<key,value>中的key或value为空时使用
InputFormat和InputSplit:InputSplit是Hadoop定义的用来 传送 给每个 单独 的 map 的 数据 ,InputSplit 存储的并 非 数据本身而是一个分片长度 和一个 记录数据位置 的 数组 。 生成InputSplit的方法可以通过 InputFormat()来设置 。
OutputFormat:每一种 输 入 格式 都有一种 输 出 格式 与其对应。默认的输出格式是 TextOutputFormat ,这种输出方式与输入类似,会将每条记录以一行的形式存入文本文件。不过,它的 键和值 可以是 任意形式 的,因为程序 内容 会调用 toString() 方法将键和值转换为 String 类型再输出。
特别类介绍
Mapper
1、mapper可以选择性地继承 MapreduceBase这个基类, 他只是把一些方法实现了而已, 即使方法体是空的.
2、 mapper必须实现 Mapper 接口(0.20以前的版本), 这是一个泛型接口, 需要执行输入和输出的key-value的类型, 这些类型通常都是Wriable接口的实现类

3、实现map方法, 方法有四个参数, 前面两个就是输入的 Key 和 value, 第三个参数是 OuputCollector, 用于收集输出的, 第四个是reporter,用来报告一些状态的,可以用于debug
3.1 input 默认是一行一条记录, 每天记录都放在value里边
3.2 output 每次搜集一条 K-V记录, 一个K可以对应多个value, 在reduce 里面体现为一个 iterator
4、覆盖 configure方法可以得到JobConf的实例, 这个JobConf是在Job运行时传递过来的, 可以跟外部资源进行数据交互
Reducer
1、reduce也可以选择继承 MapreduceBase这个基类, 功能跟mapper一样.
2.、reducer必须实现Reducer接口, 这个接口同样是泛型接口, 意义跟Mapper的类似
3、实现reduce方法, 这个方法也有四个参数, 第一个是输入的key, 第二个是输入的 value的迭代器, 可以遍历所有的value,相当于一个列表,
outputCollector跟map的一样, 是输出的搜集器, 每次搜集都是key-value的形式, report的作用跟map的相同.
4、在新版本中, hadoop已经将后面两个参数合并到一个context对象里边了, 当然还会兼容就版本的 接口. >0.19.x
5、覆盖configure方法, 作用跟map的相同
6、覆盖close 方法,可以做一些reduce结束后的处理工作.(clean up)
Combiner
1、combiner的作用是, 将map的输出,先计算一遍,得到初步的合并结果, 减少reduce的计算压力.
2、combiner的编写方法跟reduce是一样的, 他本来就是一个Reducer的实现类
3、当reducer符合函数 F(a,b) = F(F(a), F(b)) 时, combinner可以与reduce相同. 比如 sum(a,b,c,d,e,f,g) = sum(sum(a,b) ,sum(c,d,e,f) , sum(g)) 还有max, min等等.
4、 编写正确的combiner可以优化整个mapreduce程序的性能.(特别是当reduce是性能瓶颈的时候.)
5、combiner可以跟reducer不同.
Configuration
1、 后加的属性的值会覆盖前面定义的相同名称的属性的值.
2、被定义为 final的属性(在属性定义中加上 true 标签)不会被后面的同名属性定义的值给覆盖.
3、系统属性比通过资源定义的属性优先级高, 也就是通过System.setProperty()方法会覆盖在资源文件中定义的属性的值.
4、系统属性定义必须在资源文件中有相应的定义才会生效.
5、通过 -D 选项定义的属性, 比在资源文件中定义的属性优先级要高.
Run Jobs
1、设置 inputs & output
1.1 先判断输入是否存在 (不存在会导致出错,最好利用程序来判断.)
1.2 判断输出是否已经存在(存在也会导致出错)
1.3 养成一种好的习惯(先判断,再执行)
2、设置 mapper、reducer、combiner. 各个实现类的class对象. XXXX.class
3、设置 inputformat & outputformat & types
3.1 input和output format都有两种, 一种是 textfile, 一种是sequencefile. 简单理解, textfile是文本组织的形式,sequence file是 二进制组织的形式.
3.2 Types的设置, 根据输入和输出的数据类型, 设置各种Writable接口的实现类的class对象.
4、设置reduce count
4.1 reduce count可以为0, 当你的数据无需reduce的时候.
4.2 reduce数量最好稍微少于当前可用的slots的数量, 这样reduce就能在一波计算中算好. (一个slot可以理解为一个计算单元(资源).)

猜你喜欢

转载自www.cnblogs.com/miaozhijuan/p/12630885.html