一、hadoop的初衷是爲了解決Nutch的海量數據爬取和存儲的須要,HDFS來源於google的GFS,MapReduce來源於Google的MapReduce,HBase來源於Google的BigTable.hadoop後被引入Apache基金會.java
二、hadoop兩大核心設計是HDFS和MapReduce,HDFS是分佈式存儲系統,提供高可靠性、高擴展性、高吞吐率的數據存儲服務;MapReduce是分佈式計算框架,具備易於編程、高容錯性和高擴展性等優勢.node
三、hadoop和傳統數據庫相比存儲的數據更大,且爲半結構化和非結構化數據,基於數據挖掘和數據預測性分析更有意義,hadoop又快又好維護又廉價.linux
四、hadoop版本幾條線並行分0.x,1.x,2.x,0.23增長用戶認證管理(經過密碼訪問hadoop),2.x加NN HA,企業目前用2.x.面試
一、HDFS優缺點數據庫
優勢:編程
高容錯性:數據自動保存多個副本,副本丟失後,自動恢復,可靠性同時也實現了加快處理速度,A節點負載高,可讀取B節點vim
適合批處理:移動計算而非數據,數據位置暴漏給計算框架瀏覽器
適合大數據處理:甚至PB級數據,百萬規模以上文件數量,10k+節點安全
可構建在廉價機器上:經過多副本提升可靠性,提供容錯和恢復機制網絡
缺點:
低延遲數據訪問:好比訂單是不適合存儲HDFS中的,要求數據毫秒級就要查出來
小文件存取:不適合大量的小文件存儲,如真有這種需求的話,要對小文件進行壓縮
併發寫入、文件隨機修改:不適合修改,實際中網盤、雲盤內容是不容許修改的,只能刪了重新上傳,他們都是hadoop作的
二、HDFS架構
1>HDFS中的存儲單元(block),一個文件會被切分紅若干個固定大小的block(塊默認是64MB,可配置,若不足64MB,則單獨一個塊),存儲在不一樣節點上,默認每一個block有三個副本(副本越多,磁盤利用率越低),block大小和副本數經過Client端上傳文件時設置,文件上傳成功後副本數可變,block size不可變.如一個200M文件會被切成4塊,存在不一樣節點,如掛了一臺機器後,會自動在複製副本,恢復到正常狀態,只要三個機器不一樣時掛,數據不會丟失.
二、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,而後如此反覆…
面試題:
一、SNN的做用?
當NameNode啓動的時候,首先裝載fsimage文件,而後再應用edits文件,最後還會將最新的目錄樹信息到新的fsimage文件中,而後啓用新的edits文件.整個流程是沒有問題的,但有個小瑕疵,就是若是NameNode在啓動後發生的改變過多,會致使edit文件變得很是大,大得程度與NameNode的更新頻率有關係.那麼在下一次NameNode啓動的過程當中,讀取了fsimage文件後,會應用這個無比大的edits文件,致使啓動時間變長,而且不可能控,可能須要啓動幾個小時也說不定.NameNode的edits文件過大的問題,也就是SecondeNameNode要解決的主要問題.
二、若是NN掛掉(硬盤壞掉)後,數據還能不能找回?
若是SNN和NN在同一臺機器沒法找回,因此NN和SNN最好不在一臺機器.
DN節點功能
存儲數據;啓動DN線程的時候向NN彙報block信息;經過向NN發送心跳保持與其聯繫(3秒1次),若是NN10分鐘沒有收到DN心跳,則認爲其lost,並copy其上的block到其它DN.
ps:面試題:block的副本放置策略
第一個副本:放置在上傳文件的DN;若是是集羣外提交,則隨機挑選一臺磁盤不太滿,cpu不太忙的節點.第二個副本:放置在於第一個副本不一樣的機架的節點上.第三個副本:與第二個副本相同的機架節點(一個機架電源相同,保證安全的同時提升速度).
三、HDFS讀寫流程
read是併發讀取
只寫了一份block,而後由DN產生線程去往其餘DN上覆制block副本,速度快.
四、HDFS文件權限和認證
權限和linux相似,若是linux用戶wangwei使用hadoop命令建立一個文件,那麼這個文件在HDFS中owner就是wangwei;HDFS不作密碼的認證,這樣的好處是速度快,否則每次讀寫都要驗密碼,HDFS存的數據通常都是安全性不是很高的數據.HDFS理論結束.
一、下載編譯好的hadoop並解壓:tar -xzf hadooop-2.7.3.tar.gz.
二、安裝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.
三、免密碼登陸配置(如今打算用三個節點來部署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
四、配置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>
五、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
六、把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/
七、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管理頁面.