大資料技術學習筆記之Hadoop框架基礎5-Hadoop高階特性HA及二次排序思想
阿新 • • 發佈:2018-12-07
一、回顧
-》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
-》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