HDFS 運作原理解析
HDFS 分為兩個部分,NameNode 負責儲存資料的 MetaData ,以及 Block 分別儲存在哪幾台 DataNode 上,DataNode 則負責儲存資料。
1. 以 Client 端要把檔案寫入 HDFS 為例
步驟一:
寫入 DataNode 前,會先將檔案分割成固定大小的 Block (預設 Block Size 為128 MB),並再把 Block 複製三份 (預設三份),如下圖所示。
步驟二:
如下圖所示, NameNode 告訴 Client 端,不同的 Block (包括複製的) 要分別寫入哪一台 DataNode。而 Block 儲存到哪一台 DataNode,是根據 HDFS 內部的演算法。
步驟三:
詳細的寫入過程如下圖所示,Client 端想要寫入 Block A,NameNode 確認後,告訴 Client 端要分別寫入哪幾台 DataNode,Client 端再跟要寫入的 Data Node 做確認,確認 DataNode 都準備完畢後,Block A 就會分別寫入Data Node 1、5、7。
2. 以 Client 端從 HDFS 讀取檔案為例
當 Client 端要讀取檔案時,NameNode 會告訴 Client 端,不同的 Block 分別儲存在哪幾台 DataNode,如下圖所示,Client 端將會從 DataNode 1、8、5 分別提取 Block A、B、C,三個 Block 讀取出來後,即可合併成 Client 端欲讀取之檔案。
3. Heartbeat
DataNode 每隔一段時間,會傳送心跳封包給 NameNode,如果 NameNode 一段時間沒收到心跳封包,就會把該 DataNode 的狀態認定為 Dead。
HDFS 設定檔設定 - NameNode
1. 設定 core-site.xml
$ sudo nano /opt/hadoop-2.7.1/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://nna:8020</value>
</property>
</configuration>
2. 設定 hdfs-site.xml
$ sudo nano /opt/hadoop-2.7.1/etc/hadoop/hdfs-site.xml
<property>
<name>dfs.http.address</name>
<value>nna:50070</value>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>nna:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/pi/nn</value>
</property>
<property>
<name>dfs.permissions.supergroup</name>
<value>biguser</value>
</property>
3. 設定 hadoop-env.sh
$ sudo nano /opt/hadoop-2.7.1/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/lib/jvm/jdk-8-oracle-arm-vfp-hflt
export HADOOP_HEAPSIZE="128"
export HADOOP_NAMENODE_INIT_HEAPSIZE="128"
export HADOOP_CLIENT_OPTS="-Xmx128m $HADOOP_CLIENT_OPTS"
export HADOOP_LOG_DIR=/tmp
HDFS 設定檔設定 - DataNode
1. 設定 core-site.xml
$ sudo nano /opt/hadoop-2.7.1/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://nna:8020</value>
</property>
</configuration>
2. 設定 hdfs-site.xml
$ sudo nano /opt/hadoop-2.7.1/etc/hadoop/hdfs-site.xml
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/pi/dn</value>
</property>
3. 設定 hadoop-env.sh
$ sudo nano /opt/hadoop-2.7.1/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/lib/jvm/jdk-8-oracle-arm-vfp-hflt
export HADOOP_HEAPSIZE="128"
export HADOOP_NAMENODE_INIT_HEAPSIZE="128"
export HADOOP_CLIENT_OPTS="-Xmx128m $HADOOP_CLIENT_OPTS"
export HADOOP_LOG_DIR=/tmp
啟動 HDFS 分散檔案系統
1. 初始化 HDFS 分散檔案系統
$ hdfs namenode -format
2. 啟動 HDFS 分散檔案系統
$ hadoop-daemon.sh start namenode
$ hadoop-daemon.sh start secondarynamenode
$ hadoop-daemon.sh start datanode
3. 檢視 HDFS 分散檔案系統狀態
$ hdfs dfsadmin -report
HDFS 系統權限設定
1. HDFS 分散式檔案系統權限設定
1.1 建立 biguser 群組
$ sudo groupadd biguser
1.2 將 pi 帳號加入 biguser 群組中
$ sudo usermod -a -G biguser pi
1.3 HDFS 權限設定
$ hdfs dfs -chown -R pi:biguser /
$ hdfs dfs -chmod -R 770 /
$ hdfs dfs -mkdir /tmp
$ hdfs dfs -mkdir /user
$ hdfs dfs -mkdir /user/pi
2. 查看目錄權限