大数据技术学习笔记之Hadoop框架基础4-MapReduceshuffer过程详解及zookeeper框架学习

版权声明: https://blog.csdn.net/weixin_37254888/article/details/79704126
一、MapReduce Shuffle
    -》MapReduce运行五个阶段
        input     
            fileinputformat.setinputpaths(job,new Path(args[0]))
            默认:输入key是行的偏移量,value是行的内容
            job.setinputFormatClass(Textinputformat.class)
        map:分片处理,实现map方法
        
        hadoop 1
        hadoop 1
        hive   1
        spark  1
        hbase  1
        
        shuffle    :
            分区
            排序
            分组
        
        hadoop ,{1,1}
        hbase ,{1}
        hive,{1}
        spark,{1}
        
        reduce:合并处理,实现reduce方法
        hadoop 2
        hbase 1
        hive 1
        spark 1
        
        output:同input
        
    -》shuffle的功能:
        -》分区:决定当前的key交给哪个reduce进行处理
            默认:按照key的hash值取余的方式进去区分
            reduce的个数=结果文件的个数
        -》排序:默认按照key的字典顺序进行排序
        -》分组:默认按照key进行分区
        
    -》流程
        -》input
            256M文件 =》 block1、block2 =》 keyvalue =》 split1,split2  
        -》map
            split1 => map task1   => 调用map方法 =》 输出当前的keyvalue
            split2 => map task2
        -》shuffle过程
            -》第一种版本:
                -》map端的shuffle
                    -》缓冲区:map的输出会进入一个环形缓冲区100M(内存)
                    -》分区:根据hash值对reduce的个数取余,为keyvalue打标签
                        -》对每一条keyvalue进行分区
                            hadoop 1  --- reduce1
                            hive 1      --- reduce2
                            hbase 1      --- reduce1
                            hadoop 1  --- reduce1
                            spark  1  --- reduce2
                        -》对每个分区的数据会进行排序
                            hadoop 1  --- reduce1
                            hadoop 1  --- reduce1
                            hbase 1   --- reduce1
                            
                            
                            hive 1      --- reduce2
                            spark  1  --- reduce2
                            
                            
                            hadoop 1  --- reduce1
                            hadoop 1  --- reduce1
                            hbase 1   --- reduce1
                            
                            hive 1      --- reduce2
                            spark  1  --- reduce2
                            
                    -》溢写:当环形缓冲区存储达到80%,开始将缓冲区中的数据溢写
                             到磁盘,变成多个小文件
                    -》合并:将每个小文件合并到一起
                        -》对每个分区的数据进行排序            
                            hadoop 1  --- reduce1
                            hadoop 1  --- reduce1
                            hadoop 1  --- reduce1
                            hadoop 1  --- reduce1
                            hbase 1   --- reduce1
                            hbase 1   --- reduce1
                            hive 1      --- reduce2
                            hive 1      --- reduce2
                            spark  1  --- reduce2
                            spark  1  --- reduce2
                        
                -》reduce端的shuffle
                    -》reduce1和reduce2分别到每个map shuffle的输出中去取
                        取属于自己分区的数据
                    -》reduce1到map task1和map task2中取属于自己分区的数据
                        map task1 shuffle :
                            hadoop 1  --- reduce1
                            hadoop 1  --- reduce1
                            hadoop 1  --- reduce1
                            hadoop 1  --- reduce1
                            hbase 1   --- reduce1
                            hbase 1   --- reduce1
                        map task2 shuffle :
                            hadoop 1  --- reduce1
                            hadoop 1  --- reduce1
                            hadoop 1  --- reduce1
                            hadoop 1  --- reduce1
                            hbase 1   --- reduce1
                            hbase 1   --- reduce1
                    -》合并
                        -》将获取到的所有数据进行合并
                        -》对所有数据进行排序
                            hadoop 1  --- reduce1
                            hadoop 1  --- reduce1
                            hadoop 1  --- reduce1
                            hadoop 1  --- reduce1
                            hadoop 1  --- reduce1
                            hadoop 1  --- reduce1
                            hadoop 1  --- reduce1
                            hadoop 1  --- reduce1
                            hbase 1   --- reduce1
                            hbase 1   --- reduce1
                            hbase 1   --- reduce1
                            hbase 1   --- reduce1
                        -》分组:
                            hadoop ,{1,1,1,1,1,1,1,1}
                            hbase ,{1,1,1,1}
                
            -》第二种版本
                -》spill(溢写)
                    -》分区
                    -》排序
                    -》spill
                -》merge(合并)
                    -》合并
                    -》排序
                -》merge(合并)
                    -》合并
                    -》排序
                    -》分组
        -》reduce
        -》output
        
    -》程序中设置shuffle过程
        //shuffle
        //partition
        job.setPartitionerClass(null);
        //sort
        job.setSortComparatorClass(null);
        //group
        job.setGroupingComparatorClass(null);
        
    -》shuffle的优化
        -》combiner:相当于Mapper端的聚合reduce
            一般情况下,combiner的类与reduce的类是同一个类
            不是所有的MapReduce程序都可以使用、
            map:
                hadoop 1
                hadoop 1
                hive 1
                hbase 1
                hive 1
            shuffle:
                hadoop {1,1}
                hbase {1}
                hive {1,1}
            reduce:
                hadoop 2
                hbase 1
                hive 2
                
            map:
                hadoop 1
                hadoop 1
                hive 1
                hbase 1
                hive 1
            一个maptask执行完的shuffle:combiner
                hadoop {2}
                hbase {1}
                hive {2}
            整个shuffle结束
                hadoop {2,2,1}  => {1,1,1,1,1}
                hbase {1,2}
                hive {2,3}
            reduce:
                hadoop 5  
                hbase 3
                hive 5
                
            //set combiner class
            job.setCombinerClass(null);
            一般情况下,combiner的类与reduce的类是同一个类
            当map的输出类型与reduce的输出类型一致时,可以使用
            
            map 输出 = combiner 的输入
            combiner = reduce
            combiner输出 = reduce的输入

            
        -》compress:压缩
            -》map处理数据交给shuffle
                map端shuffle处理以后的数据可以配置压缩
                mapreduce.map.output.compress=true
                mapreduce.map.output.compress.codec
            -》reduce读取数据处理以后存储输出也可以配置压缩
                输出结果压缩
                mapreduce.output.fileoutputformat.compress=true
                mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.DefaultCodec
                
                org.apache.hadoop.io.compress.DefaultCodec:不压缩
                org.apache.hadoop.io.compress.SnappyCodec:Snappy压缩
                org.apache.hadoop.io.compress.lz4Codec:lz4压缩
                
                -》代码中设置压缩
                conf.set("mapreduce.output.fileoutputformat.compress","true");
                conf.set("mapreduce.output.fileoutputformat.compress.codec","org.apache.hadoop.io.compress.SnappyCodec");
                
    -》job处理任务运行过程
        -》一般DataNode与NodeManager在同一台机器
        -》处理任务时,优先处理自己机器上的数据块
    -》hadoop运行时配置
        -》代码开发中:configuration对象中
            conf.set("fs.defaultFS","hdfs://hostname:8020");
        -》default配置文件:hadoop的默认配置文件
            core-default.xml
            hdfs-default.xml
            mapred-default.xml
            yarn-default.xml
        -》site配置文件:用户自定义配置文件
            core-site.xml
            hdfs-site.xml
            mapred-site.xml
            yarn-site.xml
        -》整个hadoop在运行过程中:
            -》加载所有默认配置选项
            -》加载用户自定义配置
                用户自定义配置替换默认配置
                
                
三、分布式集群部署
    -》虚拟机:三台
        -》内存:8G
            -》主节点:2.5G
            -》从节点:1.5G
    -》集群划分:
            NameNode,DataNode,ResourceManager,NodeManager,JobhistoryServer
        Node1:DataNode        NodeManager        NameNode    ResourceManager     JobhistoryServer
        Node2:DataNode        NodeManager        
        Node3:DataNode        NodeManager
        
    -》部署过程
        -》Linux部署
            -》每台网络:防火墙、selinux、ip
                Node1:192.168.134.221
                Node2:192.168.134.222
                Node3:192.168.134.223
            -》主机名的修改
                -》临时修改:hostname bigdata-training02.hpsk.com
                -》永久修改:vim /etc/sysconfig/network
            -》每台本地域名解析/etc/hosts
                192.168.134.221 bigdata-training01.hpsk.com
                192.168.134.222 bigdata-training02.hpsk.com
                192.168.134.223 bigdata-training03.hpsk.com
            -》免密钥登录:每台机器之间可以互相登录
                ssh-keygen -t rsa
                ssh-copy-id bigdata-training01.hpsk.com
                ssh-copy-id bigdata-training02.hpsk.com
                ssh-copy-id bigdata-training03.hpsk.com
            -》ntp时间同步
                -》配置ntp:有延迟,十分钟左右才开始同步成功
                    server机器:Node1  -》 时钟服务器进行同步
                        Node1:
                            sudo vim /etc/ntp.conf
                            --允许谁同步我
                            restrict 192.168.134.0 mask 255.255. 255.0 nomodify notrap
                            --我跟谁同步
                            server 202.112.10.36
                            --取消注释
                            server  127.127.1.0     # local clock
                            fudge   127.127.1.0 stratum 10
                        -》启动ntp服务
                            sudo service ntpd start
                            sudo chkconfig ntpd on
                        -》查看同步状态
                            ntpstat
                    client机器:Node2,Node3
                        server 192.168.134.221
                        -》第一次手动同步
                            ntpdate –u 192.168.134.221
                        -》启动服务
                            sudo service ntpd start
                            sudo chkconfig ntpd on
                    
                -》准备方法:
                    sudo date -s "2018-03-20 16:07:00"
                    sudo vim /etc/ntp.conf        
            -》jdk
        -》Hadoop部署
            -》在1上面解压配置hadoop
                -》env:JAVA_HOME
                -》core-site
                    hdfs地址
                    hadoop临时目录
                -》hdfs-site
                    副本数 3
                    权限关闭
                -》mapred-site
                    运行框架在yarn
                    jobhistoryserver
                -》yarn-site
                    mapreduce运行方式
                    resourcemanager的地址
                    日志聚集
                -》slaves
            -》将hadoop分发到其他两台机器
                1 to 2 :
                    scp -r hadoop-2.7.3 [email protected]:/opt/modules/
                3 from 1:
                    scp -r [email protected]:/opt/modules/hadoop-2.7.3 /opt/modules/
            -》在1主节点上格式化
                bin/hdfs namenode -format
            -》启动测试
        
        
        
        
        
        
        
        
        
        
        
       

猜你喜欢

转载自blog.csdn.net/weixin_37254888/article/details/79704126