1_HDFS理論及安裝部署


一、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管理頁面.  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM