2016年1月11日 星期一

物聯網 (IoT) 資戰車 - 建置 HDFS 分散檔案系統

Hadoop 第二代,分為 HDFS  與 YARN ,此篇將說明如何建置 HDFS 分散檔案系統。

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. 查看目錄權限

$ hdfs dfs -ls -d /





$ hdfs dfs -ls /user


物聯網 (IoT) 資戰車 - Hadoop 叢集環境基礎建置

使用 Hadoop 前,我們必須先針對 Hadoop 所需的環境,做一個基礎的建置,詳細步驟如下。

設定 SSH

1. 產生 SSH 自動登入憑證 
$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa  [注意] -P 後面為兩個單引號



$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
$ ls -al .ssh



2. 第一次執行 SSH 本機登入
$ ssh nna

3. 取消主機金鑰自動檢查功能
$ sudo nano /etc/ssh/ssh_config



JDK 版本

1. 顯示 JAVA 版本
$ java -version


2. 查看正在運作的 JAVA 程式
$ jps -v


Hadoop 套件

1. 下載官網套件
wget ftp://ftp.twaren.net/Unix/Web/apache/hadoop/common/hadoop-2.7.1/hadoop-2.7.1.tar.gz


2. 解壓縮 Hadoop 套件
$ ls -al


$ sudo tar xvfz hadoop-2.7.1.tar.gz -C /opt


3. 確認 Hadoop 套件與系統相容性
$ file /opt/hadoop-2.7.1/lib/native/libhadoop.so.1.0.0


$ uname -m


由上面的兩個指令可以知道,官網的套件是不支援 ARM 架構的,故無法使用,這邊提供我們已經編譯過的套件,下載網址如下。
https://goo.gl/xR81JR


下載完畢後,再使用 WinSCP 工具上傳至小刀鋒上。上傳成功後,先把原先解壓縮出來的目錄刪除,指令如下。再繼續做從第二步,解壓縮 Hadoop 套件即可。
$ sudo rm –r /opt/hadoop-2.7.1

設定 Hadoop 系統環境變數

這個階段,使用 Shell script,來設定 Hadoop 系統環境變數,Shell script 的介紹如下:
Shell Script 主要用途就是用來協助使用者在 UNIX 或 Linux 環境上,以更方便、更自動化的方式來執行想要執行的指令,它也可以很快速的協助使用者或管理者大量地執行重複性的動作與令。

1. 建立系統環境變數檔
$ sudo nano /opt/allhadoop.sh


加入的文字如下:
#/bin/bash export JAVA_HOME=/usr/lib/jvm/jdk-8-oracle-arm-vfp-hflt export HADOOP_HOME=/opt/hadoop-2.7.1 export PATH=$PATH:$JAVA_HOME/bin export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

自訂系統維運指令

1. 自訂系統維運指令
$ sudo nano ~/.bashrc



加入的文字如下:
alias bye='sudo shutdown -h now' alias reboot='sudo reboot' alias ping='ping -c 4' . /opt/allhadoop.sh

2. 重新載入
$ source ~/.bashrc