MapReduce总结

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);



原文地址:https://www.cnblogs.com/TiePiHeTao/p/7915a1b78c4cbcecee6949d881d2d8b8.html