父类:inputformat 抽象类
方法:createRecordReader(): 创建数据读取器,负责构建一个读取器来读取数据返回:RecordReader 对象;实际读取数据的对象,
isSplitable(): 判断block块是否可分割返回: true 表示数据会按照切分规则切成多少片false 表示数据会作为一个整体,不可分割
小文件解决方案:1.在hdfs上传时解决: 将多个小文件合并成大文件上传到hdfs,多个输入流,一个输出流2.在mapreduce任务之前做合并: 在input中实现多个小文件合并输出
自定义输入:1.继承inputFormat类2.重写createRecordReader() 和 isSplitable()方法
自定义读取器:1.继承recordReader类2.重写initialize(),nextKeyValue(),getcurrentKey(),getcurrentValue(),getProcess(),close()方法
父类:outputformat 抽象类
方法:getRecordWriter(): 返回一个输出器对象
自定义输出器:1.继承recordWriter()2.重写write()和close()方法
参数优化
过程优化
Combiner
Compress
意义: 减少磁盘以及网络的IO,提高数据传输和存储的效率,减少cpu负荷(压缩和解压缩的计算)
类型: snappy、lz4、lzo
使用位置:
概念:在mr中如何频繁高效的使用小数据?
解析:方案1: 将小数据放在分布式缓存中,每个block块都和缓存中的数据进行join,addcachefile方法过程: 会启动两个task,一个task负责将小表数据转换成hashtable,写入本地文件,并加载到分布式缓 存中。第二个task会去启动一个maptask扫描大表,执行maptask任务,根据分布式缓存中的数据做关联方案2: 将小数据通过程序mr程序的setup方法初始化加载到内存中
分布式缓存原理:通过在启动maptask时的初始化方法setup中设置addcachefile加载缓存文件,将每个小文件中的数据放到datanode节点上的内存中
存放方式:既可以直接放在内存中,也可以放在内存数据库redis中
概念:由于某节点上任务数据分配过于集中,造成该节点上task处理任务耗时较久,使得job进度卡在90%左右不动,造成任务长尾现象;
表现:1.处理任务时个别task迟迟不能完成,2.结果数据在集群的各个节点上分配不均衡的问题
原因:1.数据本身就是倾斜的,集中在某个规律上,比如 空值字段,null未做过滤等2.数据分配规则有问题导致数据倾斜:例如:mapreduce的分区规则; hql语句join,group by,count(distinct)
补充:2和3的解决方案会将key相同的数据分发到两个reducetask中,如果非要key相同的数据在一个reduce中处理,那么就需要启动两个mapreduce任务进行处理
概念:mapreduce计算时,key是引用类型,key是一个公用的引用对象(即使用了对象重用机制),但是值会随着values的迭代而变化,取得与之对应的key;