天天看點

Hadoop 之 HDFS 基本概念 | 僞分布式安裝/完全分布式安裝HDFSHadoop2.x

Hadoop 之 HDFS 及安裝

  • HDFS
    • 概念
    • HDFS的概念
    • 存儲模型:位元組
    • 架構模型
    • NameNode(NN)
    • DataNode(DN)
    • SecondaryNameNode(SNN)(1.x)
    • Block的副本放置政策
    • HDFS讀流程
    • HDFS安裝
    • Notice:
  • Hadoop2.x
    • 産生背景
    • 模型
    • Hadoop 2.x

HDFS

推薦書籍 Hadoop 權威指南第四版 中文 PDF 點選下載下傳

概念

  • 當資料集的大小超過一台獨立的計算機的存儲能力的時候,這個時候就有必要對檔案進行分區(partiiton)存儲在若幹台計算集上。管理網絡中跨多台計算機存儲的檔案系統,叫做分布式檔案系統(Distribute FileSystem)。該系統架構于網絡之上,勢必會引入網絡程式設計的複雜性,是以分布式檔案系統比普通磁盤檔案系統更為複雜,比如說:必須要容忍因為節點故障且不會引起資料丢失。
  • Hadoop 自帶一個稱為HDFS分布式檔案系統(

    Hadoop Distribute FileSuystem

    )。HDFS 以流式資料通路模式來存儲超大檔案,運作與商用硬體叢集上。
  • 超大檔案:在這裡指的是具有幾百MB、幾百GB、甚至幾百TB大小的檔案。
  • 流式資料通路模式:一次寫入,多次讀取是最高效的設計模式。
  • 低時間延遲的資料通路:要求低延遲的資料通路的應用,例如幾十毫秒,不适合在HDFS上運作。(HDFS是為高吞吐量優化的,這可能會以提高時間延遲為代價)
  • 大量小檔案:

    多使用者寫入,任意修改檔案:HDFS中的檔案寫入隻支援單寫入者,而且寫入者隻以“追加”的方式在檔案末尾寫資料,不支援多個寫入者,也不支援在任意位置修改資料。

HDFS的概念

  • 資料塊(block):預設128MB。
  • namenode 和 datenode
  • 塊緩存:
  • 聯邦HDFS: viewfs://URI

存儲模型:位元組

  • 檔案線性切割成塊(Block):偏移量Offset(byte)(Block切割字元的下标)
  • Block分散存儲在叢集節點上
  • 單一檔案Block塊大小一緻,不同檔案的Block塊大小可以不一緻。

    Block可以設定副本數,副本(資料的可靠性。可用性)分散在叢集不同的節點中。

  • 副本數不可以超過節點數量

  • 檔案上傳可以設定Block大小和副本數量
  • 已上傳的Block副本數可以調整,大小不變
  • 隻支援一次寫入(append追加在檔案末尾),多次讀寫,同一時刻隻允許有一個寫入者

架構模型

  • 檔案中繼資料MataData,檔案資料
  1. (從)資料本身(Block資料)存儲在DateNode:多節點
  2. (主)中繼資料(檔案名、大小、塊資訊等)存儲在namenode:單節點
  • DataNode 和NameNode保持心跳,送出Block清單資訊
  • HdfsClient和NameNode交換中繼資料資訊
  • HdfsClient和DataNode交換Block資料
    Hadoop 之 HDFS 基本概念 | 僞分布式安裝/完全分布式安裝HDFSHadoop2.x

NameNode(NN)

  • 基于記憶體存儲:不會和磁盤發生交換
  • 隻存在記憶體中

  • 持久化(運作是單向落在磁盤中,重新開機的時候讀回來,具體方法後面)
  1. NameNode主要功能
  2. 接收用戶端的讀寫功能
  3. 收集DateNode彙報的Block資訊
  • NamoNode儲存的metaData資訊包括
  • Block塊清單(偏移量)(持久化存儲的資訊),位置資訊(資料存儲的位置)
  1. 副本的存儲位置(由DataNode(心跳)上報)
  2. 檔案大小,時間
  3. NameNode持久化
  • NameNode的metadata資訊會在啟動會加載到記憶體

    matadata存儲到磁盤的名稱為fsimage

    Block塊資訊不會儲存到fsimage

    edits(editsLog)記錄對metadata的記錄檔

    (合并fsimage 和 editsLog ,縮短叢集恢複的時間)

DataNode(DN)

  • 本地磁盤存儲資料(Block),檔案形式

    同時存儲Block的中繼資料資訊

    啟動DN時會向NN彙報block資訊

    通過向NN發送心跳保持與其聯系(3秒一次),如果NN十分鐘沒有收到DN的心跳,認為其已經lost,會copy其上的block到其他DN

SecondaryNameNode(SNN)(1.x)

  • 它不是NN的備份(但是可以做備份),它的主要工作是幫助NN合并editslog,減少NN啟動時間
  • SNN執行合并時機

    根據配置檔案設定的時間間隔<fs.checkpoint.period>,預設3600秒

    根據配置檔案設定的edits log 大小,fs.checkpoint.size,預設大小64MB

    Hadoop 之 HDFS 基本概念 | 僞分布式安裝/完全分布式安裝HDFSHadoop2.x

Block的副本放置政策

  • 第一個副本放置在上傳檔案的DN上,
  • 第二個副本放置在與第一個副本不同的機架的節點上
  • 第三個副本放置在與第二個副本相同的機架上不同節點上HDFS寫流程

HDFS讀流程

open–>getBlockLocationInfo–>read

HDFS安裝

環境:CentOS-6.10-x86_64-minimal.iso

JDK:jdk-8u171-linux-x64.tar.gz

Hadoop:hadoop-2.6.0.tar.gz

1、首先安裝上傳下載下傳功能,root 賬号登陸後執行以下指令:
   yum install -y lrzsz
2、mkdir -p /usr/local/java
3、cd /usr/local/java/
4、rz -e + Enter 選擇路徑下 jdk-8u171-linux-x64.tar.gz   或者 rz -be + Enter 選擇路徑下 jdk-8u171-linux-x64.tar.gz
5、tar -zxvf jdk-8u171-linux-x64.tar.gz 
6、pwd  (複制目前路徑)

7、vim /etc/profile
8、JAVA_HOME=/usr/local/java/jdk1.8.0_181
   JRE_HOME=/usr/local/java/jdk1.8.0_181/jre
   CLASSPATH=.:$JAVA_HOME:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$JAVA_HOME/lib/dt.jar
   PATH=$JAVA_HOME/bin:
   export PATH JAVA_HOME CLASSPATH
9、 source /etc/profile
10、java -version  驗證是否安裝成功
-----------------------------華麗的分割線----------------------------
--------------------------Hadoop的僞分布式安裝----------------------------
1、上傳hadoop安裝包
   rz -e + enter 選擇路徑下 hadoop-2.6.0.tar.gz
2、 tar xf  hadoop-2.6.0.tar.gz
3、 vim /etc/profile
   HADOOP_HOME=/usr/local/hadoop-2.6.0
   PATH=$JAVA_HOME/bin:$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:
   export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native  
   export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
4、 免秘鑰
	ssh -keygen -t dsa -P '' -f ~/.ssh/id_dsa.pub
	cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys 
	scp ~/.ssh/authorized_keys [email protected]:`pwd`(分發到其他節點)

5、 在hadoop配置檔案中二次配置JAVA_HOME(遠端調用,不會調用/etc/profile 配置檔案)
	配置/usr/local/hadoop-2.6.0/etc/hadoop/ 下所有evn.sh結尾的檔案
	export JAVA_HOME=/usr/local/java/jdk1.8.0_181/
6、 vim /usr/local/hadoop-2.6.0/etc/hadoop/core-site.xml:
	<!--指定NN啟動位置-->
	<configuration>
    	<property>
        	<name>fs.defaultFS</name>
        	<value>hdfs://localhost:9000</value>
        	<!--localhost 換成目前節點名稱: node1-->
    	</property>
    	<property>
        	<name>hadoop.tmp.dir</name>
        	<value>/var/hadoop/local</value>
        	<!--不存在則自己建立-->
    	</property>
	</configuration>
7、 vim /usr/local/hadoop-2.6.0/etc/hadoop/hdfs-site.xml
	<!--副本數量不可超過節點數,不寫預設3個,會一直報錯-->
	<configuration>
	    <property>
	        <name>dfs.replication</name>
	        <value>1</value>
	    </property>
	    <property>
	        <name>dfs.namenode.secondary.address</name>
	        <value>node1:50090</value>
	    </property>
	</configuration>
8、 core-site.xml
	hadoop.tmp.dir 存儲臨時檔案,系統空間不足會自己删除
9、 hdfs-site.xml
	dfs.namenode.name.dir 預設file://${hadoop.tmp.dir}/dfs/name
	dfs.datanode.data.dir 預設file://${hadoop.tmp.dir}/dfs/data
	這樣就會出現問題,是以要更改core-site.xml中的hadoop.tmp.dir檔案存儲路徑
10、 vim slaves
	 node1
11、 格式化檔案系統
	 $bin/hdfs namenode -format <!--****format 不是formate****-->
12、 啟動hdfs
	 $sbin/ start-dfs.sh
13、 hdfs叢集web頁面
	 node1:50070
14、 常用指令
	 hdfs + enter
	 hdfs dfs + enter
	 hdfs dfs -ls + hdfs 路徑
	 hdfs dfs -put + 本地檔案路徑 + hdfs 路徑
	 hdfs dfs -get + hdfs 路徑
	 hdfs dfs -cat + hdfs 路徑
	 hdfs dfs -mkdir /user(家目錄)/root(使用者)/這後面才是你自己的目錄
	 hdfs dfs -tail + hdfs 路徑
	 hdfs dfs -du + hdfs 路徑/檔案名
	 hdfs dfs -rm + hdfs 路徑/檔案名(删除檔案)
				   + hdfs 路徑/(删除檔案夾)
--------------------------------------------------------------
-------------------------完全分布式-----------------------------
--------------------------------------------------------------
<!--`約定 node1 為NN啟動節點,node2為SNN節點,node2,node3,node4為DN節點`-->
1、 JAVA_HOME
2、 免秘鑰

	ssh -keygen -t dsa -P '' -f ~/.ssh/id_dsa.pub
	cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys 
	(各個幾點都追加到~/.ssh/authorized_keys,然後統一分發,這樣可以做到叢集免秘鑰)
	cat authorized_keys
	
	scp ~/.ssh/authorized_keys [email protected]:`pwd`(分發到其他節點)
	scp ~/.ssh/authorized_keys node2:`pwd`
	驗證: ssh node2
3、 vim /usr/local/hadoop-2.6.0/etc/hadoop/core-site.xml:
	<!--指定NN啟動位置-->
	<configuration>
    	<property>
        	<name>fs.defaultFS</name>
        	<value>hdfs://node1:9000</value>
        	<!--localhost 換成目前節點名稱: node1-->
    	</property>
    	<property>
        	<name>hadoop.tmp.dir</name>
        	<value>/var/hadoop/full</value>
        	<!--不存在則自己建立-->
    	</property>
	</configuration>
4、 vim /usr/local/hadoop-2.6.0/etc/hadoop/hdfs-site.xml
	<!--副本數量不可超過節點數,不寫預設3個,會一直報錯-->
	<configuration>
	    <property>
	        <name>dfs.replication</name>
	        <value>3</value>
	    </property>
	    <property>
	        <name>dfs.namenode.secondary.address</name>
	        <value>node2:50090</value>
	    </property>
	</configuration>

5、 vim slaves(修改的是DN節點)
	node2
	node3
	node4
6、 直接将node1配置好的分發到叢集其他節點上
	scp -r /usr/local/hadoop-2.6.0/ node2:/usr/local/
	scp -r /usr/local/hadoop-2.6.0/ node3:/usr/local/
	scp -r /usr/local/hadoop-2.6.0/ node4:/usr/local/
7、 在node1上格式化
	hdfs dfs -format
8、 在node1上啟動hdfs
	start-dfs.sh
9、 驗證是否啟動成功!!!
	jps
	node1: NN
	node2: SNN DN
	node3: DN
	node4: DN
           

Notice:

1.hdfs 預設端口8020 運作namenode

2.hdfs dfs -format 多次,會導緻版本VERSIONID 不同,導緻啟動報錯,如需多次,則需要删除dfs.namenode.dir 下面的檔案

Hadoop2.x

産生背景

  • Hadoop1.0 中HDFS和 MapReduce 在高可用和擴充性方面存在問題
  • HDFS存在的問題
    1. NameNode單點故障,難以應用于線上場景

    2. NameNode壓力過大,且記憶體受限,影響系統擴充性。

  • MapReduce存在的問題
    1. JobTracker通路壓力過大,影響系統擴充性

    2. 難以支援除MapReduce外的其他計算架構,如Storm、Spark等

模型

Hadoop 之 HDFS 基本概念 | 僞分布式安裝/完全分布式安裝HDFSHadoop2.x
  • Hadoop 2.x 由HDFS / YARN / MR 三個分支組成
  • HDFS: NN Federation(聯邦)(解決單點故障)、HA(解決單點壓力)
    1. 2.X隻支援2個節點的HA,3.X實作了一主多從
  • MR: 運作在Yarn上的MR
    1. 離線計算,基于磁盤I/O計算
  • Yarn:

    資源排程系統

Hadoop 2.x

Hadoop 之 HDFS 基本概念 | 僞分布式安裝/完全分布式安裝HDFSHadoop2.x
  • HA的實作方式(NFS/JN叢集)/ ZK叢集-ZKFC 及其搭建方式

    後續補充

  1. HA搭建
    Hadoop 之 HDFS 基本概念 | 僞分布式安裝/完全分布式安裝HDFSHadoop2.x

官網:點選跳轉

<!--隻需要在前面安裝的基礎上修改某些配置即可,建議:CP一份做備份-->
 <!--删除secondary.nn-->
 1. vim hdfs-site.xml
	<property>
		<name>dfs.nameservices</name>
		<value>hacluster</value>
		<!--hacluster這個值很關鍵-->
	</property>
	<property>
	  <name>dfs.ha.namenodes.hacluster</name>
	  <value>nn1,nn2</value>
	</property>
	<!--邏輯到實體的映射start-->
	<property>
	  <name>dfs.namenode.rpc-address.hacluster.nn1</name>
	  <value>node1:8020</value>
	</property>
	<property>
	  <name>dfs.namenode.rpc-address.hacluster.nn2</name>
	  <value>node2:8020</value>
	</property>
	<!--頁面start-->
	<property>
	  <name>dfs.namenode.http-address.hacluster.nn1</name>
	  <value>node1:50070</value>
	</property>
	<property>
	  <name>dfs.namenode.http-address.hacluster.nn2</name>
	  <value>node2:50070</value>
	</property>
	<!--jn start-->
	<property>
		<name>dfs.namenode.shared.edits.dir</name>
		<value>qjournal://node1:8485;node2:8485;node3:8485/hacluster</value>
	</property>
	<!--jn edits save dir start-->
	<property>
	  <name>dfs.journalnode.edits.dir</name>
	  <value>/var/hadoop/journal/node/local/data</value>
	  <!--這個值根據自己習慣定義即可-->
	</property>
	<!--故障切換實作方式-->
	<property>
	  <name>dfs.client.failover.proxy.provider.hacluster</name>
	  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
	</property>
    <property>
      <name>dfs.ha.fencing.methods</name>
      <value>sshfence</value>
    </property>

    <property>
      <name>dfs.ha.fencing.ssh.private-key-files</name>
      <value>/.ssh/id_rsa</value>
      <!--這個找對應自己秘鑰位置-->
    </property>
	<!--zk 自動化-->
	<property>
	   <name>dfs.ha.automatic-failover.enabled</name>
	   <value>true</value>
	</property>

2. vim core-site.xml
	<property>
	  <name>fs.defaultFS</name>
	  <value>hdfs://hacluster</value>
	</property>
	 <property>
	   <name>ha.zookeeper.quorum</name>
	   <value>node2:2181,node3:2181,node4:2181</value>
	 </property>
	     <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/usr/var/hadoop/tmp/</value>
        <!--這個目錄一點要更改-->
    </property>

3. 搭建ZK叢集
	zookeeper-3.4.6.jar
	//1
	tar -zxvf zookeeper-3.4.6.jar /usr/local/software/
	//2
	cp zoo_sample.cfg zoo.cfg
	//3
	vim zoo.cfg
	dataDir=/usr/local/software/zookeeper/data
	server.1=192.168.*.2:2888:3888
	server.2=192.168.*.3:2888:3888
	server.3=192.168.*.4:2888:3888
	:wq
	//4
	cd /usr/local/software/zookeeper/data
	echo 1 > myid
	(!!! 後兩個節點 echo 2 > myid|echo 3 > myid !!!)
	//5 分發
	
	//6 啟動
	zkServer.sh start (每個節點都要啟動)
	zkServer.sh status
	leader(1個)
	follower(2個)

	zkCli.sh + enter  驗證
	quit 退出
4. 啟動
	
	hadoop-daemon.sh start journalnode(每台都啟動)
	jps 檢視狀态
	hdfs namenode -format (在node1格式化)
	//node1執行
	hadoop-daemon.sh start namenode
	//node2執行
	hdfs namenode -bootstrapStandby

	//zkFC格式化 node1執行
	$HADOOP_HOME/bin/hdfs zkfc -formatZK
	start-dfs.sh
	jps 檢視

	<!--打開頁面 node1:50070 ,linux 執行kill -9 11000(namenode) 驗證是否成功 node2 變成 active ,然後在 node1 執行 hadoop-daemon.sh start namenode   node1 變成stanyby 恭喜成功 -->

	
	$HADOOP_HOME/sbin/hadoop-daemon.sh --script $HADOOP_HOME/bin/hdfs start zkfc
	
           
  • 聯邦 HDFS Federation實作及其搭建方式

    後續補充

繼續閱讀