本系列文章講述搭建完全分布模式hadoop的安裝配置過程,還將講述完全分布式模式的一些基本操作。准備采用先單機調通再加入節點的方式。本文只講述單節點的安裝和配置。
1. Namenode和JobTracker的安裝
這是完全分布模式集群的第一台,也是很關鍵的一台。采用VMWARE虛擬的Ubuntu Linux 11.10 server版。安裝Linux非本文重點就不說了。 默認建立了一個用戶叫abc, 其有sudo權限。root的口令是隨機的一個口令,只能用sudo命令暫時提升到root權限。為保險起見,安裝完系統第一件事就是改root密碼。用sudo passwd root,系統不會問你要原口令,直接輸入新口令兩遍即可。有root口令在手,后面萬一操作錯誤不至於束手無策。
1.1 安裝JDK1.6
有個命令可以很快地安裝jdk, sudo apt-get install sun-java6-jdk, 這是ubuntu系統本身一個機制。當時試了一下,沒有成功,記得說是找不到包。不知道啥原因,要不網絡不行,要不包名不對了。就放棄了。只好找另外的辦法。
到Oracle網站上找到JDK 1.6的目前最新版本 JDK 1.6.0_31. 得到其下載鏈接:


選這個是因為它是32位的JDK, Ubuntu Linux選的是32位的。JDK所以也選32位。點“Accept License Agreement", 右鍵點到"jdk-6u31-linux-i586.bin"上,在屬性中得到其鏈接:http://download.oracle.com/otn-pub/java/jdk/6u31-b04/jdk-6u31-linux-i586.bin, 再回到虛擬機中,用abc登錄,輸入命令:
wget http://download.oracle.com/otn-pub/java/jdk/6u31-b04/jdk-6u31-linux-i586.bin
這下載需要一段時間。等下載完成后,在/home/abc/下就有一個jdk-6u31-linux-i586.bin的文件。
sudo mkdir /usr/lib/jvm
cd /usr/lib/jvm
sudo mkdir java
cd java
sudo cp /home/abc/jdk-6u31-linux-i586.bin .
sudo chmod 777 jdk-6u31-linux-i586.bin
./jdk-6u31-linux-i586.bin
這樣就開始安裝jdk了。一會就安裝好了。
sudo vi /etc/environment
將此文件做如下修改:
在PATH那一行后面添加 :/usr/lib/jvm/java/jdk1.6.0_31/bin 注意/usr前面那個冒號是需要的。
再加這兩行:
CLASSPATH=.:/usr/lib/jvm/java/jdk1.6.0_31/lib
JAVA_HOME=/usr/lib/jvm/java/jdk1.6.0_31
保存
說明:有的地方說linux 系統本身會默認安裝一些包如openjdk包,就會造成多個jvm共存。還需要用update -alternatives 命令去選擇默認的jvm到剛安裝的jdk目錄。
發現Ubuntu Linux11.10 server版默認沒有裝其他的任何jdk包,在此之前連java命令都無法運行,所以不需要運行update-alternatives 命令了。
sudo reboot
1.2 建立hadoop用戶和hadoop組
重啟系統后,登錄abc用戶
sudo addgroup hadoop
sudo adduser --ingroup hadoop hadoop
輸入新口令兩遍,然后是一些無關緊要的信息,一路回車直到完成命令。hadoop用戶就建立了。
su
輸入root的口令,成功后就換成了root用戶
繼續輸入命令:
chmod u+w /etc/sudoers
vi /etc/sudoers
在此行:root ALL=(ALL:ALL) ALL 后加一行:
hadoop ALL=(ALL:ALL) ALL
意思就是允許hadoop用戶sudo運行任何命令
保存
chmod u-w /etc/sudoers
這是把sudoers文件的權限改回440, 即root用戶通常也只讀。Ubuntu linux的sudo 命令運行時會檢查這個文件權限是否440, 如果不是440, sudo命令都沒有辦法工作。所以改完之后一定要改回原來的440.
作為root用戶的任務就結束了,輸入exit退出root用戶
再輸入exit退出abc用戶
1.3 配置SSH Key以便hadoop用戶無密碼登錄集群
再用剛剛建立的用戶hadoop來登錄,
sudo apt-get install ssh
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
要用命令ssh localhost來測試一下ssh是否工作,如果不用輸入口令那就正確。
1.4 檢查主機名,修改/etc/hostname, /etc/hosts
sudo vi /etc/hostname
檢查系統自動分配的主機名是否合適,不合適的話改成一個有意義的名字,如namenode,保存
ifconfig
看看當前IP,記錄下來。
sudo vi /etc/hosts
那些127開頭的兩行都不用動,
在后面加剛剛記錄的IP 和新改的主機名,保存
這個很重要。不正確地做的話,可能后面jobtracker的reduce步驟運行不正常。
1.5 安裝hadoop包
從http://hadoop.apache.org/common/releases.html找一個當前的stable的版本。找到了0.20.203.0版本,找一個比較近的鏡像站點。wget下載此包到/home/hadoop/目錄下。
繼續以hadoop用戶輸入命令
sudo mkdir /usr/local/hadoop
sudo chown hadoop:hadoop /usr/local/hadoop
cp /home/hadoop/hadoop-0.20.203.0rc1.tar.gz /usr/local/hadoop
cd /usr/local/hadoop
tar zxvf hadoop-0.20.203.0rc1.tar.gz
cd hadoop-0.20.203.0/conf
vi hadoop-env.sh
就把這行改成這樣:export JAVA_HOME=/usr/lib/jvm/java/jdk1.6.0_31/, 其他都可以暫時不動。
vi core-site.xml
里面是空的,將其內容改成:
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://namenode:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp</value>
</property>
</configuration>
vi hdfs-site.xml, 加入:
<property>
<name>fs.default.name</name>
<value>hdfs://namenode:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
這個dfs.replication表示數據復制的份數,生產環境就不可能是1了,當然是要大於1了。
vi mapred-site.xml,將其改成:
<property>
<name>fs.default.name</name>
<value>hdfs://namenode:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>namenode:9001</value>
</property>
注意這里jobtracker和namenode選用了同一個主機,即在同一台機器上,生產環境是可以namenode和jobtracker分開成兩個機器的。
都改完成了。就修改一下PATH變量:
sudo vi /etc/environment
在PATH那一行后面再加上 :/usr/local/hadoop/hadoop-0.20.203.0/bin 保存, 這是為了能隨時可用hadoop的命令。
sudo reboot重啟
1.6 格式化hdfs
再用hadoop用戶登錄,
hadoop namenode -format
1.7 啟動此單機配置及驗證
start-all.sh
此hadoop單個節點的就啟動了。
驗證可以用:
jps
出這樣的結果就對了:
3156 NameNode
2743 SecondaryNameNode
3447 Jps
2807 JobTracker
2909 TaskTracker
2638 DataNode
再hadoop dfsadmin -report
能顯示出hdfs的信息
訪問http://namenode:50070/ 顯示hdfs的信息
還有http://namenode:50030/ 顯示jobtracker的信息
再可以用一些常用命令將文件放到hdfs上,如
hadoop fs -put test.txt /user/hadoop/test.text
以上可以證明hdfs基本正常.下面要驗證jobtracker和taskTracker是否正常,准備運行hadoop example中的wordcount程序。
cd /usr/local/hadoop/hadoop/hadoop-0.20.203.0
hadoop fs -put conf input
將conf目錄拷貝到hdfs
hadoop jar hadoop-examples-0.20.203.0.jar wordcount input output
得到大概這樣的結果就對了, 即map增長到100%, reduce也增長到100%,
12/03/05 07:52:09 INFO input.FileInputFormat: Total input paths to process : 15
12/03/05 07:52:09 INFO mapred.JobClient: Running job: job_201203050735_0001
12/03/05 07:52:10 INFO mapred.JobClient: map 0% reduce 0%
12/03/05 07:52:24 INFO mapred.JobClient: map 13% reduce 0%
12/03/05 07:52:25 INFO mapred.JobClient: map 26% reduce 0%
12/03/05 07:52:30 INFO mapred.JobClient: map 40% reduce 0%
12/03/05 07:52:31 INFO mapred.JobClient: map 53% reduce 0%
12/03/05 07:52:36 INFO mapred.JobClient: map 66% reduce 13%
12/03/05 07:52:37 INFO mapred.JobClient: map 80% reduce 13%
12/03/05 07:52:39 INFO mapred.JobClient: map 80% reduce 17%
12/03/05 07:52:42 INFO mapred.JobClient: map 100% reduce 17%
12/03/05 07:52:51 INFO mapred.JobClient: map 100% reduce 100%
12/03/05 07:52:56 INFO mapred.JobClient: Job complete: job_201203050735_0001
12/03/05 07:52:56 INFO mapred.JobClient: Counters: 26
12/03/05 07:52:56 INFO mapred.JobClient: Job Counters
12/03/05 07:52:56 INFO mapred.JobClient: Launched reduce tasks=1
12/03/05 07:52:56 INFO mapred.JobClient: SLOTS_MILLIS_MAPS=68532
12/03/05 07:52:56 INFO mapred.JobClient: Total time spent by all reduces waiting after reserving slots (ms)=0
12/03/05 07:52:56 INFO mapred.JobClient: Total time spent by all maps waiting after reserving slots (ms)=0
12/03/05 07:52:56 INFO mapred.JobClient: Rack-local map tasks=7
12/03/05 07:52:56 INFO mapred.JobClient: Launched map tasks=15
12/03/05 07:52:56 INFO mapred.JobClient: Data-local map tasks=8
12/03/05 07:52:56 INFO mapred.JobClient: SLOTS_MILLIS_REDUCES=25151
12/03/05 07:52:56 INFO mapred.JobClient: File Output Format Counters
12/03/05 07:52:56 INFO mapred.JobClient: Bytes Written=14249
12/03/05 07:52:56 INFO mapred.JobClient: FileSystemCounters
12/03/05 07:52:56 INFO mapred.JobClient: FILE_BYTES_READ=21493
12/03/05 07:52:56 INFO mapred.JobClient: HDFS_BYTES_READ=27707
12/03/05 07:52:56 INFO mapred.JobClient: FILE_BYTES_WRITTEN=384596
12/03/05 07:52:56 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=14249
12/03/05 07:52:56 INFO mapred.JobClient: File Input Format Counters
12/03/05 07:52:56 INFO mapred.JobClient: Bytes Read=25869
12/03/05 07:52:56 INFO mapred.JobClient: Map-Reduce Framework
12/03/05 07:52:56 INFO mapred.JobClient: Reduce input groups=754
12/03/05 07:52:56 INFO mapred.JobClient: Map output materialized bytes=21577
12/03/05 07:52:56 INFO mapred.JobClient: Combine output records=1047
12/03/05 07:52:56 INFO mapred.JobClient: Map input records=734
12/03/05 07:52:56 INFO mapred.JobClient: Reduce shuffle bytes=21577
12/03/05 07:52:56 INFO mapred.JobClient: Reduce output records=754
12/03/05 07:52:56 INFO mapred.JobClient: Spilled Records=2094
12/03/05 07:52:56 INFO mapred.JobClient: Map output bytes=34601
12/03/05 07:52:56 INFO mapred.JobClient: Combine input records=2526
12/03/05 07:52:56 INFO mapred.JobClient: Map output records=2526
12/03/05 07:52:56 INFO mapred.JobClient: SPLIT_RAW_BYTES=1838
12/03/05 07:52:56 INFO mapred.JobClient: Reduce input records=1047
最后再hadoop fs -get output /home/hadoop 將output目錄取到本地來查看結果。
1.8 單機的停止
stop-all.sh
1.9 遇到的問題
Too many fetch-failures問題
運行wordcount示例時,reduce任務無法達到100%總是卡住在0%.
分析log里面有Too many fetch-failures信息,上網查了一下,有人說要將IP地址還有hostname都要寫到/etc/hosts里面,才行。
照着做了一下,發現還是不行。正頭大之際,經過不懈努力,終於找到症結:原來ubuntu linux給指定的一個主機名是192,這個主機名192已經成了hdfs的標准配置了。即使本人后來將主機名改成有意義的名字,這個順序已經不對了,因為發現logs目錄下的每個任務的配置文件xml文件還是用的老主機名,新改的主機名根本就沒有用上,而這個老主機名存在哪里呢,后來發現這個主機名存在hdfs文件系統的那些文件里。所以需要從1.4步開始到1.8步重新做一遍。如此重新做了一遍以后,運行wordcount示例程序就成功了。
本人回答過qq群里同仁的問題:
運行hadoop namenode -format報main函數找不到
回答:CLASSPATH設置不對。
單機安裝配置就講這么多。本文就說到這里了。本文之后的文章將說到如何將新的hadoop節點加入,讓多個節點成為一個完全分步式的集群。
如果覺得本文有幫助,請幫忙點推薦。謝謝
