2013年10月30日 星期三

[ 深入雲計算 ] Hadoop 的安裝和配置: Linux 配置 1 NameNode + 2 DataNode

Preface: 
為了要能跑後續的 Hadoop 範例, 我們要先準備好 Hadoop 的環境. 這邊安裝的平台是 Linux Ubuntu 11.x. NameNode 與 DataNode 配置如下: 
* NameNode: Hostname="ubuntun" ; IP=192.168.80.180; Mem=2G; Storage=10G
* DataNode1: Hostname="ubuntud1"; IP=192.168.80.191; Mem=512M; Storage=10G
* DataNode2: Hostname="ubuntud2"; IP=192.168.80.192; Mem=512M; Storage=10G

在只有一台機器下, 只能透過 VMWare 跑多個 OS. 這邊使用 VMWare Workstation 7.0.1 build-227600; OS 使用 ubuntu-11.10-server-i386.iso 安裝. 安裝 VM OS 的過程不會在下面進行說明, 所以底下列的步驟請自己完成: 
- 安裝 VMWare OS: 參考 這裡
- 在 OS 上要啟動 sshd 服務
- 在 OS 上要安裝 JDK: 參考 這裡
- NameNode 與 DataNodes 間的網絡要連得上.
- 將 NameNode, DataNodes 上面設成固定 IP: 參考 這裡
- 在 OS 上創建 Hadoop 專用的帳號, 下面的範例使用 "john" 為跑 Hadoop 的帳號.

設置 NameNode: 
Step1. 設置 Hostname 
我們的 NameNode 使用 IP=192.168.80.180; Hostname="ubuntun". 第一步我們要將 DataNode 的 Hostname 設置到 /etc/hosts: (紅色與棕色字體是註解!

上面的動作在兩個 DataNode 也要做類似的事, 千萬別忘記!!! 

Step2. 設置無密碼 SSH 登入 
詳細可見 [Linux 小學堂] SSH 免密碼登入, 這邊 NameNode 會做一次, 兩個 DataNode 就以此類推: 
# 你現在是登入在 NameNode, 並以要跑 Hadoop 的帳戶登入!!!!
$ ssh-keygen -t dsa -P "" # 產生 DSA 公鑰/私鑰
Generating public/private dsa key pair.
Enter file in which to save the key (/home/john/.ssh/id_dsa):
 # 按下 Enter
$ ls ~/.ssh
id_dsa id_dsa.pub ... # 產生的 dsa 檔案. .pub 結尾的是公鑰, 需要丟到其他想要無碼密登入的機器上!
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys # 因為 Hadoop 會使用現在帳戶登入, 如果你不想每次啟動 Hadoop 就需要打密碼就...
$ scp /home/john/.ssh/id_dsa.pub john@ubuntud2:~/.ssh/id_dsa_180.pub # 將公鑰複製到 DataNode2 上面
$ ssh john@ubuntud2 # 第一次登入 DataNode2 需要密碼
$ cat ~/.ssh/id_dsa_180.pub >> ~/.ssh/authorized_keys # 現在在 DataNode2 上面
$ logout # 按下 Ctrl+D 登出
Connection to ubuntud2 closed.
$ ssh john@ubuntud2 # 此時再登入 DataNode2 就必須要密碼了. Ya

請確保 NameNode 登入到兩個 DataNode 都不需要密碼; 相同其他兩個 DataNode 登入到另外兩個 Node 也需要設定成不需要密碼. 

Step3. 設置 Hadoop 
接著要來布置 Hadoop 0.23 版本, 並做環境設定: 
# 你現在是在 NameNode!!!
$ wget http://ftp.unicamp.br/pub/apache/hadoop/common/had...op-0.23.9/hadoop-0.23.9.tar.gz # 下載 Hadoop
$ tar -xvf hadoop-0.23.9.tar.gz # 解壓縮
$ ln -s ./hadoop-0.23.9 hadoop # 建立連結, 你不想每次進到 hadoop 都打 "hadoop-0.23.9" 這一串字八...Orz. 另外也方便管理, 想想如果你有新版本 Hadoop 時...
$ sudo vi /etc/profile
...
# 加入下面兩行
export HADOOP_HOME="/home/john/hadoop-0.23.9"
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

$ . /etc/profile # 讓剛剛的設定生效
$ echo $HADOOP_HOME
/home/john/hadoop-0.23.9
$ sudo mkdir /home/hadoop/tmp # 建立 hadoop 暫存資料夾
$ sudo chown -R hadoop:hadoopgroup /home/hadoop/tmp
$ sudo chmod 750 /home/hadoop # Set folder permissions
# 如果你的 NameNode 本地也有跑一個 DataNode, 則下面的設定是需要的!
$ sudo vi $HADOOP_HOME/etc/hadoop/core-site.xml # contains default values for core Hadoop properties.


# Create a copy of the template mapred-site.xml file 
$ sudo cp $HADOOP_HOME/etc/hadoop/mapred-site.xml.template $HADOOP_HOME/etc/hadoop/mapred-site.xml 

# Edit the copy we just created 
$ sudo vi $HADOOP_HOME/etc/hadoop/mapred-site.xml  --- 如果 NameNode local 沒有跑 DataNode, 此處略過!!! 




# By default, Hadoop will place DFS data node blocks in file://${hadoop.tmp.dir}/dfs/data (the property you have just configured in core-site.xml)
# 但你可以透過下面設定設置 HDFS 存放的位置, 方便管理!
$ sudo mkdir /home/hadoop/hdfs 
$ sudo chown -R hadoop:hadoopgroup /home/hadoop/hdfs 
$ sudo chmod 750 /home/hadoop/hdfs
$ sudo vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml # 添加下面的內容














# 上面的 dfs.replication 設定是說你要多少的副本數, 因為我們只有兩個 DataNode, 當然使用預設的 3 會出問題! 
$ sudo vi $HADOOP_HOME/etc/hadoop/slaves # 告訴 NameNode 有多少個 DataNode
  1. 192.168.80.191  
  2. 192.168.80.192  
# 如果 NameNode 處也要跑一個 DataNode, 則把 NameNode 的 IP 也加到上面, 此時就有 3 個 DataNode!
$ hdfs namenode -format # 這步對 NameNode 做初始化

目前已經完成大部分的設置, 接著要來看 DataNode 的設置. 

設置 DataNode: 
DataNode 有兩個, 看完下面就舉一反二搂. 
Step1. 設置 Hostname 
請參考 NameNode 的設置. 

Step2. 設置無密碼 SSH 登入 
請參考 NameNode 的設置. 

Step3. 設置 Hadoop 
接著要來布置 Hadoop 0.23 版本, 並做環境設定: 
# 你現在是在 DataNode!!!
$ wget http://ftp.unicamp.br/pub/apache/hadoop/common/had...op-0.23.9/hadoop-0.23.9.tar.gz # 下載 Hadoop
$ tar -xvf hadoop-0.23.9.tar.gz # 解壓縮
$ ln -s ./hadoop-0.23.9 hadoop # 建立連結, 你不想每次進到 hadoop 都打 "hadoop-0.23.9" 這一串字八...Orz. 另外也方便管理, 想想如果你有新版本 Hadoop 時...
$ sudo vi /etc/profile
...
# 加入下面兩行
export HADOOP_HOME="/home/john/hadoop-0.23.9"
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

$ . /etc/profile # 讓剛剛的設定生效
$ echo $HADOOP_HOME
/home/john/hadoop-0.23.9
$ sudo mkdir /home/hadoop/tmp # 建立 hadoop 暫存資料夾
$ sudo chown -R hadoop:hadoopgroup /home/hadoop/tmp
$ sudo chmod 750 /home/hadoop # Set folder permissions
$ sudo vi $HADOOP_HOME/etc/hadoop/core-site.xml # contains default values for core Hadoop properties.












# 上面的 fs.defaultFS 要設置成 NameNode 的 IP. 因為 DataNode 會向 NameNode 發送 Heartbeat, 讓 NameNode 知道它還活著!


# Create a copy of the template mapred-site.xml file 
$ sudo cp $HADOOP_HOME/etc/hadoop/mapred-site.xml.template $HADOOP_HOME/etc/hadoop/mapred-site.xml 

mapred-site.xml – contains configuration information for MapReduce properties.
# Edit the copy we just created 

$ sudo vi $HADOOP_HOME/etc/hadoop/mapred-site.xml 










# 這邊設定的 Job Tracker 是用在 MapReduce 編程環境中, 在 MapReduce 中一個任務被稱為一個 Job, 透過 Job Tracker 分配 Task 給 DataNode 執行.


# By default, Hadoop will place DFS data node blocks in file://${hadoop.tmp.dir}/dfs/data (the property you have just configured in core-site.xml)
# 但你可以透過下面設定設置 HDFS 存放的位置, 方便管理!
hdfs-site.xml – contains server side configuration of your distributed file system.

$ sudo mkdir /home/hadoop/hdfs 
$ sudo chown -R hadoop:hadoopgroup /home/hadoop/hdfs 
$ sudo chmod 750 /home/hadoop/hdfs 
$ sudo vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml # 添加下面的內容














$ sudo vi hadoop/etc/hadoop/yarn-site.xml # 加入下面設定















到目前為止已經完成了對 DataNode 最基本的 Hadoop 設置. 

啟動 Hadoop Service: 
當 NameNode 與 DataNode 都設置完畢, 接下來便是啟動 Hadoop Services 並跑一個 word count 的範例: 
Step1: Check DataNode Log (Optional) 
請先登入一台 DataNode, (假設是 DataNode1), 並 tail follow data node 的 log: 
# 現在你在 DataNode1 並使用 "john" 帳號登入
$ tail -f hadoop/logs/hadoop-john-datanode-ubuntud1.log # log 的名稱根據你在的 datanode, 啟動服務的帳號有所不同.

Step2: 啟動 Hadoop 服務 
$ start-dfs.sh
Starting namenodes on [192.168.80.180]
192.168.80.180: starting namenode, logging to /home/john/hadoop-0.23.9/logs/hadoop-john-namenode-ubuntun.out
192.168.80.192: datanode running as process 3432. Stop it first.
192.168.80.191: starting datanode, logging to /home/john/hadoop-0.23.9/logs/hadoop-john-datanode-ubuntud1.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /home/john/hadoop-0.23.9/logs/hadoop-john-secondarynamenode-ubuntun.out

$ start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /home/john/hadoop-0.23.9/logs/yarn-john-resourcemanager-ubuntun.out
192.168.80.191: starting nodemanager, logging to /home/john/hadoop-0.23.9/logs/yarn-john-nodemanager-ubuntud1.out
192.168.80.192: starting nodemanager, logging to /home/john/hadoop-0.23.9/logs/yarn-john-nodemanager-ubuntu.out

$ jps # 確認該有的 services 都有起來
6459 Jps
6125 SecondaryNameNode
6205 ResourceManager
5939 NameNode

$ ssh 192.168.80.191 # 登入 DataNode1
$ jps
1822 DataNode - 確定 DataNode 服務有起來!!! 
2145 Jps
1234 NodeManager
 
確定 NodeManager 服務有起來!!! 
$ logout # Ctrl+D 登出 DataNode1, 回到 NameNode
Connection to 192.168.80.191 closed.
$ ssh 192.168.80.192 # 登入 DataNode2
$ jps
3432 DataNode 
確定 DataNode 服務有起來!!! 
5235 Jps
1108 NodeManager
 
確定 NodeManager 服務有起來!!!  

Step3 跑 Word count 測試程式 
接著我們要來跑一個 word count 的測試程式, 確定整個 Hadoop 服務運行正常. 
# 現在我們在 NameNode! /home/john 下
# The –p option make parent directories as needed. In practice, all folders in the mkdir path are created. 
$ mkdir -p ./examples/jverne 
$ cd ./examples/jverne 
$ wget http://www.textfiles.com/etext/FICTION/center_earth # 下載 word count 使用的檔案 
$ hdfs dfs -copyFromLocal ./examples / # 將 "./examples" 下的檔案目錄加到 hdfs 空間的 "/" 路徑下
$ hdfs dfs -ls /examples/jverne # 確定剛剛下載的檔案 "acenter_earth" 有進入 hdfs 檔案系統
Found 1 items
-rw-r--r-- 1 john supergroup 489319 2013-10-29 23:55 /examples/jverne/acenter_earth

# 開始來跑 Word Count 的 MapReduce 程式
$ hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-0.23.9.jar wordcount /examples/jverne /examples/jverne/output
...
13/10/30 00:38:02 INFO mapreduce.Job: Job job_local1049373244_0001 completed successfully
13/10/30 00:38:02 INFO mapreduce.Job: Counters: 32
...

$ hdfs dfs -cat /examples/jverne/output/part-r-00000 # 顯示 Word count 的結果
...
yourselves, 1
youthful 1
zeal 1
zero! 1
zigzag 2
zigzags 1
zoophytes 1
 

關閉 Hadoop Service: 
如果要關閉 Hadoop 的服務可以使用下面命令: 
$ stop-dfs.sh
Stopping namenodes on [192.168.80.180]
192.168.80.180: stopping namenode
192.168.80.192: stopping datanode
192.168.80.191: stopping datanode
Stopping secondary namenodes [0.0.0.0]
0.0.0.0: stopping secondarynamenode

$ stop-yarn.sh
stopping yarn daemons
stopping resourcemanager
192.168.80.192: stopping nodemanager
192.168.80.191: stopping nodemanager
no proxyserver to stop

$ jps
14796 Jps

Supplement: 
[ 文章收集 ] HADOOP-0.23.9 SINGLE NODE SETUP ON UBUNTU 13.04 
Hadoop Shell Commands

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...