[筆記] Hadoop 練習


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有呈現另兩台虛擬機,即成功

#hadoop #mapreduce #standalone #Pseudo-Distributed #Fully-Distributed






你可能感興趣的文章

API

API

Day 57 - Jinja & Blog Project

Day 57 - Jinja & Blog Project

Valid Parentheses

Valid Parentheses






留言討論