經過本教程您能夠學習到:html
爲了接下來對一些內部機制有所瞭解,咱們先來了解一下網絡拓撲的概念。java
在本地網絡中,兩個節點被稱爲「彼此近鄰」是什麼意思?node
在海量數據處理中,主要限制因素是節點之間數據的傳輸速率——帶寬很稀缺。這裏的想法是將兩個節點間的帶寬做爲距離的衡量標準。web
咱們來了解一個概念:節點距離——兩個節點到達最近的共同祖先的距離總和。這個概念,是否也能夠理解爲拓撲網絡中兩個節點的最短路徑呢(只不過每條邊的邊長都爲1)?(想起了大學時OJ題目中各類最短路徑的算法題。)算法
例如,假設有數據中心d1機架r1中的節點n1。該節點能夠表示爲/d1/r1/n1。利用這種標記,這裏給出四種距離描述。 Distance(/d1/r1/n1, /d1/r1/n1)=0(同一節點上的進程) Distance(/d1/r1/n1, /d1/r1/n2)=2(同一機架上的不一樣節點) Distance(/d1/r1/n1, /d1/r3/n2)=4(同一數據中心不一樣機架上的節點) Distance(/d1/r1/n1, /d2/r4/n2)=6(不一樣數據中心的節點)shell
當咱們節點的數目比較多,而副本數比較少的狀況下。例如多個DN,3個relication。集羣對於選擇節點存儲的策略是什麼樣的呢?apache
一、參考文檔數組
二、低版本Hadoop副本節點選擇網絡
咱們能夠看到,這樣作的目的就是爲了使各個副本之間的節點距離儘量的短。app
三、Hadoop2.7.2副本節點選擇
咱們能夠看到,2.7版本在舊版本的基礎上,再一次縮短了第一個副本和第二個副本節點之間的距離。而第三個副本存儲在其餘的機架上則是爲了保證高可用,避免同個機架壞了致使文件不可用(否則都往一個機架裏面存儲)。
爲了接下來讀機架感知策略進行驗證,咱們須要在原來3臺機器的基礎上,添加新的節點,也就是4個節點的集羣。
192.168.102.132 h132 192.168.102.133 h133 192.168.102.134 h134 192.168.102.135 h135
在原來的基礎上添加一臺h132節點便可。
一、關閉全部服務
[root@h133 ~]# stop-dfs.sh [root@h134 ~]# stop-yarn.sh [root@h133 ~]# xcall $JAVA_HOME/bin/jps -------------localhost---------- ----------h133--------- 6253 Jps ----------h134--------- 4233 Jps ----------h135--------- 5140 Jps
h134執行
stop-yarn.sh
,h133上執行stop-dfs.sh
.
二、修改主機名、主機名文件、h133和h134到h132的ssh無密碼登陸。
[root@h132 ~]# hostname h132 [root@h133 ~]# ssh-copy-id h132 [root@h134 ~]# ssh-copy-id h132
三、將h13三、h134以及h135的以前的集羣信息所有刪除。
xcall rm -rf /opt/module/hadoop-2.7.2/data /opt/module/hadoop-2.7.2/logs/
這是很暴力的作法,之後咱們會講到如何增長服役節點,那種纔是最合理的增長集羣節點的方式——暴力方式只推薦測試使用。
四、將xcall以及xsync腳本複製到h132,使用xshell同步編輯全部機器,一次性編輯全部文檔,使其兼容h132主機的存在。(修改循環的下限而已)
五、將h133的/opt/module/hadoop-2.7.3.tar.gz複製到h132節點的相同位置,這樣全部的配置文件就保持一致了。
五、xshell所有會話工具設置服役節點配置文件{hadoop_home}/etc/hadoop/slaves,增長h132。
h132 h133 h134 h135
這樣,全部的準備工做就完成了。
六、在namenode所在節點h133上格式化namenode:
[root@h133 hadoop]# hdfs namenode -format 19/01/03 15:00:18 INFO namenode.NameNode: STARTUP_MSG: ...
hadoop namenode -format已經被標註爲要過期了。
七、在namenode所在節點h133上啓動dfs相關守護進程
[root@h133 hadoop]# start-dfs.sh Starting namenodes on [h133] h133: starting namenode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-root-namenode-h133.out h134: starting datanode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-root-datanode-h134.out h132: starting datanode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-root-datanode-h132.out h135: starting datanode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-root-datanode-h135.out h133: starting datanode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-root-datanode-h133.out Starting secondary namenodes [h135] h135: starting secondarynamenode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-root-secondarynamenode-h135.out [root@h133 hadoop]# xcall $JAVA_HOME/bin/jps -------------localhost---------- ----------h132--------- 14979 Jps 14905 DataNode ----------h133--------- 8130 NameNode 8457 Jps 8252 DataNode ----------h134--------- 4786 Jps 4712 DataNode ----------h135--------- 5730 DataNode 5864 Jps 5820 SecondaryNameNode
能夠看到,咱們已經擁有4個數據節點了。
八、在resourceManager所在節點h134上啓動yarn相關守護進程
root@h134 hadoop]# start-yarn.sh starting yarn daemons starting resourcemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-root-resourcemanager-h134.out h132: starting nodemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-root-nodemanager-h132.out h133: starting nodemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-root-nodemanager-h133.out h135: starting nodemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-root-nodemanager-h135.out h134: starting nodemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-root-nodemanager-h134.out [root@h134 hadoop]# xcall $JAVA_HOME/bin/jps -------------localhost---------- ----------h132--------- 14905 DataNode 15017 NodeManager 15116 Jps ----------h133--------- 8496 NodeManager 8130 NameNode 8597 Jps 8252 DataNode ----------h134--------- 4835 ResourceManager 4934 NodeManager 4712 DataNode 5215 Jps ----------h135--------- 5730 DataNode 6007 Jps 5820 SecondaryNameNode 5903 NodeManager
九、測試一下集羣是否穩定。
[root@h133 hadoop]# hadoop fs -mkdir -p /user/zhaoyi/input [root@h133 hadoop]# hadoop fs -ls -R /user drwxr-xr-x - root supergroup 0 2019-01-03 15:14 /user/zhaoyi drwxr-xr-x - root supergroup 0 2019-01-03 15:14 /user/zhaoyi/input
OK,咱們開始測試。
在以前的項目下,建立以下的類,實現接口DNSToSwitchMapping:
package com.zhaoyi; import org.apache.hadoop.net.DNSToSwitchMapping; import java.util.ArrayList; import java.util.List; public class MyRockMapping implements DNSToSwitchMapping { public List<String> resolve(List<String> names) { // rack list List<String> racks = new ArrayList<String>(); int ipNum = 0;// will be 132,133,134,135 // 獲取機架IP if(names != null && names.size() > 0){ for (String name: names) { if(name.startsWith("h")){//host name ipNum = Integer.parseInt(name.substring(1)); }else{// ipv4 ipNum = Integer.parseInt(name.substring(1 + name.lastIndexOf("."))); } } if(ipNum <= 133){//132,133 racks.add("/dd/rack1" ); }else{//134,135 racks.add("/dd/rack2"); } } return racks; } public void reloadCachedMappings() { } public void reloadCachedMappings(List<String> names) { } }
咱們實現resolve方法,該方法的輸入參數爲集羣中各臺主機名(或者IP,咱們要作兼容),輸出則爲咱們自定義的機架名稱數組,以此來覆蓋Hadoop集羣默認org.apache.hadoop.net.ScriptBasedMapping
進行機架設置行爲。能夠看到,咱們將132和133歸爲rack1,134和135歸爲rack2。
使用maven打包:
mvn package
將生成的jar包(我這裏名爲firsthadoop-1.0-SNAPSHOT.jar
(和項目名一致),沒多大影響)拷貝到集羣全部機器的/opt/module/hadoop-2.7.2/share/hadoop/common/lib下。
一、修改配置文件core-site.xml(/opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml),使HDFS使用咱們的Mapping。
<!-- Topology Configuration --> <property> <name>net.topology.node.switch.mapping.impl</name> <value>com.zhaoyi.MyRockMapping</value> </property>
com.zhaoyi.MyRockMappin是咱們實現類的namespace+classname,請注意和你的保持一致
net.topology.node.switch.mapping.impl的默認值爲
org.apache.hadoop.net.ScriptBasedMapping
.
二、重啓集羣
#### 中止集羣 [root@h134 hadoop]# stop-yarn.sh [root@h133 lib]# stop-dfs.sh [root@h133 hadoop]# xcall $JAVA_HOME/bin/jps -------------localhost---------- ----------h132--------- 15652 Jps ----------h133--------- 10277 Jps ----------h134--------- 6283 Jps ----------h135--------- 6807 Jps #### 啓動集羣 [root@h133 lib]# start-dfs.sh [root@h134 hadoop]# start-yarn.sh [root@h133 lib]# xcall $JAVA_HOME/bin/jps -------------localhost---------- ----------h132--------- 15794 NodeManager 15690 DataNode 15917 Jps ----------h133--------- 10392 NameNode 10520 DataNode 10684 NodeManager 10878 Jps ----------h134--------- 6322 DataNode 6437 ResourceManager 6854 Jps 6542 NodeManager ----------h135--------- 7010 NodeManager 7139 Jps 6845 DataNode 6943 SecondaryNameNode
注意中止、啓動順序,以及在不一樣的機器上運行命令(注意個人copy代碼前面對應的主機名)
三、查看機架信息
[root@h133 lib]# hdfs dfsadmin -printTopology Rack: /dd/rack1 192.168.102.132:50010 (h132) 192.168.102.133:50010 (h133) Rack: /dd/rack2 192.168.102.134:50010 (h134) 192.168.102.135:50010 (h135)
很明顯,咱們的機架已經將分組成功的劃分了。接下來,咱們開始測試上傳文件。
目前,咱們將132和133歸爲rack1,134和135歸爲rack2。
根據咱們前面的分析,根據上傳節點的不一樣:
若咱們從h133上上傳,則因爲h132和h133位於同一機架。所以文件有兩份副本確定分別存儲在h132和133上,剩下的一份隨即在h134和135上;
若是咱們在h134上上傳文件,則其中2份在h134和h135上,剩下的一份隨機存在h132或者h133上。
經過web界面點擊上傳的文件能夠了解到上傳文件副本所在的節點信息,你也能夠經過查看namenode的日誌查詢文件上傳過程當中的相關信息。
[root@h13xxxx ~]hadoop fs -put h13xxx.txt /user
一、在h132上傳文件h132.txt,從web查看h132.txt文件的分組信息
二、在h133上傳文件h133.txt,從web查看h133.txt文件的分組信息
三、在h134上傳文件h134.txt,從web查看h134.txt文件的分組信息
四、在h135上傳文件h135.txt,從web查看h135.txt文件的分組信息
徹底相反的結論,也就是說,2.7.2表現的結果是咱們以上的理論中,低版本的表現形式。
總結下來,咱們2.7.2目前的表現形式爲:
這個問題,之後咱們回頭再看看看是那裏有問題。至少目前咱們懂得了一些頗有意思的東西,好比說機架、好比說HDFS文件處理的部分原理。