hadoop_2_完全分布式高可用

1    hadoop 中的高可用,后面所有内容都在高可用中

2    HDFS 的高可用,针对namenode(管理节点)
    当namenode内存受限时,增加namenode节点叫HDFS的联邦
    
3    HDFS HA  namenode  高可用,zookeeper 主、备

4    hadoop2.0 完全分布式 高可用,注意与keepalived不同的是 主namenode 被 备namenode接管后,若主namenode再起来是
    不会被主namenode接管回去的
    被接管的前提是 是两个namenode的元数据必须一样
    (启动初始化(fsimage,formate格式化时生成,(格式化时会把把数据上传到JN,以供合并)格式化完成后为了保持一致,要复制到backup namenode中)、
    运行过程中(edits)记录操作日志,例如添加删除树信息)
    所以只能在任意一台上格式话,edits文件要共享--放在一共享目录,权限开放。
    namenode的高可用就是 NFS(网络文件共享),在这里edits并没有放在网络共享文件里,
    而是采用了另一种高可用方式,放到JN中,独立的集群 3台JN(HDFS集群),JournalNodes(这3台JN,内部实时同步的,它也负责edit文件、fsimage文件合并,
    然后复制到2个namenode中),系统启动的过程中,datanode会汇报它的位置信息给2个namenode
    
    接下来 zookeeper 它本身也是一个内存数据库集群(存每一台namenode的状态
    ,例如心跳状态,心跳数据由failoverController这个节点发送的,它还有一个功能
    是负责自动切换namenode,可见failoverController(ZKFC)是zookeeper和namenode的桥梁,它和namenode在同一台机子上。
    每一个namenode都要有一个failoveController,它们是在同一台机器两个进程而已
    3个zookeeper它们之间是备份,实时通讯),它可以为任何服务做高可用
    
    真是企业会有两个集群一个商业的集群(至少10台),一个测试的集群
    
    namenode的内存不够的解决方案是 联邦(每个都各自独立,HA独立,共享datanode) 一般企业少用,因为很少有元数据超过128G的,
    电信行业会用,会用3个namenode来用 1个存流量1个存短信等,因为数量级很难达到
    
    每一个namenode有一个id号,是供zookeeper用的
    
    hdfs-site 配置 namenode 时配置2个协议的 1 rpc是进程之间的通信 2 http,http是供web页面的
    
    qjm  就是 journalNode集群的意思
    
    同一服务器两进程状态之间的切换,其实是一个进程远程登录到本地来访问另一个进程,所以journalnode去
    访问namenode要配置私钥
    
    core-site.xml 配置公共的属性
    hdfs-site.xml 配置hdfs的属性
    
    zookeeper 中的内存数据和磁盘上的数据是一一映射的,启动的时候加载到内存,停掉时再写到磁盘
    
    3个zookeeper是副本,没有master
    
    zookeeper配到core-site.xml 因为 yarn的集群也要做高可用,yarn的高可用也是用zookeeper的
    
    最后单独买服务器,如果实在没办法,可以一台机器公用节点
    
    
    搭建zookeeper高可用集群:

    1     配置zookeeper 环境变量
        export ZOOKEEPER_HOME=/home/zookeeper-3.4.6
        export PATH=$PATH:$ZOOKEEPER_HOME/bin
    
    
    2   配置zookeeper设置
        /home/zookeeper-3.4.6/conf
        vi zoo.cfg
        zookeeper配置文件官方文档http://zookeeper.apache.org/doc/r3.4.6/zookeeperStarted.html
        tickTime=2000
        dataDir=/opt/zookeeper
        clientPort=2181
        initLimit=5
        syncLimit=2
        server.1=hadoop-node1:2888:3888  1  2   3  为服务编号
        server.2=hasoop-node2:2888:3888
        server.3=hadoop-node3:2888:3888
        
        3台都执行 1 mkdir /opt/zookeeper
                  2 vim /opt/zookeeper/myid        
        (分别是 1 2 3)每一个zookeeper进程中都数据文件夹下都应该有一个叫myid的文件,记录服务编号
    3    拷贝zookeeper文件到其他机器(拷贝前删掉doc)
    4    注意3台一起启动 zkServer.sh start
        zookeeper的日志文件,默认是在哪里启在哪里产生日志文件 zookeeper.out
        启动后,内存数据库也就起来
        登录到数据库(3台zookeeper是副本)
        zkCli.sh
        ls /  可见zookeeper数据库是一个文件系统
        quit退出
        
5    搭建完全分布式的HA集群
    在之前搭建好完全分布式后,它会在hadoop目录中会产生一个 version
    cd /opt/hadoop-2.5.1/dfs/data/current
    
    所以要搭建新的 HA集群要删掉  hadoop目录
    rm -rf /opt/hadoop-2.5.1/
    这样再次搭建时会它会给新建一个version
    rm -rf /home/hadoop-2.5.1/etc/hadoop/masters
    搭建过程:
    hadoop-node1 和 hadoop-node4是namenode  hadoop-node2、hadoop-node3、hadoop-node4 是datanode
    hadoop-node1、hadoop-node2和hadoop-node3是zookeeper
    hadoop-node1 和 hadoop-node4是recourceManager
        1 修改配置文件
            cd /home/hadoop-2.5.1/etc/hadoop/
            文档地址 file:///D:/hadoop/hadoop-2.5.2/share/doc/hadoop/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html
            org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
        2  rm -rf /home/hadoop-2.5.1/etc/hadoop/masters 删除master因为没有secondnamenode,4台都删除
            cd /home/hadoop-2.5.1/etc/hadoop
            vi slaves 内容:
            hadoop-node2
            hadoop-node3
            hadoop-node4
            
            拷贝配置文件到其他机器
            scp core-site.xml hdfs-site.xml root@hadoop-node2:/home/hadoop-2.5.1/etc/hadoop/
        3   zookeeper启动了,配置同步了,接下来初始化namenode和同步namenode
            1  启动JN (在hadoop-node1 hadoop-node2 hadoop-node3上启动,因为JN服务器有两个节点,因为JN和datanode必须是一对一的)那么启动单节点
                命令: hadoop-daemon.sh start journalnode
            2  在2个namenode上,选择任意一台格式化,我选择 hadoop-node4    
                    hdfs namenode -format
                    格式化成功后会在 opt下产生一个hadoop目录(这才是我们元数据的目录)
                
            3  同步元数据:
               把元文件拷贝过来,拷贝到hadoop-node1
                scp -r root@hadoop-node4:/opt/hadoop-2.5.1 /opt(反向拷贝,因为做了免登陆)
            4  元数据同步后,要格式化 zkfc (把namenode和zookeeper搭桥)
                在任意一台namenode上执行
                hdfs zkfc -formatZK (注意:ZK大写)
                因为zkfs要互相切换所以两台要互相免密
                在hadoop-node4上的公钥发送到hadoop-node1
                scp ~/.ssh/id_dsa.pub root@hadoop-node1:/opt
                 cat /opt/id_dsa.pub >> ~/.ssh/authorized_keys
            5    全部配置初始化完
                启动 start-dfs.sh
            6   判断是否能接管
                在namenode上jps
                全部停止hadoop命令
                stop-dfs.sh
                启动单个节点 hadoop-daemon.sh start namenode
                
6   计算框架MapReduce  编程(分布式计算框架,离线计算也叫批量计算)
    storm 是来一点计算一点(几M几k)每计算一次出结果,它不适合计算一完整的准备好的数据
    MapReduce 是批量计算 例如:这个准本好,或者给定一个范围内的数据
    MapReduce的环境是yarn
    
    MapReduce 是移动计算,而不是移动数据
        分布式计算其实也叫网格计算,是跨网络的,有一个一个的节点
        
    离线计算,流式计算,内存计算统称为分布式计算
    
    1个MapReduce 程序在计算框架中运行的时候它是按照4个步骤来进行的
        
        1 切 切成若干个小的数据片段 这里不用你写代码,计算框架帮你做
            切的时候它是按照行切的,这是规则
        
        2 map 执行程序 (maptask程序,每一个数据片段对应一个maptask线程)
            先拿到这一行数据,一个小碎片端可能是几百兆,如果活都让它做了,太慢
            所以它只做找出功能,然后就输出
            
            maptask的数量是由碎片段的多少来决定的
            注意,数据块有3个备份,maptask它优先在cpu空闲的机器上计算
        
        3 洗牌 对map计算之后的结果进行洗牌,排序、分组、合并、跨网络传输、序列化、反序列化
        
        4 reduce reducetask
            reduce是一组一组的接收顺序的。
            默认只有一个 reducetask任务,可以根据不同需求去设定
            
        
    MapReduce一个很大的一个优点是就近计算
    
    中间过程 Shuffler 洗牌原理
    
    整个流程我分了四步。简单些可以这样说,每个map task都有一个内存缓冲区,存储着map的输出结果,
    当缓冲区快满的时候需要将缓冲区的数据以一个临时文件的方式存放到磁盘,当整个map task结束后
    再对磁盘中这个map task产生的所有临时文件做合并,生成最终的正式输出文件,
    然后等待reduce task来拉数据。
        
        maptask洗牌
        maptask输出的数据肯定在内存,因为maptask是一个程序,待内存缓冲区的数据满是要写到
        磁盘,在写的过程中经过
        1    partition 分区 目的是决定这条数(一个key-value)据最后到哪个reduce中 所以
            partition之后会得到一个分区号,它有一个默认算法(根据key的 hashcode值对reducetask
            的数量取模)例如本案例中 有1个reducetask,任何一个数对1取模都是0,所以所有数据的分区号
            都是0
        2   sort 排序比较得到一个排序号,把内存中任意一条数据俩俩比较,默认算法是
            根据key的ascII吗比较的
        3   排完后合并(一个splitinput会有好多key-value)然后写到磁盘,依次循环,一直等到所有数据都写到磁盘
            
        上面的一系列操作都会在 maptask机子上maptask线程
    
    reducetask洗牌
        1   从各个maptask那台机子上去抓取数据(从磁盘读取数据),判断是否属于我的数据(
        根据partition得到的分区号),
        2   由于是从各个maptask上fetch的数据,所以要进行二次排序也就是再次比较分组,key相同的就分到一组,然后把这一组
        传给reducetask,传给程序也就是放到内存缓冲区,每计算一组就输出一组
        
    2次洗牌注意2点
        1  要涉及到网络传输
        2  设计到2次排序
        3  都要放到缓存
        
    map输出的每一个split块,依次进行partition sort group sort 传给 reduce  这是默认洗牌步骤
    
    combiner 合并(自己写的程序,根据key相同来进行合并的) 是为了减少map输出的数据(到reduce),这样在跨网络时就很快
    
    计算框架默认1 partition 默认算法是对reduce数量取模 2  排序算法默认是根据key的hashcode值 3 分组是key是否相同
    
    任何一个数据片段的大小不会超过blocksize,也 就是任何一个数据片段不会垮block
    
7    mapreduce执行的环境 YARN (也就是mapreduce在那台机器上执行)
    是hadoop 2.0 引入的资源管理系统
    资源管理  任务调度
    ResourceManager:负责集群的资源管理
    Application Master:负责应用程序相关的失误,比如: 任务调度、任务监控和容错
    (例如由于网络原因任务挂掉了,它会自动启动任务)
    
    YARN 程序运行的环境,它本身也是一个集群,有2个节点 ResourceManager 和 NodeManager(多个)(App Master在NodeManager进程里面有)
    
    在YARN运行环境里,
    1    客户端请求的的ResourceManager
    2    ResourceManager会把程序复制给 各个NodeManager (NodeMannager一定和dataNode在同一台机器上,就近计算原则)
    3   Application Master就开始负责程序的调用,调用之前会去找ResourceManager请求containers(资源的统称 包括cpu 内存 硬盘 网络),
    然后ResourceManager发现某一NodeManager上有资源,那么它会分配一个container(它就包括NodeManager的cpu 内存 硬盘 网络的统称 )
    其实container就是一个标志位,代表着nodeamager是否繁忙 内存 硬盘 网络空间是否都被占用
    在获得container之后,你就可以执行 maptask任务或者reducetask任务。任务时由Executer调用的,NodeManager会把执行状态汇报给ResourceManager
    
    关键点是:
    1  在执行maptask或者reducetask之前会先去ResourceManager哪里请求container。当NodeManager上繁忙时
    2  每一个datanode会有一个nodemanager,每一个nodemanager会有一个applicationMaster,applicationMaster就可以调了,
    3台applicationMaster调之前都会去请求ResourceManager的container,由ResourceManager来决定把container发给谁  对我们程序员来说,
    这一步是透明的,可以通过web页面来查看
    
    搭建的时候,只要找一个 ResourceManager就可以了,NodeManager会被自动创建在dataNode上
    ResourceManager也需要有高可用
    
    1    修改 /home/hadoop-2.5.1/etc/hadoop 中 vim yarn-site.xml
    2   修改/home/hadoop-2.5.1/etc/hadoop  mv mapred-site.xml.template mapred-site.xml vim mapred-site.xml (把mapreduce运行环境修改为 yarn)
    3   拷贝到hadoop-node 2 3 4 上
        scp yarn-site.xml mapred-site.xml root@hadoop-node2:/home/hadoop-2.5.1/etc/hadoop/
    
    
    启动yarn环境
        在hadoop-node1上
        start-yarn.sh 可见ResourceManager启动了
        但它并不会在hadoop-node4上自动启动ResourceManager(这是官方,此脚本的bug)
        所有要手动启动一下
        hadoop-node4上 输入 yarn-daemon.sh start resourcemanager
    
    注意3台一起启动 zkServer.sh start(分别是 1 2 3)
    全部关闭 start-all.sh 包括  yarn环境
    全部关闭 stop-all.sh 包括  yarn环境
    
    由于断电导致namenode都是stadby
    执行hdfs haadmin -transitionToActive --forcemanual nn1  重新切换active

你可能感兴趣的:(hadoop_2_完全分布式高可用)