關於安裝的細部流程,請參考
- [Linux] 安裝 Hadoop 0.20.1 Multi-Node Cluster @ Ubuntu 9.10
- [Linux] 安裝單機版 Hadoop 0.20.1 Single-Node Cluster (Pseudo-Distributed) @ Ubuntu 9.04
大概瀏覽一下這兩篇,應該可以稍稍了解架設 Hadoop 的過程。
在這邊要玩的是將 Hadoop 架設在異質環境中,手邊有以下的機器:
- 64-Bit, FreeBSD 8 x 2
- 32-Bit, FreeBSD 7 x 1
- 64-Bit, Linux x 2
共五台機器,並使用 Hadoop-0.20.2 ,理由純粹是擔心 0.21.0 設定檔有更新,自己還沒追到 :P
以上台機器有一個共同點:
- 使用 NFS 掛載使用者家目錄
加上 Hadoop 是跑在 User Mode 的環境,因此我不需要太多的管理權限(軟體不存在?那就用 tarball 安裝),只需留意使用的 port number 是否已被使用,最多則是 /tmp 目錄是否可以使用吧!
緊接著,我開始嘗試在 FreeBSD 環境上安裝!第一個碰到的問題是 jdk 的部份!幸運地發現有人在維護 jdk ,而機器上面也有安裝 jdk,但為了求 Hadoop 的設定檔可以一致性,我下載了適用於 FreeBSD jdk,可以在這邊下載:
另外 Linux 部份則是直接到 Sun 下載:
- Java SE Downloads - Sun Developer Network (SDN)
- jdk-6u22-linux-i586.bin (Linux)
- jdk-6u22-linux-x64.bin (Linix x64)
如此一來,我在我的家目錄建立一個 hadoop 目錄並擺上上述的目錄結構,並把一些 jdk 目錄多了 32bit 和 64bit 的字樣
# ls -l ~/hadoop
diablo-jdk1.6.0_07_32bit/
diablo-jdk1.6.0_07_64bit/
hadoop-0.20.2/
jdk1.6.0_22_32bit/
jdk1.6.0_22_64bit/
接著才是進入環境的設定:
- 建立 SSH 登入免帳號
- # ssh-keygen -t rsa -P ''
# cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys - 由於上述幾台機器都透過 NFS 彼此相連,因此只需在一台機器上操作,其餘的就沒問題,可以用 ssh 登入 locahost 和各台機器試試,應該不用輸入密碼即可登入。請務必先用 ssh 登入各台機器,讓機器記錄相關初始化的資訊。
- # ssh-keygen -t rsa -P ''
- 設定各台 /ets/hosts 資訊
- 通常有提供 NFS 服務的機器都算已經有加好了,例如:
192.168.56.168 bsd1
192.168.56.169 bsd2
192.168.56.170 bsd3
192.168.56.171 linux1
192.168.56.172 linux2 - 如果要加的話,就變成要有管理者權限,不加應該可以純用 IP 試試。請記得描述不要用到 '_' 唷,如 bsd_32bit,已經有兩人跟我分享過這樣會連不到機器
- 通常有提供 NFS 服務的機器都算已經有加好了,例如:
- 設定 Hadoop 相關檔案
- 由於我將 hadoop 安裝在 ~/hadoop/hadoop-0.20.2 裡頭,因此我的設定檔是在 ~/hadoop/hadoop-0.20.2/conf 中
- 設定 conf/hadoop-env.sh
- 由於是異質環境,因此我要多判斷環境來挑選 jdk 使用。加在第 10 列左右
- FLAG_AMD64=`uname -a | grep -i -c 'amd64'`
FLAG_X86_64=`uname -a | grep -i -c 'x86_64'`
FLAG_FREEBSD=`uname -a | grep -i -c 'FreeBSD'`
FLAG_LINUX=`uname -a | grep -i -c 'Linux'`
if [ $FLAG_AMD64 = 1 ] || [ $FLAG_X86_64 = 1 ]; then
if [ $FLAG_FREEBSD = 1 ]; then
export JAVA_HOME=/home/user/hadoop/diablo-jdk1.6.0_07_64bit
elif [ $FLAG_LINUX = 1 ]; then
export JAVA_HOME=/home/user/hadoop/jdk1.6.0_22_64bit
fi
else
if [ $FLAG_FREEBSD = 1 ]; then
export JAVA_HOME=/home/user/hadoop/diablo-jdk1.6.0_07_32bit
elif [ $FLAG_LINUX = 1 ]; then
export JAVA_HOME=/home/user/hadoop/jdk1.6.0_22_32bit
fi
fi
- FLAG_AMD64=`uname -a | grep -i -c 'amd64'`
- 設定停用 IPv6,過去經驗因為沒有加這個設定而導致機器彼此連不到,可以依自己的環境多測試,或許已經可以不用加了。加在第 50 列左右
- HADOOP_OPTS=-Djava.net.preferIPv4Stack=true
- 由於是異質環境,因此我要多判斷環境來挑選 jdk 使用。加在第 10 列左右
- 設定 conf/core-site.xm
- 設定 NameNode 擺在哪一台機器,挑強一點的吧!在此挑 bsd1 和使用 9000 port,請自行確認 9000 可否使用
- <?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://bsd1:9000</value>
<description>The name of the default file system. A URI whose
scheme and authority determine the FileSystem implementation. The
uri's scheme determines the config property (fs.SCHEME.impl) naming
the FileSystem implementation class. The uri's authority is used to
determine the host, port, etc. for a filesystem.</description>
</property>
</configuration>
- 設定 conf/mapred-site.xml
- 設定 job tracker,在此挑 bsd1 和 9001 port,請自行確認 9001 可否使用
- <?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>bsd1:9001</value>
<description>The host and port that the MapReduce job tracker runs
at. If "local", then jobs are run in-process as a single map
and reduce task.
</description>
</property>
</configuration>
- 設定 conf/masters
- 這是 secondary namenode,預設是 locahost,可以改成指定成另一台機器,例如 bsd2 等,由於我目前不想要 secondary namenode,因此把這個檔案清空
- 設定 conf/slaves
- 設定 datanode 的機器,以原先的架構,就 bsd1 當 namenode,其他當 datanode,因此可以依序填入 bsd2, bsd3, linux 等機器,但由於我想要讓 bsd1 也加入運算的環境,因此最後我的設定是有四台機器,建議先一台台機器加上去,例如一開始只加 bsd2 這台機器
- bsd1
bsd2
bsd3
linux1
linux2
- 啟動與測試
- 對 NameNode 進行資料的格式化,目前以 bsd1 當作 NameNode,在 bsd1 執行以下指令
- # ~/hadoop/hadoop-0.20.2/bin/hadoop namenode -format
- 經同事提醒,只要在某一台機器上執行 ~/hadoop/hadoop-0.20.2/bin/start-all.sh,該台機器就會是 NameNode,因此我就選擇在 bsd1 上執行( 嘗試在 bsd2 執行結果有問題?細節還沒去追)
- 執行完後,可以使用 jps 指令查看狀態
- 依照目前的設定,bsd1 會是 NameNode、DataNode、TaskTracker和JobTracker,其他機器則是會有 DataNode 和 TaskTracker 的資訊
- 請依照各機器 jdk 位置執行
- bsd1, FreeBSD 8 64-bit
- # ~/hadoop/diablo-jdk1.6.0_07_64bit/bin/jps
- bsd3, FreeBsd 7 32-bit
- # ~/hadoop/diablo-jdk1.6.0_07_32bit/bin/jps
- linux 64-bit
- $ ~/hadoop/jdk1.6.0_22_64bit/bin/jps
- bsd1, FreeBSD 8 64-bit
- 另一種查看方式
- # ~/hadoop/hadoop-0.20.2/bin/hadoop dfsadmin -report
- 將會成列出目前的 DataNode 狀態,以上述的設定將會有 5 個 DataNode (conf/slaves中所呈列的)
- 如果執行上有問題,例如某台機器沒跑起來,可以試著用 stop-all.sh 和 start-all.sh 來重跑看看,機器並不是每次跑都成功的 XD
- 測試 wordcount
- # ~/hadoop/hadoop-0.20.2/bin/hadoop fs -mkdir input
# ~/hadoop/hadoop-0.20.2/bin/hadoop fs -put ~/hadoop/hadoop-0.20.2/README.txt input/
# ~/hadoop/hadoop-0.20.2/bin/hadoop jar hadoop-0.20.2-examples.jar wordcount input output - 印出結果
# ~/hadoop/hadoop-0.20.2/bin/hadoop fs -ls output/
# ~/hadoop/hadoop-0.20.2/bin/hadoop fs -cat output/part-r-00000
- # ~/hadoop/hadoop-0.20.2/bin/hadoop fs -mkdir input
- 對 NameNode 進行資料的格式化,目前以 bsd1 當作 NameNode,在 bsd1 執行以下指令
經過上述的設定,輕鬆地整合異質環境!其中 FreeBSD 跑 Java 的部份,可能因為各台機器已經有作過 Java 相關環境的設定,因此並沒碰到啥大問題!除此之外,由於 Hadoop 算是只要 user mode 的權限就可以執行,再加上許多學校的機器都是使用 NFS 掛載家目錄進來的,看來,這樣惡搞下去,學校的 SA 要 QQ 了(附帶一提,光 ~/hadoop 目錄就已經 927MB 了!此方式僅適用於沒有設 quota 的機器啊啊)。至於加減機器的方式,多虧 NFS 的關係,只須修改 conf/slaves 的資料,多一台就加一筆,少一台就減一筆,然後在從 NameNode 透過 start-all.sh 和 stop-all.sh 就可以啟動囉!以前都在 VirtaulBox 上架機器,第一次覺得加減機器的設定是如此的方便有爽感,這大概算是自己架過最多台實體機器的一次吧!
沒有留言:
張貼留言