MapReduce思想:
核心:
分而治之,先分在和
应用场景:
复杂任务,没有依赖,以并行提供处理效率
脉络体现:
先map后reduce
map:把复杂的任务拆分成任务,局部进行计算,得出局部结果
reduce:把map的局部结果进行全局汇总,得到最终结果
MapReduce设计构思:
如何进行大数据处理?
先分在合,分而治之
抽象俩个函数模型:
输入输出都是以kv键值段
map:
把复杂的任务拆分成任务,局部进行计算,得出局部结果
reduce:
把map的局部结果进行全局汇总,得到最终结果
把这么做和做什么进行拆分:
程序负责复杂这么做(技术)
用户负责做什么(业务)
以上俩者合并起来才是完整的MR程序
MapReduce框架结构和编程规范:
代码层面:
类继承Mapper 重写map()-----负责map阶段的业务
类继承Reduce 重写reduce()----负责reduce阶段的业务逻辑
客户端运行的主类(main)-----指定mr相关属性,提交程序
将以上三个打包为jar包
运行角度:
MapTask:map阶段运行的task
ReduceTask:reduce阶段运行的task
MapReduceApplictionMaster(MrAppMaster):程序运行的主体,监督各task运行和mr程序的运行 ,负责跟yarn进行资源
案例WordCount:
环境开发版本问题:
Apache 2.7.4 优化了CDH2.6.0本地执行环境
数据类型和序列化机制:
Writable(接口) 认为java序列化机制臃肿 不利于大数据网络传递
重点:(MR执行流程):
序列化机制:
序列化机制概念:
进程网络间传递数据 数据变成字节流
Writable:
序列化方法:write(out)
反序列化:readField(in)
注意:先序列化,后反序列化
自定义排序:
本质(CompareTo):
0:相等
正数:大于
负数:小于
注意:谁大谁在后
倒序排序:
欺骗程序 :欺骗 大--->负数 小--->正数
对象实现接口:
Compareable | WritableCompareable<Bean>
自定义分区:
分区定义:
决定了map的输出key value在哪一个reduceTask上
默认分区规则:
HashPartitioner(key.hashcode % NumReduceTasks)
实现自定义分区:
继承Partition类 重写getPartitions 该方法返回值就是分区的标号值
让自定义分区生效:
job.setPartitionClass()
分区个数和reduceTask个数的关系:
应该保持相等
分区个数多 报错 非法分区
分区个数少 执行 空文件产生
Combiner(归约):
局部聚合组件 把每一个map的输出先进行局部聚合
优化了IO网络
本身就是reduce 只是范围小 不是全局
默认不是开启的
注意:慎重使用:因为顺序 个数在最终的结果 会发生变化。
并行度机制:
概念:所谓的并行度,指的是多个同时工作
maptask并行度(逻辑切片 归约):文件大小 个数 切片大小
reducetask并行度:代码设置 涉及全局计数 慎重使用
shuffle机制:
概念:是一个过程
从map输出数据开始到reduce接受数据作为输入之前
横跨了map reduce 阶段 中间横跨网络 是mr程序的核心 是执行效率最慢的原因。
数据压缩:
压缩目的:减少网络传输数据量,减少最终磁盘所占空间
压缩机制:
map输出压缩:(影响网络传输的数量)
redcue的输出压缩:(磁盘所占的空间)
压缩算法:
推荐用:snappy
取决于Hadoop是否支持该压缩
检查是否支持本地库:hadoop chechnative
最好结合Hadoop编译 支持一部分压缩算法。
压缩的设置方式:
直接在map程序中 通过conf.set()-----只对本mr有效
修改xml配置文件 mapred-site.xml-----全局有效
优化参数:
包括:资源,容错,稳定性等------Hadoop官网api xxx.default.xml(查找弃用属性--Deprecated Properties)
大小文件之间的关联操作---(hive大小表之间的join(结合))
把所有的数据以关联的字段作为key发送到同一个reduce处理
弊端:reduce join 压力大 可能发生数据倾斜
在map阶段完成数据之间的关联
map join 没有reduce阶段(numreducetask(0))
part-m-00000
分布式缓存:
可以把指定的文件(压缩包 jar ) 发生给当下程序的每一个maptask
setup初始化方法:
把缓存的小文件加载到当前maptask运行的程序内存中
创建各种不同的数据集合类型 保存小文件数据
处理小文件场景:
默认切片机制:-->一个小文件一个切片---->一个切片一个maptask
CombineTextInputFormat:切片机制
小文件:
自定义分分组:
发生阶段:
调用reduce()方法之前
默认分组:
排好序的数据,根据前后俩个key是否相等(相等 或者 不相等)
自定义对象作为key:
WritableComparator分组继承的类 注意:WritableComparable<OrderBean> 排序实现接口
它是用来给Key分组的
它在ReduceTask中进行,默认的类型是GroupingComparator也可以自定义
WritableComparator为辅助排序手段提供基础(继承它),用来应对不同的业务需求
比如GroupingComparator(
分组比较器)会在ReduceTask将文件写入磁盘并排序后按照Key进行分组,判断下一个key是否相同,将同组的Key传给reduce()执行
自定义分组生效:
job.setGroupingComparatorClass(OrderGroupingComparator.class);