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分布式檔案系統(
)。HDFS 以流式資料通路模式來存儲超大檔案,運作與商用硬體叢集上。Hadoop Distribute FileSuystem
- 超大檔案:在這裡指的是具有幾百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,檔案資料
- (從)資料本身(Block資料)存儲在DateNode:多節點
- (主)中繼資料(檔案名、大小、塊資訊等)存儲在namenode:單節點
- DataNode 和NameNode保持心跳,送出Block清單資訊
- HdfsClient和NameNode交換中繼資料資訊
- HdfsClient和DataNode交換Block資料
NameNode(NN)
- 基于記憶體存儲:不會和磁盤發生交換
-
隻存在記憶體中
- 持久化(運作是單向落在磁盤中,重新開機的時候讀回來,具體方法後面)
- NameNode主要功能
- 接收用戶端的讀寫功能
- 收集DateNode彙報的Block資訊
- NamoNode儲存的metaData資訊包括
- Block塊清單(偏移量)(持久化存儲的資訊),位置資訊(資料存儲的位置)
- 副本的存儲位置(由DataNode(心跳)上報)
- 檔案大小,時間
- 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
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存在的問題
-
NameNode單點故障,難以應用于線上場景
-
NameNode壓力過大,且記憶體受限,影響系統擴充性。
-
- MapReduce存在的問題
-
JobTracker通路壓力過大,影響系統擴充性
-
難以支援除MapReduce外的其他計算架構,如Storm、Spark等
-
模型
- Hadoop 2.x 由HDFS / YARN / MR 三個分支組成
- HDFS: NN Federation(聯邦)(解決單點故障)、HA(解決單點壓力)
- 2.X隻支援2個節點的HA,3.X實作了一主多從
- MR: 運作在Yarn上的MR
- 離線計算,基于磁盤I/O計算
- Yarn:
資源排程系統
Hadoop 2.x
- HA的實作方式(NFS/JN叢集)/ ZK叢集-ZKFC 及其搭建方式
後續補充
- HA搭建
官網:點選跳轉
<!--隻需要在前面安裝的基礎上修改某些配置即可,建議: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實作及其搭建方式
後續補充