1. 安裝 VM 並新增 Ubuntu 的虛擬機
下載 64位元 伺服器版 20.04 版的 ubuntu 系統
VirtualBox 參數:
Storage: 20 GB
RAM: 4GB
隨後完成基本設定
2.hadoop 環境設定
首先下載 SSH 以方便用 cmd 進行作業
$ sudo apt-get install ssh
下載完後開啟 cmd 使用遠端登入,執行以下指令(Hadoop 由 Java 建構而成,因此要先安裝 Java 的執行環境)
$ sudo apt update
$ sudo apt-get upgrade
$ sudo apt install default-jdk
驗證 java 版本
$ java -version
下載 Hadoop
$ wget https://dlcdn.apache.org/hadoop/common/hadoop-3.2.3/hadoop-3.2.3.tar.gz
Decompression:
解壓縮安裝包
$ tar -xzvf hadoop-3.2.3.tar.gz
Move Hadoop binary file:
將執行檔移動到特定資料夾上
$ sudo mv hadoop-3.2.3 /usr/local/hadoop
執行看看你下載的 Hadoop 是否正常
$ /usr/local/hadoop/bin/hadoop
#會報錯
ERROR: JAVA_HOME is not set and could not be found.
需要讓 Hadoop 知道你的 Java 執行環境
找出你的 Java 路徑:
$ readlink -f /usr/bin/java | sed "s:bin/java::"
/usr/lib/jvm/java-11-openjdk-amd64/
設定你的 Hadoop 設定檔:
$ vi /usr/local/hadoop/etc/hadoop/hadoop-env.sh
# 加入以下程式碼
JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/
驗證是否成功
$ /usr/local/hadoop/bin/hadoop version
3.Hadoop - Standalone
Hadoop Modo 分為以下幾個:
1.獨立模式 (Standalone)
只需要一台 host 即可
2.偽分佈模式 (Pseudo-Distributed)
只需要一台 host 即可
3.多機安裝模式 (Fully-Distributed)
需要多個 host 來達到分散 (Distributed) 的效果
Hadoop 預設的模式就是 Standalone,只要完成幾個步驟即可使用,Standalone 僅供測試與體驗用途,不適合執行大量運算或是儲存大量資料
範例:執行 Hadoop standalone 模式下的 grep
grep 基本語法:
<hadoop> 執行檔 jar <PATH>/<MapReduce>.jar grep <input> <output> <正規表示法>
設定 input:
input 為需要被 MapReduce 處理的原始文件
在這個範例中,我們以 /usr/local/hadoop/etc/hadoop/*.xml 作為示範
$ mkdir ~/input
$ cp /usr/local/hadoop/etc/hadoop/*.xml ~/input
正規表示法:
以 'dfs[a-z.]+' 作為範例,代表 input 資料夾中,所有 dfs 開頭的檔案內容
$ /usr/local/hadoop/bin/hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.3.jar grep input output 'dfs[a-z.]+'
在自動生成的 output 資料夾中出現以下資料即成功(執行前需確認 output 資料夾不存在,否則會報錯)
4.Hadoop - Pseudo-Distributed
Pseudo-Distributed 與 Standalone 運作方式類似,無法擁有 Hadoop 的容錯機制與分散式等優點,Pseudo-Distributed 的 daemon 是在不同 JVM 運作,儲存模式也與 Standalone 一樣,可以使用 local file system 或是 HDFS
Hadoop 依據功能不同,設定檔可分為以下部份:
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml
設定檔格式:
Property 屬性
name: 屬性名稱
value: 屬性質
description: 屬性描述
<configuration>
<property>
<name></name>
<value></value>
<description></description>
</property>
</configuration>
1.core-site.xml:
$ sudo vi /usr/local/hadoop/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
2.hdfs-site.xml:
$ sudo vi /usr/local/hadoop/etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
3.mapred-site.xml:
$ sudo vi /usr/local/hadoop/etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
4.yarn-site.xml:
$ sudo vi /usr/local/hadoop/etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
啟動 Hadoop 相關 service
格式化 NameNode:
$ /usr/local/hadoop/bin/hdfs namenode -format
免密碼設定:
$ ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
編輯 PermitRootLogin
$ sudo vi /etc/ssh/sshd_config
# 新增這三行
PermitRootLogin yes
PasswordAuthentication yes
PubkeyAuthentication yes
重啟 ssh
$ sudo service ssh restart
啟動 NameNode、DataNode、YARN:
$ export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/
$ cd /usr/local/hadoop/sbin/
$ ./start-dfs.sh
$ ./start-yarn.sh
使用 net-tools 測試有無成功
$ sudo apt install net-tools
$ sudo netstat -ntlp
有出現 port 9000 即成功
5. Hadoop Pseudo-Distributed - MapReduce
基本流程:
- 格式化文件系統
- 啟動 NameNode / DataNode
- 創建 input 資料夾
- 瀏覽 NameNode 的 Web 界面
- 創建執行 MapReduce 作業所需的 HDFS 目錄
- 將 input 文件複製到分布式文件系統中
- 運行 MapReduce
- 檢查輸出文件
jps 檢查服務:
$ jps
35587 NameNode
35780 DataNode
36567 NodeManager
36010 SecondaryNameNode
36987 Jps
36206 ResourceManager
關閉防火牆進入 NameNode 的 Web 界面
$ sudo ufw disable
在瀏覽器上輸入 http://xxx.xxx.xx.xx:9870/ (虛擬機連的 ip)
創建執行 MapReduce 作業所需的 HDFS 目錄
創建 MapReduct 測試資料夾在分散式系統中:
$ /usr/local/hadoop/bin/hdfs dfs -mkdir /test
選擇 Utilities - Browse the file system
將輸入文件複製到分布式文件系統中:
$ /usr/local/hadoop/bin/hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml /test
運行 MapReduce
建立官方的 example 所需要的目錄
$ /usr/local/hadoop/bin/hdfs dfs -mkdir /user
$ /usr/local/hadoop/bin/hdfs dfs -mkdir /user/u
$ /usr/local/hadoop/bin/hdfs dfs -mkdir input
複製資料進 input:
$ /usr/local/hadoop/bin/hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml input
檢查 etc/hadoop/mapred-site.xml 是否包含以下敘述:
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
新增完後,重啟
$ ./stop-dfs.sh
$ ./stop-yarn.sh
$ ./start-dfs.sh
$ ./start-yarn.sh
運行 MapReduce
$ /usr/local/hadoop/bin/hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.3.jar grep input output 'dfs[a-z.]+'
6. Hadoop - Fully-Distributed
首先 VM 內需有三台不同 IP 的虛擬主機,並將 hadoop 環境架設完畢
1. 設定主機名稱,並重登(logout)
Master:
$ hostnamectl set-hostname master
Slave1:
$ hostnamectl set-hostname slave1
Slave2:
$ hostnamectl set-hostname slave2
2. Hosts 設定檔 (Master, Slave1, Slave2):
三台虛擬機皆須設定
sudo vi /etc/hosts
<MASTER_IP_ADDRESS> master
<SLAVE1_IP_ADDRESS> slave1
<SLAVE2_IP_ADDRESS> slave2
3. 設定檔
1.core-site.xml:
$ sudo vi /usr/local/hadoop/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>fs.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
</configuration>
2.hdfs-site.xml:
$ sudo vi /usr/local/hadoop/etc/hadoop/hdfs-site.xml
dfs.replication 代表一台 Node 要儲存幾份檔案
數字的設定不能 > 實際機器數量
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/usr/local/hadoop/hdfs/name</value>
</property>
<property>
<name>dfs.namenode.data.dir</name>
<value>/usr/local/hadoop/hdfs/data</value>
</property>
</configuration>
3.mapred-site.xml:
$ sudo vi /usr/local/hadoop/etc/hadoop/mapred-site.xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
4.yarn-site.xml:
$ sudo vi /usr/local/hadoop/etc/hadoop/yarn-site.xml
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8035</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<property>
<name>yarn.nodemanager.address</name>
<value>master:59392</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
5.
$ sudo vi /usr/local/hadoop/etc/hadoop/works
#加入以下兩行字
slave1
slave2
$ sudo vi /usr/local/hadoop/etc/hadoop/slaves
#加入以下兩行字
slave1
slave2
$ sudo vi /usr/local/hadoop/etc/hadoop/master
#加入以下字
master
4. 將設定檔複製到另兩台虛擬機
分別將設定檔複製到 slave-1, slave-2
# 打入 name 與 ip
$ scp /usr/local/hadoop/etc/hadoop/* <slave_username>@<slave_IP>:/usr/local/hadoop/etc/hadoop/
5. ssh 設定
ssh 免密碼設定:
$ ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
編輯 PermitRootLogin
$ sudo vi /etc/ssh/sshd_config
# 新增這三行
PermitRootLogin yes
PasswordAuthentication yes
PubkeyAuthentication yes
重啟 ssh
$ sudo service ssh restart
最後在各台虛擬機都 ssh 另兩台虛擬機,使虛擬機互有金鑰
6. Restart Master、slave1、slave2
Master:
#stop
$ ./stop-dfs.sh ; ./stop-yarn.sh
#格式化
$ /usr/local/hadoop/bin/hdfs namenode -format
#start
$ ./start-dfs.sh ; ./start-yarn.sh
slave1、slave2
#stop
$ ./stop-dfs.sh ; ./stop-yarn.sh
#格式化
$ /usr/local/hadoop/bin/hdfs namenode -format
#start
$ ./start-dfs.sh
最後在網址上輸入 master ip + :9870,datanode有呈現另兩台虛擬機,即成功