1. 程式人生 > >大資料技術學習筆記之Hadoop框架基礎5-Hadoop高階特性HA及二次排序思想

大資料技術學習筆記之Hadoop框架基礎5-Hadoop高階特性HA及二次排序思想

一、回顧
    -》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