2016年5月3日 星期二

Hadoop 開發特戰包 (Windows 版) - 連接 UberOS 資戰機 B 型

使用特戰包,可以讓 Windows 系統作為 Hadoop Client ,並連接到其他機器,這邊我們以連接 UberOS 資戰機 B 型為範例,並且使用 HDFS ,詳細操作如下。

1. 虛擬機確認

請輸入 ifconfig ,確認 IP 位址,如下圖所示,範例的 IP 位址為 192.168.111.134 。除了 IP 以外,還請確認所有 Container 和 Hadoop 叢集是否都已啟動。


2. 特戰包網路設定

右鍵點擊特戰包中的 setnet.bat 檔案,選擇編輯,進入記事本開始設定,如下圖所示。


修改最後一行的 route 設定,把尾端的 IP 位址修改為虛擬機的 IP 位址,修改完畢後,請儲存離開。


設定完成後,請右鍵點擊,並選擇以系統管理身分執行,網路設定即大功告成。


3. 特戰包網路測試

請執行 Hadoop-client.bat,並使用 ping 指令,確認 Hadoop Client 網路是否與虛擬機互通,請輸入 ping 虛擬機的 IP 位置,網路如果互通,會如下圖所示。



確認與虛擬機網路互通後,請再確認是否與 Hadoop 叢集網路有通,這邊以 Ping NameNode 為範例,UberOS 資戰機 B 型的 NameNode 的 HostName 為 nna,請輸入 ping nna,網路如果互通,如下圖所示。


4. 連接 HDFS

首先,請先確認 HDFS 帳號目錄有哪些,請在虛擬機輸入 hdfs dfs -ls /user ,如下圖所示。以 bigred 為範例,如果沒有 bigred 目錄 ,請輸入 hdfs dfs -mkdir /user/bigred,創建該目錄。


請在特戰包中找到 hadoop-env.cmd ,路徑為 hadoop-2.7.1\etc\hadoop,右鍵點選該檔案,並選擇編輯。

開啟記事本後,請找到 set HADOOP_USER_NAME ,後面接的是連接 HDFS 使用的帳號,範例帳號為 bigred ,請修改為 bigred 並儲存離開,如下圖所示。


修改完畢後,請重新開啟 Hadoop-client.bat,並輸入 hdfs dfs -ls,連接 HDFS 成功後,會看到該帳號目錄底下的檔案,如下圖所示 ( 注意,Hello 為此範例所建的檔案 )。


5. 使用其他帳號連接 HDFS

首先,確認 HDFS 帳號目錄有哪些,請在虛擬機輸入 hdfs dfs -ls /user ,如下圖所示。以 dsa00 為範例。


選定好帳號後,請修改 hadoop-env.cmd 檔案,找到 set HADOOP_USER_NAME ,將後面的帳號修改為範例帳號 dsa00 ,修改後儲存離開,如下圖所示。


修改完畢後,請重新開啟 Hadoop-client.bat,並輸入 hdfs dfs -ls,連接 HDFS 成功後,會看到該帳號目錄底下的檔案,如下圖所示 ( 注意,Hello_dsa00 為此範例所建的檔案 )。


Hadoop 開發特戰包 (Windows 版) - 工具安裝與設定

使用特戰包前,必須先加入兩項工具,JDK Eclipse本文將說明如何安裝工具至特戰包中。

安裝 JDK

請至 Oracle 下載頁面,點選 JDK 並下載最新版 Java,如下圖所示,點選同意後,再選擇 Windows 64 位元的版本下載即可。



下載完成後,請點選程式並開始安裝,安裝步驟如下所示。

1. 安裝開始,請點選下一步。


2. 我們只需要 Development Tools ,請把 Source Code 與 Public JRE 取消安裝,選擇好後請點選下一步開始安裝。



3. 安裝已完成,請點選 Close。


4. 安裝完成後,請找到剛剛安裝好的最新版 JDK (範例的路徑為 C:\Program Files\Java),並把它複製到特戰包中,複製完成後,即可把安裝在電腦的 JDK 移除。


安裝 Eclipse

請至 Eclipse 下載頁面,找到 Eclipse IDE for Java EE Developers,如下圖所示,選擇 64 位元的版本,點選後,網頁將移至下載頁面,再點選左邊 Download 即可。




下載完成後,請解壓縮剛才下載的壓縮檔,並把解壓縮出來的資料夾移至特戰包中。以上步驟完成後,特戰包中一定會有下圖所示的資料夾與檔案,其中,紅色方框中的資料夾是我們方才加入的工具。


JDK 設定與測試

加入時,可以在特戰包中發現,已經有 JDK 7 的版本了,如果我們要使用 JDK 8,必須對特戰包做些許設定,才能讓我們使用它,設定步驟如下。

1. 設定 jdkconfig.bat

首先,使用滑鼠右鍵點選 jdkconfig.bat,再選擇編輯,如下圖所示。


點選編輯後,如有出現視窗,請點選執行,如下圖所示。


出現記事本後,如下圖,看到紅色方框中的 JAVA_HOME 與 JRE_HOME,後面接的是特戰包中的 JDK 資料夾的路徑,請將 jdk1.7.0_65 修改成 jdk1.8.0_92,修改完畢後,請儲存離開。


2. JDK 測試

設定完後,請點選特戰包中的 Hadoop-client.bat,啟動 Hadoop Client 交談視窗,如下圖所示。


啟動後,請輸入 java -version 驗證 JDK 的版本,如果設定成功,會如圖所示,版本編號是1.8.0_92。

接下來,輸入 notepad MyHello.java ,我們撰寫一支小程式,測試 JDK。


輸入後,出現建立新檔案確認視窗,請按是。


撰寫下圖程式碼,撰寫完畢後,請儲存離開。


撰寫完成且儲存完畢後,請輸入 javac MyHello.java ,編譯這支程式。


編譯完成後,輸入 dir * .class ,查看編譯後附檔名為 class 的檔案,確認是否編譯成功。


輸入 java MyHello ,看到 Hello World 的字串,代表程式正確。


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