剛接觸Hadoop三天,今天終於成功用三臺機跑起測試,記錄一下。html
1、準備(全部節點都須要作):java
系統:Ubuntu12.04node
java版本:JDK1.7(安裝步驟看上一篇文章)ubuntu
SSH(ubuntu自帶)服務器
確保三臺機在同一個ip段,最好設置爲靜態IP,重啓後就不用糾結IP變化了ssh
機器分配:一臺master,兩臺slavejvm
個人主機信息是(hosts文件添加以下信息):分佈式
192.168.88.123 h1ide
192.168.88.124 h2oop
192.168.88.125 h3
其中第一項是內網IP ,第二項是主機名
各節點做用:
h1:NameNode、JobTracker
h2:DataNode、TaskTracker
h3:DataNode、TaskTracker
安裝SSH:
sudo apt-get install ssh
測試:ssh localhost
輸入當前用戶的密碼回車 沒異常說明安裝成功
開啓SSHD服務:
安裝:sudo apt-get install openssh-server
確認是否啓動:
ps -e | grep ssh
找到到sshd,有即啓動了。
建立Hadoop用戶(名爲grid)
adduser grid
信息隨便填,之後運行操做Hadoop都是用這個用戶(注意看清命令行別用了其餘用戶)
2、配置Hadoop
1.無密碼登錄
在Hadoop啓動之後,Namenode是經過SSH(Secure Shell)來啓動和中止各個datanode上的各類守護進程的,這就需要在節點之間執行指令的時候是不需要輸入密碼的形式,故咱們需要配置SSH運用無密碼公鑰認證的形式。
首先設置namenode的ssh爲無需密碼的、自動登錄。
換切到grid用戶
su grid
cd
ssh-keygen -t rsa
完成後會在grid目錄產生隱藏文件.ssh,經過ls查看,而後
cp id_rsa.pub authorized_keys
測試
ssh h1
第一次會提示確認繼續鏈接,打yes,這會把該服務器添加到你的已知主機列表中
一樣在h2,h3上作以上操做
最後,如何使各個節點相互訪問不須要密碼,將三個節點的authorized_keys文件裏面的內容合成一個文件而後替換掉原來的,替換完畢後能夠用
ssh XX(XX爲主機名)
相互測試是否鏈接成功。
2.配置Hadoop文件:
在hadoop/conf目錄下修改文件有hadoop-env.sh,core-site.xml,hdfs-site.xml,mapred-site.xml,master,slaves
hadoop-env.sh
修改JAVA_HOME路徑
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_45
記得去掉前面的#
core-site.xml:
<?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://h1:49000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/grid/var</value> </property> </configuration>
1)fs.default.name是NameNode的URI。hdfs://主機名:端口/
2)hadoop.tmp.dir :Hadoop的默認臨時路徑,這個最好配置,若是在新增節點或者其餘狀況下莫名其妙的DataNode啓動不了,就刪除此文件中的tmp目錄便可。不過若是刪除了NameNode機器的此目錄,那麼就須要從新執行NameNode格式化的命令。
hdfs-site.xml:
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>dfs.name.dir</name> <value>/home/grid/name1,/home/grid/name2</value> <description> </description> </property> <property> <name>dfs.data.dir</name> <value>/home/grid/data1,/home/grid/data2</value> <description> </description> </property> <property> <name>dfs.replication</name> <value>2</value> </property> </configuration>
1) dfs.name.dir是NameNode持久存儲名字空間及事務日誌的本地文件系統路徑。 當這個值是一個逗號分割的目錄列表時,nametable數據將會被複制到全部目錄中作冗餘備份。
2) dfs.data.dir是DataNode存放塊數據的本地文件系統路徑,逗號分割的列表。 當這個值是逗號分割的目錄列表時,數據將被存儲在全部目錄下,一般分佈在不一樣設備上。
3)dfs.replication是數據須要備份的數量,默認是3,若是此數大於集羣的機器數會出錯。
注意:此處的name一、name二、data一、data2目錄不能預先建立,hadoop格式化時會自動建立,若是預先建立反而會有問題。
mapred-site.xml
<?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>h1:49001</value> </property> <property> <name>mapred.local.dir</name> <value>/home/grid/var</value> </property> </configuration>
1)mapred.job.tracker是JobTracker的主機(或者IP)和端口。主機:端口。
配置masters和slaves主從結點
master
h1
slaves
h2 h3
配置完畢,把配置好的hadoop文件夾拷貝到其餘集羣的機器上,並保證其餘機器的JDK 安裝路徑一致(若是不一致就另外再修改配置文件conf/hadoop-env.sh憋)
scp -r /home/grid/hadoop-0.20.2 grid@h2:/home/grid
scp -r /home/grid/hadoop-0.20.2 grid@h2:/home/grid
3、啓動Hadoop
一、先格式化一個新的分佈式文件系統
cd
bin/hadoop namenode -format
成功後系統輸出:
INFO common.Storage: Storagedirectory /opt/hadoop/hadoopfs/name2 has been successfully formatted.
這一行,看到successfully單詞木有,格式化成功。
執行完後能夠到master機器上看到/home/hadoop//name1和/home/hadoop//name2兩個目錄。
2.啓動全部節點
在主節點master上面啓動hadoop,主節點會啓動全部從節點的hadoop。
cd
bin/start-all.sh(同時啓動HDFS和Map/Reduce)
輸出:
grid@h1:~/hadoop-0.20.2$ bin/start-all.sh
starting namenode, logging to /home/grid/hadoop-0.20.2/bin/../logs/hadoop-grid-namenode-h1.out
h2: starting datanode, logging to /home/grid/hadoop-0.20.2/bin/../logs/hadoop-grid-datanode-h2.out
h3: starting datanode, logging to /home/grid/hadoop-0.20.2/bin/../logs/hadoop-grid-datanode-h3.out
h1: starting secondarynamenode, logging to /home/grid/hadoop-0.20.2/bin/../logs/hadoop-grid-secondarynamenode-h1.out
starting jobtracker, logging to /home/grid/hadoop-0.20.2/bin/../logs/hadoop-grid-jobtracker-h1.out
h2: starting tasktracker, logging to /home/grid/hadoop-0.20.2/bin/../logs/hadoop-grid-tasktracker-h2.out
h3: starting tasktracker, logging to /home/grid/hadoop-0.20.2/bin/../logs/hadoop-grid-tasktracker-h3.out
沒有出現什麼Error或Warming之類的就表示運行成功了
運行成功後看看程序是否正常
/usr/lib/jvm/jdk1.7.0_45/bin//jps
能夠看到在h1結點上有進程
2928 NameNode
3319 Jps
3105 SecondaryNameNode
3184 JobTracker
很熟悉的字眼我就很少說了,在slaves結點上也檢測下是否正常,會有
TaskTracker,DataNode
若沒缺乏以上進程即配置有問題。
4、測試
建一個目錄,裏面建兩個txt文件,用hadoop項目現有的hadoop-0.20.2-examples.jar例子測試txt裏面單詞的出現次數。
cd
mkdir input
cd input
echo "hello world" > test1.txt
echo "hello hadoop" > test2.txt
建完文件後,將文件放到HDFS系統的in目錄上
cd ../hadoop-0.20.2
bin/hadoop dfs -put ../input in
測試了,運行
bin/hadoop jar hadoop-0.20.2-examples.jar wordcount in out
會出現一系列的運行信息
grid@h1:~/hadoop-0.20.2$ bin/hadoop jar hadoop-0.20.2-examples.jar wordcount in out
13/12/26 14:04:05 INFO input.FileInputFormat: Total input paths to process : 2
13/12/26 14:04:06 INFO mapred.JobClient: Running job: job_201312261337_0006
13/12/26 14:04:07 INFO mapred.JobClient: map 0% reduce 0%
13/12/26 14:04:14 INFO mapred.JobClient: map 50% reduce 0%
13/12/26 14:04:15 INFO mapred.JobClient: map 100% reduce 0%
13/12/26 14:04:23 INFO mapred.JobClient: map 100% reduce 100%
13/12/26 14:04:25 INFO mapred.JobClient: Job complete: job_201312261337_0006
13/12/26 14:04:25 INFO mapred.JobClient: Counters: 17
13/12/26 14:04:25 INFO mapred.JobClient: Job Counters
13/12/26 14:04:25 INFO mapred.JobClient: Launched reduce tasks=1
13/12/26 14:04:25 INFO mapred.JobClient: Launched map tasks=2
13/12/26 14:04:25 INFO mapred.JobClient: Data-local map tasks=2
13/12/26 14:04:25 INFO mapred.JobClient: FileSystemCounters
13/12/26 14:04:25 INFO mapred.JobClient: FILE_BYTES_READ=55
13/12/26 14:04:25 INFO mapred.JobClient: HDFS_BYTES_READ=25
13/12/26 14:04:25 INFO mapred.JobClient: FILE_BYTES_WRITTEN=180
13/12/26 14:04:25 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=25
13/12/26 14:04:25 INFO mapred.JobClient: Map-Reduce Framework
13/12/26 14:04:25 INFO mapred.JobClient: Reduce input groups=3
13/12/26 14:04:25 INFO mapred.JobClient: Combine output records=4
13/12/26 14:04:25 INFO mapred.JobClient: Map input records=2
13/12/26 14:04:25 INFO mapred.JobClient: Reduce shuffle bytes=61
13/12/26 14:04:25 INFO mapred.JobClient: Reduce output records=3
13/12/26 14:04:25 INFO mapred.JobClient: Spilled Records=8
13/12/26 14:04:25 INFO mapred.JobClient: Map output bytes=41
13/12/26 14:04:25 INFO mapred.JobClient: Combine input records=4
13/12/26 14:04:25 INFO mapred.JobClient: Map output records=4
13/12/26 14:04:25 INFO mapred.JobClient: Reduce input records=4
沒有什麼Error或Warming之類的字眼特別是有
map 100% reduce 100%
表示成功運行了,結果可一輸入
bin/hadoop dfs -cat out/*
看到結果
hadoop 1
hello 2
world 1
over。。。。。。