一、hadoop簡介
1、hadoop的初衷是為了解決Nutch的海量數據爬取和存儲的需要,HDFS來源於google的GFS,MapReduce來源於Google的MapReduce,HBase來源於Google的BigTable.hadoop后被引入Apache基金會.
2、hadoop兩大核心設計是HDFS和MapReduce,HDFS是分布式存儲系統,提供高可靠性、高擴展性、高吞吐率的數據存儲服務;MapReduce是分布式計算框架,具有易於編程、高容錯性和高擴展性等優點.
3、hadoop和傳統數據庫相比存儲的數據更大,且為半結構化和非結構化數據,基於數據挖掘和數據預測性分析更有意義,hadoop又快又好維護又廉價.
4、hadoop版本幾條線並行分0.x,1.x,2.x,0.23增加用戶認證管理(通過密碼訪問hadoop),2.x加NN HA,企業目前用2.x.
二、HDFS簡介
1、HDFS優缺點
優點:
高容錯性:數據自動保存多個副本,副本丟失后,自動恢復,可靠性同時也實現了加快處理速度,A節點負載高,可讀取B節點
適合批處理:移動計算而非數據,數據位置暴漏給計算框架
適合大數據處理:甚至PB級數據,百萬規模以上文件數量,10k+節點
可構建在廉價機器上:通過多副本提高可靠性,提供容錯和恢復機制
缺點:
低延遲數據訪問:比如訂單是不適合存儲HDFS中的,要求數據毫秒級就要查出來
小文件存取:不適合大量的小文件存儲,如真有這種需求的話,要對小文件進行壓縮
並發寫入、文件隨機修改:不適合修改,實際中網盤、雲盤內容是不允許修改的,只能刪了從新上傳,他們都是hadoop做的
2、HDFS架構
1>HDFS中的存儲單元(block),一個文件會被切分成若干個固定大小的block(塊默認是64MB,可配置,若不足64MB,則單獨一個塊),存儲在不同節點上,默認每個block有三個副本(副本越多,磁盤利用率越低),block大小和副本數通過Client端上傳文件時設置,文件上傳成功后副本數可變,block size不可變.如一個200M文件會被切成4塊,存在不同節點,如掛了一台機器后,會自動在復制副本,恢復到正常狀態,只要三個機器不同時掛,數據不會丟失.
2、HDFS包含3種節點,NameNode(NN),secondary NameNode(SNN),DataNode(DN).
NN節點功能
接收客戶端的讀寫請求,NN中保存文件的metadata數據(元數據是最重要的,元數據丟失的話,dateNode都是垃圾數據)包括除文件內容外的文件信息;文件包含哪些block;Block保存在哪個DN上(由DN啟動時上報,因為這個可能隨時變化),NN中的metadata信息在啟動后會加載到內存,metadata存儲在磁盤的文件名為fsimage,block的位置信息不會保存到fsimage,edits記錄對metadata的操作日志.比如有一個插入文件的操作,hadoop不會直接修改fsimage,而是記錄到edits日志記錄文件中,但是NN內存中的數據是實時修改的.隔斷時間后會合並edits和fsimage,生成新的fsimage,edits的機制和關系型數據庫事務的預提交是一樣的機制.
SNN節點功能
它的主要工作是幫助NN合並edits log,減少NN啟動時間,另一方面合並會有大量的IO操作,但是NN最主要的作用是接收用戶的讀寫服務的,所以大量的資源不能用來干這個.SNN它不是NN的備份,但可以做一部分的元數據備份,不是實時備份(不是熱備).
SNN合並流程
滿足合並時機后(合並時機:配置設置時間間隔fs.checkpoint.period,默認3600秒;或者配置edit log大小,最大64M),SNN會拷貝NN的edits日志記錄文件和fsimage元數據文件到SNN中,可能會跨網絡拷貝,這時同時NN會創建一個新的edits文件來記錄用戶的讀寫請求操作,然后SNN就會進行合並為一個新的fsimage文件,然后SNN會把這個文件推送給NN,最后NN會用新的fsimage替換舊的fsimage,然后如此反復…
面試題:
1、SNN的作用?
當NameNode啟動的時候,首先裝載fsimage文件,然后再應用edits文件,最后還會將最新的目錄樹信息到新的fsimage文件中,然后啟用新的edits文件.整個流程是沒有問題的,但有個小瑕疵,就是如果NameNode在啟動后發生的改變過多,會導致edit文件變得非常大,大得程度與NameNode的更新頻率有關系.那么在下一次NameNode啟動的過程中,讀取了fsimage文件后,會應用這個無比大的edits文件,導致啟動時間變長,並且不可能控,可能需要啟動幾個小時也說不定.NameNode的edits文件過大的問題,也就是SecondeNameNode要解決的主要問題.
2、如果NN掛掉(硬盤壞掉)后,數據還能不能找回?
如果SNN和NN在同一台機器無法找回,所以NN和SNN最好不在一台機器.
DN節點功能
存儲數據;啟動DN線程的時候向NN匯報block信息;通過向NN發送心跳保持與其聯系(3秒1次),如果NN10分鍾沒有收到DN心跳,則認為其lost,並copy其上的block到其它DN.
ps:面試題:block的副本放置策略
第一個副本:放置在上傳文件的DN;如果是集群外提交,則隨機挑選一台磁盤不太滿,cpu不太忙的節點.第二個副本:放置在於第一個副本不同的機架的節點上.第三個副本:與第二個副本相同的機架節點(一個機架電源相同,保證安全的同時提高速度).
3、HDFS讀寫流程
read是並發讀取
只寫了一份block,然后由DN產生線程去往其他DN上復制block副本,速度快.
4、HDFS文件權限和認證
權限和linux類似,如果linux用戶wangwei使用hadoop命令創建一個文件,那么這個文件在HDFS中owner就是wangwei;HDFS不做密碼的認證,這樣的好處是速度快,不然每次讀寫都要驗密碼,HDFS存的數據一般都是安全性不是很高的數據.HDFS理論結束.
三、HDFS安裝部署
1、下載編譯好的hadoop並解壓:tar -xzf hadooop-2.7.3.tar.gz.
2、安裝jdk並設置JAVA_HOME
1>第一種,這種方式關閉終端后就失效了
linux-02:~ # declare -x JAVA_HOME="/usr/local/jdk1.7.0_03/bin/" linux-02:~ # export PATH=$JAVA_HOME:$PATH
2>第二種,永久方式
vim /etc/profile,增加以下內容:
export JAVA_HOME=/usr/local/jdk1.7.0_03/
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
保存profile文件,並執行source /etc/profile讓設置立即生效.同時要在conf/hadoop-env.sh中配置jdk.
3、免密碼登錄配置(現在打算用三個節點來部署hadoop)
1> 在node1上執行ssh node2不需要密碼即可登錄node2就是免密碼登錄.
2> 為什么需要免密碼登錄?HDFS能做到在任何一個機器上敲命令啟動HDFS,那么它就能啟動所有節點的所有的Java進程(每個節點實際就是一個java 進程),也就是啟動整個集群,其實就是遠程登錄到其他機器上去啟動那些節點.如 start-all.sh命令.它其實只是為了一個方便,不然需要逐個啟 動節點.
3>要在Node1上敲start-all.sh啟動集群,就需要做node1到node2,node3的免密碼登錄.首先在各個節點的/etc/hosts里面添加node1,node2,node3主機名和iP映射
192.168.144.11 node1 192.168.144.12 node2 192.168.144.13 node3
然后各個節點生成公鑰和私鑰,公鑰放入本地認證,先完成本地的免密碼登錄
$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys $ chmod 0600 ~/.ssh/authorized_keys
最后復制node1的id_dsa.pub到node2和node3,然后分別追加到各自的本地認證中,直接復制粘貼內容有問題.
[root@node1 ~]# scp ~/.ssh/id_dsa.pub root@node2:~ [root@node1 ~]# scp ~/.ssh/id_dsa.pub root@node3:~ [root@node2 ~]# cat id_dsa.pub >> ~/.ssh/authorized_keys [root@node3 ~]# cat id_dsa.pub >> ~/.ssh/authorized_keys
4、配置node1節點conf/core-site.xml
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <configuration> <!--配置NN在哪台機器以及它的端口,也可說是HDFS的入口 --> <property> <name>fs.defaultFS</name> <value>hdfs://node1:9000</value> </property> <!-- HDFS工作目錄的設置,默認是linux的/temp,每次linux重啟會清空,hadoop中的數據會全部丟失.--> <!-- 其它一些目錄是以這個臨時目錄為基本目錄的,如dfs.name.dir和dfs.name.edits.dir等--> <property> <name>hadoop.tmp.dir</name> <value>/opt/hadoop-2.7.3</value> </property> </configuration>
5、node1節點上conf/slaves配置DN,conf/masters 配置SNN(盡量和NN不要在一個節點),NN已經在core.site.xml中配置.
<!--配置主機名或ip --> [root@node1 conf]# vim masters node2 [root@node1 conf]# vim slaves node2 node3
6、把node1/conf下所有的配置文件復制到node2,node3.
[root@node1 conf]# scp ./* root@node2: ~/hadoop-1.2.1/conf/ [root@node1 conf]# scp ./* root@node3: ~/hadoop-1.2.1/conf/
7、bin目錄下格式化NN並啟動
./hadoop namenode -format //只需一次即可
./start-dfs.sh //啟動HDFS
啟動成功后 通過jps命令查看java進程(需要安裝jdk並且在/etc/profile中配置好JAVA_HOME),這時NN的日志提示,全部啟動成功,但是去node2,node3通過jps查看Java進程但發現沒有啟動成功,這是防火牆的原因,在NN執行:service iptables stop關掉防火牆,stop掉hdfs重新啟動,就可通過瀏覽器http://node1:50070可以訪問HDFS管理頁面.