Alan Tsai 的學習筆記


學而不思則罔,思而不學則殆,不思不學則“網貸” 為現任微軟最有價值專家 (MVP)、微軟認證講師 (MCT) 、Blogger、Youtuber:記錄軟體開發的點點滴滴 著重於微軟技術、C#、ASP .NET、Azure、DevOps、Docker、AI、Chatbot、Data Science

[Data Science 到底是什麼從一個完全外行角度來看][06]建立Hadoop環境 -下篇

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

上一篇([05]建立Hadoop環境 -上篇)透過VMWare Player把Ubuntu裝好並且一些相關環境設定到,等於把hadoop的基礎環境建立好了。

這篇將延續上篇的環境,把Hadoop建立上去,並且讓Hadoop跑一個hello world的範例。

環境準備

這邊的清單和上一篇一樣,如果上篇已經有抓過,可以跳過:

主機環境
接下來使用到的機器規格如下:
  • OS - Windows 10 1703
  • CPU - i7-6500U 雙核
  • Memory - 16GB
VMWare Player 14

任何虛擬機器軟體都可以,只是剛好用的是VMWare Player 14。

Ubuntu 16.04.3

其他版本的Ubuntu也沒問題 - 如果用的是Ubuntu 14,那麼只有等一下安裝openjdk的部分會有問題,其他都一樣。

Hadoop v2.7.4

基本上 v2.x 的都沒有問題,只是剛好手上有2.7.4所以沒有在下載新的。如果是v3.0那麼設定會不同

MapReduce的Hello World程式 - WordCount

這個是用來測試map reduce的hello world程式:

建立Hadoop測試環境

基本上整個的環境建立大概可以分幾個部分:

  1. 安裝Ubuntu VM
  2. 設定Ubuntu環境
  3. 安裝和設定Hadoop
  4. 測試Hadoop
這篇會介紹第三步和第四部的部分

安裝和設定Hadoop

下載和解壓縮Hadoop

先用firefox下載(直接下載)hadoop到Downloads資料夾

image
下載最後位置

在Terminal(快速鍵 Ctrl + Alt + t)裡面執行以下指令:

cd Downloads
sudo tar -zxvf ./hadoop-2.7.4.tar.gz -C /usr/local
cd /usr/local
sudo mv ./hadoop-2.7.4/ ./hadoop
sudo addgroup hadoop
sudo chown -R hduser:hadoop hadoop
這個的作用是把它解壓縮出來,放到/usr/local/hadoop的位置,並且設定執行權限
image
解壓縮完成看到hadoop資料夾
設定 hadoop/etc/hadoop/core-site.xml

用Terminal執行:gedit /usr/local/hadoop/etc/hadoop/core-site.xml

Configuration裡面輸入:

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

這個是在設定NameNode位置在哪裡 - NameNode之後會介紹,但是基本上就是主控HDFS的Master。

image
修改core-site.xml的截圖
修改hadoop-env.sh

這邊要把${JAVA_HOME}的值寫進去(理論上應該不需要才對,因為我們之前有設定參數,但是好像吃不進去,所以要寫死進去)

在Terminal執行:gedit /usr/local/hadoop/etc/hadoop/hadoop-env.sh

找到:export JAVA_HOME=${JAVA_HOME}然後把它改成export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

image
修改之後的結果
設定hdfs-site.xml

這邊設定的是:

  • 每一個在HDFS的檔案要replicate幾份 - 預設都是3
  • NameNode儲存位置
  • DataNode儲存位置

在Terminal執行:gedit /usr/local/hadoop/etc/hadoop/hdfs-site.xml,然後在Configuration裡面加入:

<property>
 <name>dfs.replication</name>
 <value>3</value>
</property>
<property>
 <name>dfs.namenode.name.dir</name>
 <value> file:/usr/local/hadoop/hadoop_data/hdfs/namenode</value>
</property>
<property>
 <name>dfs.datanode.data.dir</name>
 <value> file:/usr/local/hadoop/hadoop_data/hdfs/datanode</value>
</property
image
修改畫面
修改yarn-site.xml

這邊修改的是yarn的設定,在Terminal執行gedit /usr/local/hadoop/etc/hadoop/yarn-site.xml,在Configuration裡面加入:

<property>
 <name>yarn.nodemanager.aux-services</name>
 <value>mapreduce_shuffle</value>
</property>
<property>
 <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
 <value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
 <name>yarn.nodemanager.resource.cpu-vcores</name>
 <value>1</value>
</property>
<property>
 <name>yarn.nodemanager.resource.memory-mb</name>
 <value>2048</value>
</property>

這邊後面兩個,yarn.nodemanager.resource.cpu-vcoresyarn.nodemanager.resource.memory-mb 是設定使用到的資源,如果後面執行不太起來要注意這個值和VM給的資源。

image
修改完的畫面
修改marped-site.xml

這個檔案預設不存在,所以要從template把它先復製出來。

在Terminal輸入:

cd /usr/local/hadoop/etc/hadoop
sudo cp mapred-site.xml.template mapred-site.xml
cd ~
sudo gedit /usr/local/hadoop/etc/hadoop/mapred-site.xml

打開了之後,把configuration改成:

<property>
 <name>mapreduce.framework.name</name>
 <value>yarn</value>
</property>
image
完成設定
建立HDFS用到的目錄
在Terminal輸入:
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

這個將會建立hdfs的相關資料夾

測試Hadoop

以上就是hadoop的安裝和設定,接下來只需要把它run起來即可。

格式化HDFS
在Terminal執行:
hadoop namenode -format
hadoop datanode -format 
中間可能會問是否確定繼續執行,記得要輸入yes
啟動yarn和hdfs
在Terminal輸入:
start-yarn.sh
start-dfs.sh

這個是在Master上面執行,會自動透過ssh的方式把所有Slave也一起啟動。

還有兩種啟動方式:
  • start-all.shstop-all.sh - 這個已經被deprecated 不過同等於上面兩個在一起執行
  • hadoop-daemon.sh namenode/datanodeyarn-deamon.sh resourcemanager - 這個是手動在各個節點裡面手動啟動對應服務
確認啟動process是否正常

在Terminal上面執行:jps

image
檢查執行的服務

這邊會看到5個服務:

  1. NameNode
  2. SecondaryNameNode
  3. ResourceManager
  4. NodeManager
  5. DataNode
在真的分散式架構,前3個只會在Master出現,後面兩個只會在Slave出現
確認Web UI是否正常

服務啟動成功之後可以在Firefox輸入:

image
ResourceManager的畫面
image
NameNode的畫面

執行Hadoop的Hello World - WordCount

首先先把 WordCount2.jarjane_austen.txt下載到Downloads裡面。

image
下載完的畫面

把檔案複製到 hadoop的HDFS裡面,在Terminal輸入:

cd ~/Downloads
hadoop fs -mkdir -p /user/hduser/input
hadoop fs -copyFromLocal jane_austen.txt /user/hduser/input
可以用hadoop fs -ls /user/hduser/inpu檢查複製進去的檔案。

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

image
執行WordCount

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

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

結語

在這篇把整個Hadoop建立完成,並且執行了一個map reduce的word count程式計算出pride and prejudice前3章的字數計算。

在這篇建立出來的hadoop是所謂的pseudo-distributed mode,換句話說Master和Slave在同一台機器,但是實際運作上會有Master對上多個Slave。

不過在進入這種分散式模式之前,需要在了解一些hadoop細節。

在下一篇([07]更深入看看Hadoop裡面的YARN和HDFS),將會在針對hadoop裡面的分散式模式在做更詳細一點介紹,包含yarn和hdfs裡面對應的process。

  

如果文章對您有幫助,就請我喝杯飲料吧
街口支付QR Code
街口支付QR Code
台灣 Pay QR Code
台灣 Pay QR Code
Line Pay 一卡通 QR Code
Line Pay 一卡通 QR Code
街口支付QR Code
支付寶QR Code
街口支付QR Code
微信支付QR Code
comments powered by Disqus