大数据技术学习笔记之Hadoop框架基础5-Hadoop高级特性HA及二次排序思想

版权声明: https://blog.csdn.net/weixin_37254888/article/details/79704221
一、回顾
    -》shuffle流程
        -》input:读取mapreduce输入的
            默认:key是行的偏移量,value是行的内容
        -》map:负责将数据任务切分,过滤,筛选,转换等一系列的数据任务
        ·    一个块=一个分片=一个map task
        -》shuffle:分区、排序、分组
            -》map端的shuffle
                -》进入环形缓冲区,默认是100M
                    -》分区:给每一条keyvalue进行计算
                        按照key的hash取余,分配属于哪个进行处理,打标签
                    -》排序:将每个分区内的数据进行排序
                -》达到80%,开始执行溢写,将数据写入磁盘
                    -》多个小文件生成
                    -》合并:将多个小文件合并成一个大文件
                        -》排序:将相同分区的数据进行排序
                -》map task 通知app  master任务执行结束,app master通知reduce
            -》reduce端的shuffle
                -》reduce task通过http协议去每个map task的磁盘中拉取属于自己分区的数据
                -》合并:将每个属于自己分区的数据进行合并
                    -》排序:将分区内所有的数据进行排序
                    -》分组:将相同key的value合并为一条
        -》reduce:对每条数据调用reduce方法进行处理,将处理后的结果进行合并
        -》output:将reduce处理后的结果进行输出,默认输出到hdfs
    -》分布式集群部署
        -》伪分布式部署
            -》Linux环境
                -》配置网络,ip,dns,gateway
                -》本地域名解析映射
                -》防火墙,selinux
                -》jdk
            -》hadoop环境
                -》下载安装hadoop
                -》修改配置文件
                    -》hadoop-env.sh/mapred-env.sh/yarn-env.sh
                        JAVA_HOME
                    -》core-site.xml/hdfs-site.xml/mapred-site.xml/yarn-site.xml
                        -》dfs.defaultFS/hadoop.tmp.dir
                        -》副本数、权限
                        -》mapreduce运行的框架、历史服务器
                        -》resourcemanager的地址,MapReduce运行方式,日志聚集
                    -》slaves:从节点的地址
                -》格式化:bin/hdfs namenode -format
                -》启动服务
                    ->sbin/hadoop-daemon.sh start namenode
                    ->sbin/hadoop-daemon.sh start datanode
                    ->sbin/yarn-daemon.sh start resourcemanager
                    ->sbin/yarn-daemon.sh start nodemanager
                    ->sbin/mr-history-job start historyserver
                    
        -》分布式
            -》Linux
                -》伪分布式配置
                -》SSH免密钥登录
                    ssh-keygen -t rsa
                    ssh-copy-id hostname
                -》Ntp时间同步
            -》hadoop配置
                -》下载安装
                -》修改配置
                    -》slaves
                -》分发到所有机器
                -》格式化
                -》启动
                
-》如何实现集群化的管理脚本
    -》在脚本中实现如下功能
        -》读slaves文件,拿到所有从节点的地址
        -》ssh 登录到每一个从节点上
            -》执行关闭命令
            ssh hostname2 -c '$HADOOP_HOME/sbin/hadoop-daemon.sh stop datanode'    
    
    
    
一、Hadoop HA
    -》hdfs HA
    -》yarn HA
    
    -》HA:high avilability高可用
        -》NameNode:active
        -》NameNode:standby  
        -》当active状态的NameNode出现故障、standby状态的NameNode会转换为active
        -》为了避免NameNode故障,导致整个hdfs集群不可用
    -》如何去实现HA
        -》安装两个NameNode,怎么去启动?
        -》谁作为active?谁作为standby?
        -》对外开放的端口是一致的,用户如何区分谁是active?
        -》如何active故障了,standby如何同步active的元数据?
        -》active故障了,standby如何知道自己需要转换为active?
    -》zookeeper可以解决以上问题
        -》zookeeper分布式协调工具
            -》zookeeper的集群需要是奇数2N+1节点
            -》主从架构
                主:leader
                从:follower
            -》如果leader发生故障zookeeper内部会自动从所有follower中选举leader
        -》分布式文件系统:存储索引等关键信息,树形结构
        -》所有的节点都是公平节点
        -》功能:
            -》存储索引信息
            -》分布式协调锁服务
    -》zookeeper的安装部署:2N+1,企业中=5台
        -》伪分布式:
            -》下载安装
            -》修改配置文件
            -》启动server
        -》完全分布式
            -》下载安装
                tar -zxvf zookeeper-3.4.6.tar.gz -C /opt/modules/
            -》修改配置文件
                mv  zoo_simple.cfg zoo.cfg
                dataDir=/opt/modules/zookeeper-3.4.6/datas
            -》添加集群主机
                server.1=bigdata-training01.hpsk.com:2888:3888
                server.2=bigdata-training02.hpsk.com:2888:3888
                server.3=bigdata-training03.hpsk.com:2888:3888
            -》为每个节点分配id
                vim   datas/myid
            -》分发
            -》修改id
            -》启动server
                /opt/modules/zookeeper-3.4.6/bin/zkServer.sh start
            -》客户端
                /opt/modules/zookeeper-3.4.6/bin/zkCli.sh
    -》HDFS:HA
        -》NameNode:
            active:当前负责管理整个集群的NameNode
            standby:候补的NameNode
        -》DataNode:整个集群用于存储数据
            -》所有datanode会向所有的NameNode进行注册
        -》zk集群:负责协调NameNode
        -》zkfc:zookeeper failover controller
            -》z ookeeper与NameNode之间的中间人
            -》负责将自己监控的NameNode的信息发送给zookeeper
            -》将zookeeper发送过来的命令传递给NameNode
        -》journal node:日志节点,负责存储管理所有的操作信息(元数据)
            元数据(内存):
                本地:fsimage
                    edits+fsimage=fsimage
                    
    -》配置部署HA
        -》hdfs-site
                <!--HA中HDFS集群对外统一提供的入口名称-->
                <property>
                  <name>dfs.nameservices</name>
                  <value>mycluster</value>
                </property>
                <!--配置所有的NameNode的昵称-->
                <property>
                  <name>dfs.ha.namenodes.mycluster</name>
                  <value>nn1,nn2</value>
                </property>
                <!--配置每个NameNode对应的rpc内部通信地址-->
                <property>
                  <name>dfs.namenode.rpc-address.mycluster.nn1</name>
                  <value>bigdata-training01.hpsk.com:8020</value>
                </property>
                <property>
                  <name>dfs.namenode.rpc-address.mycluster.nn2</name>
                  <value>bigdata-training02.hpsk.com:8020</value>
                </property>
                <!--配置每个NameNode对应的web访问地址-->
                <property>
                  <name>dfs.namenode.http-address.mycluster.nn1</name>
                  <value>bigdata-training01.hpsk.com:50070</value>
                </property>
                <property>
                  <name>dfs.namenode.http-address.mycluster.nn2</name>
                  <value>bigdata-training02.hpsk.com:50070</value>
                </property>
                <!--配置共享元数据日志文件的存储机器地址-->
                <property>
                  <name>dfs.namenode.shared.edits.dir</name>
                  <value>qjournal://bigdata-training01.hpsk.com:8485;bigdata-training02.hpsk.com:8485;bigdata-training03.hpsk.com:8485/mycluster</value>
                </property>
                <!--配置共享元数据日志文件的实际存储地址-->
                <property>
                  <name>dfs.journalnode.edits.dir</name>
                  <value>/opt/modules/hadoop-2.7.3/journal-node</value>
                </property>
                <!--配置状态切换时所调用的类-->
                <property>
                  <name>dfs.client.failover.proxy.provider.mycluster</name>
                  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
                </property>
                <!--配置隔离,避免两个NameNode状态冲突-->
                <property>
                  <name>dfs.ha.fencing.methods</name>
                  <value>sshfence</value>
                </property>
                <property>
                  <name>dfs.ha.fencing.ssh.private-key-files</name>
                  <value>/home/hpsk/.ssh/id_rsa</value>
                </property>
        -》core-site
                <property>
                    <name>fs.defaultFS</name>
                    <value>hdfs://mycluster</value>
                </property>
        -》分发配置文件
        -》配置手动切换步骤
            -》启动所有的journalnode
                sbin/hadoop-daemon.sh start journalnode
            -》进行格式化:nodel
                bin/hdfs namenode -format
            -》启动node1的NameNode
                sbin/hadoop-daemon.sh start namenode
            -》在node2中同步node1的元数据
                sbin/hdfs namenode -bootstrapStandby
            -》启动node2的NameNode
                bin/hadoop-daemon.sh start namenode
            -》指定node1为active
                bin/hdfs haadmin -transitionToActive nn1
            -》手动kill node1的NameNode,手动切换到node2
                bin/hdfs haadmin -transitionToActive --forceactive  nn2
        -》配置自动切换
            -》在手动切换的基础上:
                hdfs-site:
                    <!--配置自动故障转移-->
                     <property>
                       <name>dfs.ha.automatic-failover.enabled</name>
                       <value>true</value>
                     </property>
                core-site
                    <!--配置zookeeper的地址-->
                     <property>
                       <name>ha.zookeeper.quorum</name>
                       <value>bigdata-training01.hpsk.com:2181,bigdata-training02.hpsk.com:2181,bigdata-training03.hpsk.com:2181</value>
                     </property>
                -》启动:
                    -》分发配置文件
                    -》先启动zookeeper
                    -》格式化zk
                        bin/hdfs zkfc -formatZK
                    -》启动每个进程
                        -》启动所有journalnode
                        -》启动所有NameNode
                        -》启动所有的DataNode
                        -》启动所有的zkfc
                            sbin/hadoop-daemon.sh start zkfc
                        
    -》hadoop2.x与1.x(1.x和0.x)的区别
        -》2.x中包括了yarn资源管理和任务调度模块,分解了原先MapReduce的任务
        -》2.x拥有高可用架构,避免了单点问题
        -》2.x 拥有Federation 联盟机制
            -》用于多个NameNode的应用
            -》允许有多个active的NameNode
    -》hadoop3.x与2.x的区别
        -》大部分端口进行了修改
        -》jdk版本要求最低1.8
        
        
三、二次排序
    -》需求:
        输入:                        输出:
            a    5                    a    1
            c    6                    a    5
            a    1                    b    1
            b    1                    c    3
            c    3                    c    5
            
    -》MapReduce实现
        -》input:
            <0,a    1>
            
        -》map
            key:a
            value:1
        -》shuffle
        -》reduce
            输入:
                a,{5,1}
                b,{1}
                c,{6,3}
            reduce :
                
            输出:
            key:字母
            value:数字
        —》output
        
    -》对于大数据处理上面方法不可行
        -》二次排序实现
            -》input
                
            -》map:自定义数据类型:String int
                原先:a,5
                二排:
                    a#5,5
                    c#6,6
                    a#1,1
                    b#1,1
                    c#3,3
            -》shuffle
                -》默认按照key进行分区,分组,排序
                    {a#1-a#5,{1,5}}
                -》分区:按照key的第一个值进行分区
                -》分组:按照key的第一个值进行分组
            -》reduce
                直接输出
            -》output
            
        -》先编写自定义数据类型
            String key1
            int key2


    
    
       

猜你喜欢

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