完全分布模式hadoop集群安裝配置之一安裝第一個節點


  本系列文章講述搭建完全分布模式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節點加入,讓多個節點成為一個完全分步式的集群。

如果覺得本文有幫助,請幫忙點推薦。謝謝


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM