zoukankan      html  css  js  c++  java
  • 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);



  • 相关阅读:
    java源码--Map
    数据结构 -- 哈希表(hash table)
    第三篇:SpringBoot模板Freemaker使用
    第四篇:SpringBoot 数据持久化之JdbcTemplate
    数据结构 -- 红黑树
    第二篇:彻底搞清楚 Spring Boot 的配置文件 properties和yml
    数据结构 -- AVL树
    Spring Boot之从Spring Framework装配掌握SpringBoot自动装配
    数据结构 -- Trie字典树
    数据结构 -- 并查集
  • 原文地址:https://www.cnblogs.com/TiePiHeTao/p/7915a1b78c4cbcecee6949d881d2d8b8.html
Copyright © 2011-2022 走看看