Alan Tsai 的學習筆記


學而不思則罔,思而不學則殆,不思不學則“網貸” 記錄軟體開發的點點滴滴 著重於微軟技術、網頁開發、DevOps、C#, Asp .net Mvc、Azure、AI、Chatbot、Docker、Data Science

[Data Science 到底是什麼從一個完全外行角度來看][08]Hadoop 改成完全分散模式

image
圖片來源: https://pixabay.com/en/books-spine-colors-pastel-1099067/https://pixabay.com/en/math-blackboard-education-classroom-1547018/

在上一篇([07]更深入看看Hadoop裡面的YARN和HDFS)了解了整個jps的process代表的意思之後,在這篇將會延續之前([05]建立Hadoop環境 -上篇[06]建立Hadoop環境 -下篇)建立出來pseudo-distributed mode的hadoop改成 fully-distributed mode

這篇結束之後,除了Master,會建立出一台slave。由於Master裡面也有DataNode和NodeManager,所以總共會有2個DataNode。

建立步奏

基本上整個的建立步奏可以分為6個部分:

  1. 修改原本的VM變成Master機器
  2. 從Master建立Slave
  3. 最後設定
  4. 重新Format指令
  5. 啟動和驗證
  6. 執行WordCount

修改原本的VM變成Master機器

修改Hostname改成master

開啟Terminal(快速鍵Ctrl+Alt+ t)然後輸入:sudo gedit /etc/hosts

在裡面的檔案把ubuntu改成master

image
調整host
記得透過右上角把整個機器重啟,然後開termianl會發現@後面是master
image image
重啟機器和檢查terminal是不是變成master
重啟了之後,當輸入指令會需要等一下,因為他會嘗試和master溝通 - master不存在所以要等一下他timeout才會出現
設定host的ip

透過右上角的network資訊找到目前機器的ip,並且用terminal執行:sudo gedit /etc/hosts

在裡面加入:{ip} master - ip是上面找到的ip

image
找到ip
image
設定master的host ip
修改NameNode

在terminal執行:gedit /usr/local/hadoop/etc/hadoop/master

在開的檔案,把裡面內容改成master

image
改成master
修改cor-site.xml

在terminal輸入:gedit /usr/local/hadoop/etc/hadoop/core-site.xml

整個configuration內容改成:

    <property>
     <name>fs.default.name</name>
     <value>hdfs://master:9000</value>
    </property>

這邊把localhost改成了master

修改hdfs-site.xml

用terminal開啟:gedit /usr/local/hadoop/etc/hadoop/hdfs-site.xml

Configuration最後一筆的前面加上

<property>
    <name>dfs.permissions</name>
    <value>false</value>
</property>
image
修改畫面
修改 mapred-site.xml

在terminal輸入:gedit /usr/local/hadoop/etc/hadoop/mapred-site.xml

增加以下設定Configuration:

<property>
        <name>mapred.job.tracker</name>
        <value>master:54311</value>
    </property>
image
設定畫面
修改yarn-site.xml

在terminal輸入:gedit /usr/local/hadoop/etc/hadoop/yarn-site.xml

增加以下設定到Configuration:

<property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>master:8025</value>
        </property>
        <property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>master:8030</value>
        </property>
        <property>
        <name>yarn.resourcemanager.address</name>
        <value>master:8050</value>
    </property>
image
增加yarn site設定
slaves檔案設定

用terminal輸入:gedit /usr/local/hadoop/etc/hadoop/slaves

改成以下設定:

    master
    slave1

從Master建立Slave

先從設定找到Master VM的設定位置,並且複製一份出來

image
image
透過設定找到VM檔案位置

用開啟VM的方式打開複製出來的VM

image
開啟VM並且改成hadoop-slave

對開啟的VM做出:

  1. 選擇剛剛開啟的VM
  2. 選擇設定
  3. 切換Options的頁簽
  4. 修改VM名稱為hadoop-slave
  5. 按下 ok
image
設定VM名稱

把slave那台啟動起來,當出現選擇的時候,記得選擇I Copied It

image
選擇I Copied It

最後把兩個VM都啟動起來,可以再上面的title看到那一台是master和那台是slave

image
兩台機器啟動起來

最後設定

修改slave那台的hostname改成slave1

開啟Terminal(快速鍵 Ctrl+Alt+ t)然後輸入: sudo gedit /etc/hosts

在裡面的檔案把 master改成 slave1

image
調整host
記得一樣要重啟機器才會有作用
設定slave的ip

透過右上角的network資訊找到slave機器的ip,並且在master和slave的機器terminal執行:sudo gedit /etc/hosts

在裡面加入:{ip} slave1 - ip是上面找到的ip

image
兩台都要修改
確認master和slave 1可以互動

分別從master那台的terminal呼叫:ping slave1slave那台機器的terminal呼叫:ping master

確保兩台之間溝通沒有問題

image
兩台互相ping
在master那台設定slave的sh key

在master的機器把slave ssh key建立出來然後做出測試,在terminal執行:

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    scp -r ~/.ssh slave1:~/
    ssh slave1
    exit
image
測試ssh畫面

重新Format指令

建立DataNode和NameNode資料夾

master輸入以下來重建資料夾:

sudo rm -rf /usr/local/hadoop/hadoop_data/hdfs
mkdir -p /usr/local/hadoop/hadoop_data/hdfs/namenode
mkdir -p /usr/local/hadoop/hadoop_data/hdfs/datanode
sudo chown -R hduser:hduser /usr/local/hadoop

slave輸入以下來重建對應資料夾:

sudo rm -rf /usr/local/hadoop/hadoop_data/hdfs
mkdir -p /usr/local/hadoop/hadoop_data/hdfs/datanode
sudo chown -R hduser:hduser /usr/local/hadoop
格式化hdfs

master輸入以下來format hdfs:

hadoop namenode -format
hadoop datanode -format

slave輸入以下來format hdfs:

hadoop datanode -format

啟動和驗證

在master呼叫start-all.sh(這邊偷懶了,其實比較建議呼叫start-yarn和start-hdfs)來啟動整個hadoop。

啟動了之後可以再兩台的jps看到服務都出現:

image
master同時也是slave

檢查ResourceManager,在Firefox輸入:http://localhost:8088

image
可以看到有兩個Node

檢查DataNode,在Firefox輸入:http://localohost:50070

image
可以看到有兩個DataNode

執行WordCount

執行方式和之前一模一樣:

cd ~/Downloads
hadoop fs -mkdir -p /user/hduser/input
hadoop fs -copyFromLocal jane_austen.txt /user/hduser/input

執行WordCount程式:hadoop jar wordcount2.jar WordCount /user/hduser/input/jane_austen.txt /user/hduser/output

檢查執行結果:hadoop fs -cat /user/hduser/output/part-r-00000

如果要在執行一次計算,需要先把hdfs裡面的output砍掉,要不然會執行不了。指令是:hadoop fs -rm -r /user/hduser/output
如果執行有問題,或者run不起來,可以試試重開機,然後從測試Hadoop裡面的格式化HDFS開始重新做一次。

結語

在這篇,透過之前建立的VM轉換成為Master,並且在從這個Master複製出來變成slave。

可以想象,如果要串聯多台電腦可以用這種方式達到分散式運算和分散式檔案儲存。只不過這邊用VM來模擬這個情況。

基本上,到目前為止對於整個Hadoop應該已經有個比較完整的感覺,並且了解如何建立一個測試來玩玩看。

不過有一個部分還沒有介紹,就是MapReduce裡面執行的WordCount程式是怎麼建立出來。

在下一篇將會介紹MapReduce執行的概念和WordCout是怎麼寫出來。

comments powered by Disqus