一、HDFS基礎架構
1、HDFS特點:水平擴展、高容錯性、廉價硬件、開源生態系統
2、Hadoop生態圈
1)、分布式存儲系統(HDFS),2)、資源管理框架(YARN),3)、批處理框架(MapReduce、Pig),4)、數據倉庫(Hive),5)、NoSQL系統(HBase、Drill),6)、OLAP系統(Impala、Presto、Spark(SQL)),7)、實時流計算框架(Storm、Spark(Streaming)、Flink),8)、機器學習框架(Mahout、Spark(MLlib)),9)、消息隊列(Kafka),10)、分布式協同服務(Zookeeper),11)、作業調度系統(Oozie),12)、全文檢索系統Solr
3、HDFS架構
相關概念:Rack 機架:存儲節點放在不同機架上,這與數據備份放置策略有關
Block 數據塊:數據切分成特定大小的數據塊,分發到不同存儲節點
Replication 副本:數據塊在不同存儲節點之間,通過復制方式來拷貝
1)、NameNode(管理節點):負責名稱空間管理,管理元數據;負責文件到數據塊的映射,以及數據塊和存儲節點對應關系
2)、DataNode(數據存儲節點):向管理節點匯報數據塊信息;存儲節點之間通過復制操作來實現數據均衡和備份;與客戶端交互,執行數據讀寫請求
3)、Client(客戶端):向NN/DN發起讀寫請求
4、HDFS讀寫
1)、HDFS Read
a、客戶端向NN發起讀請求
b、NN返回請求文件的數據塊所在的存儲節點列表,如果有多個塊,會返回多個存儲列表,因為一個數據塊對應一個存儲節點
c、客戶端根據返回的節點列表,優先選擇最近的節點訪問
d、選完節點后,客戶端直接與DN節點連接讀取相應的Block數據,讀完這個Block后關閉連接
e、如果文件有多個數據塊,客戶端再次選擇下一個Block所在節點,進行連接,重復上述過程
f、已經讀完最后一個數據塊后,關閉與NN連接
2)、HDFS Write
a、客戶端向NN發起寫請求
b、NN返回需要寫入文件的數據塊所在的存儲節點列表
c、客戶端根據返回的節點列表,優先選擇最近的節點創建鏈接;如果該客戶端在DN節點上,則優先寫本地節點
d、客戶端與第一個DN節點建立TCP鏈接,然后該DN節點會根據客戶端傳遞過來的節點信息,依次創建下一個DN節點的鏈接。以及第二個DN節點到第三個DN節點的鏈接。這個過程稱為創建DataNode管道
e、客戶端先寫第一個數據包,待第一個節點收到該數據包后,由其向下一個節點發送這個數據包,直至到第三個節點
f、在最后一個節點完成數據包的接收后,向第二個節點發送確認信息;第二個節點收到確認信息后,將自己的確認信息發送給第一個節點,然后第一個節點將確認信息發送給客戶端。客戶端收到這個數據包的確認信息后,才會發送下一個數據包,如此反復
g、當第一個數據塊寫完后,客戶端關閉這個DataNode管道。如果還有數據塊,則創建一個新的數據管道開始寫入數據
h、數據寫完后,客戶端關閉
5、副本放置策略 下圖,n1234\node為節點即服務器,r123\rack為機架,d12\data center為數據中心;黃塊為數據塊;藍塊為客戶端;
d=0246為客戶端到存儲塊節點距離,local為d=0,同rack為d=2,同數據中不同rack為d=4,不同數據中心為d=6
定義節點訪問距離,可以降低網絡訪問流量開銷,提高訪問性能
NN來選擇數據塊的放置節點,它按照機架配置來選擇節點。如果是3副本放置策略,優先放入到離寫入客戶端最近的DN節點;然后是該節點同機架上的一個節點;最后是與該節點不在同一機架上的節點。
選擇節點輔助策略:隨機選擇一個節點,隨機選擇兩次,返回磁盤使用率較低的一個節點
二、部署配置
1、部署安裝
一般參數列表
fs.defaultFS HDFS的名稱空間地址
dfs.blocksize 塊大小,默認是64M或128M,文件存儲的時候,如果大於指定塊大小,則切分,如果小於,則按照文件大小存儲,並不會占用指定塊大小
dfs.replication 備份數,默認為3
dfs.reservedsize 磁盤保留空間,默認未開啟
dfs.namenode.edit.dir NN的edit日志存放路徑,edit日志文件編號前后連接,如果中間有斷鏈,那么說明文件缺失
dfs.namenode.name.dir NN的image文件(元數據)存放路徑
dfs.datanode.data.dir DN的數據存儲目錄,可以選擇存儲在多個目錄下,多個目錄用逗號隔開
dfs.namenode.rpc-address NN的RPC服務端口號
dfs.namenode.http-address NN的HTTP服務端口號
dfs.datanode.address DN的RPC服務端口號,數據傳輸用
dfs.datanode.http.address DN的HTTP服務端口號
dfs.datanode.ipc.address DN的IPC端口號,與NN通信
fs.trash.interval 開起回收站,如果通過hdfs的shell命令刪除的數據會放到回收站,回收站默認清除時間為1小時,也可以自定義
2、部署實操
1)、配置javahome環境變量、可以使用scp命令(需要安裝SSH)上傳Hadoop軟件包
2)、使用tar -zxvf命令解壓hadoop軟件包;使用ln命令創建軟連接,如ln -s hadoop-2.7.7 hadoop-current
3)、配置Hadoop Home環境變量
a、cd ~
b、vi .bashrc 配置文件寫入如下圖
c、source .bashrc
d、hadoop命令查看配置是否正確,如下圖
4)、如果沒有配置全局Javahome環境變量,可以在Hadoop配置文件/root/dev/hadoop-2.7.7/etc/hadoop/hadoop-env.sh中配置,此文件也可以配置HadoopJVM相關參數
此處默認取環境變量JAVA_HOME
5)、配置HDFS的核心配置文件core-site.xml(/root/dev/hadoop-current/etc/hadoop/core-site.xml),NN、DN和YARN都會加載這個文件, vi core-site.xml 配置fs.defaultFS指向NN地址,其他用默認值(注意下面地址不能用localhost,否則只有本機才能訪問)
6)、配置hdfs-site.xml vi hdfs-site.xml
7)、格式化HDFS命令 hdfs namenode -format
原本dev文件夾下沒有hadoopnamedir,執行完命令后就有了
8)、啟動namenode服務 hdfs namenode
(一般端口會被防火牆限制,關閉或者放開端口,參考···········)
啟動服務后就可以通過WebUI訪問namenode了,地址:http://192.168.1.6:50070
9)、啟動datanode服務 hdfs datanode
原本dev文件夾下沒有hadoopdata/data/0,hadoopdata/data/1,hadoopdata/data/2,啟動服務后就有了(教程中使用 mkdir -p hadoopdata/data/{0..2}命令創建,Hadoop有權限創建情況下會自動創建,否則要自己創建)
在namenode的WebUI下就可以看到啟動的datanode了
10)、啟動另一個節點的datanode,方式類似以上
a、解壓Hadoop,創建軟連接
b、從上一個節點拷貝core-site.xml到本機 先切換到Hadoop配置文件目錄,后(注意命令最后的點,拷貝到當前文件夾,$PWD表示本機的Hadoop配置文件目錄和上一個節點Hadoop配置文件目錄一樣)scp root@192.168.1.6:$PWD/core-site.xml . 同樣的方式再拷貝hdfs-site.xml(教程中拷貝了hadoop-env.xml,由於我本地配置了javahome,所以就不用拷貝了)
c、由於我們使用上一個節點的namenode,所以我們只修改本機Hadoop配置文件hdfs-site.xml中datanode相關配置
改為
d、由於本機沒有配置HadoopHome環境變量,所以使用帶路徑方式或到bin下使用hdfs datanode命令啟動datanode服務
哎呀,不好,報錯了,此錯是由於解析hostname出錯,因為配置中使用的是IP
兩種解決辦法;第一種、使用hostname,在hosts文件中做好映射(沒測)
第二種、在hdfs-site.xml中添加配置如下 (namenode和datanode都配置)
<property>
<name>dfs.namenode.datanode.registration.ip-hostname-check</name>
<value>false</value>
</property>
添加了配置后,重新啟動datanode服務,刷新namenode節點對應的WebUI,看到datanode節點數為2
如果其中一個DataNode宕機,namenode要等很久才知道,如果查詢或獲取數據,正好訪問宕機節點,要達到最大嘗試次數
注意,如果出現類似異常java.io.IOException: Incompatible clusterIDs、java.io.IOException: All specified directories are failed to load需要將datanode存放數據的目錄刪掉,使用命令如 rm -rf hadoopdata
11)、測試hadoop fs命令
查看根目錄命令:hadoop fs -ls /
創建文件夾命令:hadoop fs -mkdir /tmp hadoop fs -mkdir -p /user/hjp hadoop fs -mkdir /user/hjp/input
上傳txt格式文件:hadoop fs -put *.txt /user/hjp/input
刪除指定文件:hadoop fs -rm /user/hjp/input/1.txt
查看文件內容命令:hadoop fs -text /user/hjp/input/1.txt
下載文件到本地並重命名:hadoop fs -get /user/hjp/input/1.txt 123.txt (比較兩個文件內容是否一樣,可以使用md5sum命令獲取md5值對比,如下圖)
12)、守護進程啟動datanode服務:dev/hadoop-current/sbin/hadoop-daemon.sh start datanode,其他DataNode和NameNode也類似此守護進程方式啟動
使用tail -f命令查看日志信息:tail -f /root/dev/hadoop-2.7.7/logs/hadoop-root-datanode-192.168.1.8.log
13)、YARN部署(master上啟動resourcemanager服務,slaves上啟動nodemanager服務)
a、YARN共用Hadoop的core-site.xml和hdfs-site.xml,只需配置YARN的yarn-site.xml和mapred-site即可
yarn-site.xml配置如下
<configuration>
<!-- Site specific YARN configuration properties -->
<!--RM WebUI地址-->
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>192.168.1.6:8088</value>
</property>
<!--RM域名-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>192.168.1.6</value>
</property>
<!--NM logs存放作業的日志輸出-->
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>/root/dev/yarn/0/logs,/root/dev/yarn/1/logs,/root/dev/yarn/2/logs</value>
</property>
<!--NM工作目錄-->
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/root/dev/yarn/0/local,/root/dev/yarn/1/local,/root/dev/yarn/2/local</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
mapred-site.xml配置如下(Hadoop配置目錄下沒有mapred-site.xml,而又mapred-site.xml.template。配置目錄下使用cp mapred-site.xml.template mapred-site.xml命令復制一下):
<configuration>
<!--MR的資源調度框架-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!--作業歷史RPC地址-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>192.168.1.6:10020</value>
</property>
<!--MR作業歷史WebUI-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>192.168.1.6:19888</value>
</property>
</configuration>
b、如果沒有權限創建yarn日志輸出和工作目錄文件夾權限,就使用mkdir -p /root/dev/yarn/{0..2}/local和mkdir -p /root/dev/yarn/{0..2}/logs命令創建對應文件夾;如果當前用戶有權限,Hadoop會自動創建;下面其他節點啟動nodemanager服務也是如此
c、啟動yarn resourcemanager,直接使用命令yarn resourcemanager,啟動成功后,看到WebUI端口為8088
d、在其他節點Hadoop配置文件目錄下,使用scp root@192.168.1.6:$PWD/yarn-site.xml . 和scp root@192.168.1.6:$PWD/yarn-site.xml . 命令拷貝yarn-site.xml和mapred-site.xml文件到其他節點。無需改動配置
e、其他節點因為沒有配置Hadoop環境變量,到bin目錄下啟動nodemanager服務: bin/yarn nodemanager
f、到ResourceManager WebUI上查看nodes,1.6為ResourceManager,1.7和1.8為NodeManager,如下圖(我本機配置沒有這樣高,下面的配置數據估計是來自配置文件)
注意:如果本地沒有配置hosts,那么yarn的node節點需要在yarn-site.xml配置文件中配置yarn.nodemanager.address,對應本節點的IP,IP后面的0表示端口號隨機分配。resourcemanager節點不需要配置。nodemanager中yarn-site.xml添加配置如下,可參考······
教程中會看到老師的ResourceManager WebUI下對應NodeManager RPC或Http地址如下,使用的是主機名
g、在Hadoop home文件下可以通過命令hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar,獲取example Jar包命令參數解釋,如下
h、使用example Jar包的pi命令測試yarn 和 mapreduce:在resourcemanager節點上的Hadoop home文件夾下輸入命令 hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar pi 5 10 哎呀報錯了,如下,需要設置resourcemanager和nodemanager節點時間一致,方法參考··············
修改好再次執行就OK了
i、再寫一個獲取文件字數的命令: hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount /user/hjp/input /user/hjp/output
在ResourceManager上查看歷史任務,如下
點擊上面ID列中一個,進入下面界面,點擊History,無法訪問網頁,說明MapReduce JobHistory服務還沒有啟動;ResourceManager節點上命令mapred historyserver啟動
啟動historyserver后----》
j、守護進程啟動resourcemanager服務和nodemanager服務:dev/hadoop-current/sbin/yarn-daemon.sh start resourcemanager和dev/hadoop-current/sbin/yarn-daemon.sh start nodemanager;守護進程啟動historyserver:dev/hadoop-current/sbin/mr-jobhistory-daemon.sh start historyserver
三、HDFS管理與使用
注意要配置hdfs-site.xml打開ACL權限控制,默認不打開
<property>
<name>dfs.namenode.acls.enabled</name>
<value>true</value>
</property>
1、HDFS默認使用POSIX風格的權限管理方式,權限分為用戶、用戶組、其他等角色。使用方式類似Linux系統修改權限。
如hadoop fs -chmod <PERM> <PATH> 修改文件權限;hadoop fs -chown <USER:GROUP> <PATH>修改文件所屬用戶、用戶組
例,改變用戶目錄所屬用戶組:haddop fs -chown :groupa /user/hjp/foo 或 hadoop fs -chgrp groupa /user/hjp/foo
2、ACL權限變更,修改ACL權限后立即生效,無需刷新用戶用戶組
1)、普通文件的權限,會延續到此文件下子文件,所以使用ACL來細粒度控制權限,HDFS提供了類似POSIX ACL特性
2)、一條ACL規則由若干ACL條目組成,每個條目指定一個用戶或用戶組的權限位。ACL條目由類型名,可選名稱和權限字符串組成,以英文冒號為分隔符
3)、目錄或文件的ACL規則示例如下(逗號分隔,第一個表示類型名,第二個表示可選名,第三個是權限位),當設置了ACL規則后,hdfs目錄或文件權限位后面會多一個加號(+):
user::rw- 所屬用戶,讀寫權限;類型名表示設置的是用戶權限,可選名省略表示目錄或文件所屬的用戶
user:bruce:rwx bruce用戶,讀寫可執行權限;類型名表示設置的是用戶權限,可選名是bruce用戶,但是寫了可選名,就要經過下面mask的過濾,最終該用戶對目錄或文件是讀權限
group::r-x 所屬用戶組可讀可執行權限;類型名表示設置的是用戶組權限,可選名省略表示目錄或文件所屬的用戶組,但是類型名為用戶組的要經過下面的mask過濾,最終目錄或文件所屬用戶組是讀權限
group:sales:rwx sales用戶組,讀寫可執行權限;類型名表示設置的是用戶組權限,可選名是sales用戶組,但是類型名為用戶組的要經過下面的mask過濾,最終目錄或文件對sales用戶是讀權限
mask::r-- 對group條目和指定用戶的user條目起作用,進行過濾
other::r-- 其他用戶,即非目錄或文件所屬用戶及用戶組,讀權限;
default:上面權限設置形式;default只應用於目錄上,權限會被子目錄及文件所繼承,所以慎用
具體示例如下:
3、 配額管理
4、數據均衡
5、滾動升級(可以不用停服)
1)、NN升級,注意下面的NN1表示當前使用的NN節點,NN2表示備用的NN節點;當前使用的NN節點簡稱ANN(ActiveNameNode),備用的NN節點簡稱SNN(StandbyNameNode)
2)、DN升級,注意rollingUpgrade finalize命令會刪除NN和DN備份的數據,所以在確保升級成功后再執行該命令
6、版本回滾(要停服)
7、其他
四、高級內容
1、HDFS高可用