Hadoop2.2.0多節點分散式安裝及測試

吳峻申發表於2013-12-02

眾所周知,hadoop在10月底release了最新版2.2。很多國內的技術同仁都馬上在網路上推出了自己對新版hadoop的配置心得。這其中主要分為兩類:

1.單節點配置

這個太簡單了,簡單到只要懂點英語,照著網上說的做就ok了。我這裡不談這個,有興趣的童鞋可以自己去問度娘和谷哥~

2.多節點配置

這個就是我要重點說明的,老實說網路上說的的確是多節點,但不是真正的分散式部署~ 我們為什麼要用hadoop?因為hadoop是一個分散式系統基礎架構,我們可以在不瞭解分散式底層細節的情況下,開發分散式程式。充分利用叢集的威力進行高速運算和儲存。 如果只是多節點,但是程式還在一個節點執行,其它節點沒有參與程式執行活動。 那和你在網咖裡,自己一個人看片子和其他人無交集有什麼區別? 所以網上提供的都是多節點偽分散式的配置~

接下來我會貢獻出自己這幾天弄的一些心得,或許有人看了開頭覺得我寫的和網上那些差不多,但是真正的區別我會在之後列出來,就看誰有耐心看完我寫的東西啦~霍霍~

準備

我用的linux系統是ubuntu 12.04 LTS server版(就是沒有桌面顯示的版本)。 虛擬機器用的是VMWare Workstation10,ssh客戶端是開源的putty,還有ftp客戶端軟體是cuteFTP(雖然可以在linux系統裡用vim對檔案進行編輯修改,但我覺得有客戶端直接在windows系統裡修改檔案比較方便和高效)。 tomcat版本是6.0.29,jdk版本是1.7.45。虛擬機器裡ubuntu的網路設定我用的是UAT模式,也就是說和外部window系統的網路配置是共享的,除了IP地址不一樣,其他都雷同。

安裝tomcat和jdk什麼我就不用說了。還有初始的解析度是600x800,需要重調我也不說了。至於安裝vsftpd和openssh,我更加不說了。度娘和谷哥都知道。

這裡就列我弄的兩個ubuntu系統。hadoop裡把主節點系統叫為master,從節點系統叫為slave。master只能有一個,slave可以有許多個。就如一個老闆可以有很多員工為他打工一樣。(當然在很多情況下,還會有個做備份的master,防止master出問題時候,有個替補直接頂上)

為了行文方便,後面我就直接用master和slave稱呼這兩個。(網上都喜歡用三節點做例子,一個master兩個slave,我簡化了一下,就一個master和一個slave,反正都是以此類推的東西,搞簡單點)

我的系統原始資訊:

hostname IP address
master hadoop 192.168.72.130
slave hadoop1 192.168.72.128

hostname是自己改的,IP地址是你安裝完你的ubuntu後,電腦在UAT模式下自動生成的IP地址。請根據你自己情況記錄這些資訊。還有hostname如何永久地改成hadoop和hadoop1,請問度娘和谷哥。

每個ubuntu裡分別加入專為hadoop使用的帳號
命令:

addgroup hadoop
adduser –ingroup hadoop wujunshen

這個wujunshen是我在用VMWare安裝ubuntu時候,讓我自己設定的帳號名字,大家可以自行設定。但是hadoop這個使用者組名最好不要改。

有人會問 ubuntu裡非root賬戶登入後,輸入命令開頭不都要打sudo麼?這個其實也可以設定,再次提醒請問度娘和谷哥。這裡哥給個當年自己記錄的博文連結: http://darkranger.iteye.com/admin/blogs/768608

注意:兩個ubuntu的hadoop帳號名要一樣,不一樣就算你配置好了,測試時候也不成功的。我看了一下hadoop的程式碼,它好像是在hadoop程式碼裡寫死了讀取帳號名的值。(shell不太會,只看了個大概) 有人說要在系統裡設定%HADOOP_HOME%為你安裝hadoop的路徑,就可以帳號名不一樣了。 我沒試驗過,因為我覺得測試這個有點無聊了,或許《生活大爆炸》裡Sheldon會這麼做。:)

建立兩個系統ssh通訊互相信任關係

要在兩個系統上每一個進行以下操作。(如果slave有很多個,這樣做是很浪費時間的,一般都要用個shell自動化指令碼來建立信任關係。這裡只是示例,麻煩各位手打或copy了。)

進入wujunshen帳號,輸入命令

ssh-keygen -t rsa -P ""
cat .ssh/id_rsa.pub >>.ssh/authorized_keys (出現兩個問題,第一個問題回車就行,第二個輸入y回車,千萬不要直接回車,否則不會生成key)  

注意:如果出現錯誤:-bash: .ssh/authorized_keys: No such file or directory 這是由於新建好的使用者帳號,比如我這裡是wujunshen這個帳號,預設沒有.ssh目錄,需要自己建立。

mkdir -p ~/.ssh

接下來還有一步,我用cuteFTP做的,覺得自己牛逼的可以用linux的拷貝貼上命令搞。

在每個ubuntu下找到剛才生成的authorized_keys檔案,我這裡路徑是: /home/wujunshen/.ssh/authorized_keys

修改該檔案,讓此檔案包含生成的rsa字串(有關RSA加密演算法的由來,你還是可以去問度娘和谷哥,那是個傳奇的故事)和兩個ubuntu的hostname,比如我這裡是:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDEBNUjKbZQOQsc6iNawm5VxXk+Kx5MXS1A6ZX/xtAfAI3jurVTgNHz6T2exf/dHP3aoaK49vl6EeMg4hZ7qwxldeERMXNBu5m0y/JyRupX9RfHRjJyqSXRdJ1WjE2ySPtXdLNPjKDvzjf61dSP/iMXeemlZfZV2VNqJiLTlpG3OvjraICUXCXMMB4h72Qm59iIHZ4iRI2v5VMmp+CeGEqHba0O8UUkpSpqC8vZCFJKL+IfCFups9OGrKIT854/Xc+vPSd89jA3RLubJThE/F/8QczqSBHXYrLeUMir3lFEPqLe7U4jk5n83/3fAsagaUyXBCWGm7LanLgXsqMfKBxD wujunshen@hadoop1
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC+umV0w7qcQyHJzfqRc+mHE+eCWw8Ns/uU05CF4fEJnGkys+0Itwsh+edwt8K4oHZ8rK0THO1ip2oNXHzVJ8aJ7rpeI19N0BubCahhGbVNqzgyGgvbnz3+xD/La47YNBzjHF4AxTu+Dj51vOp1yRaiTwhu93o9PP18x2Ai7aNQEap7pGpBwogbfSWDBvZNq9PJYinjzhnVqJ7bctJe+1ufme7bX+vyu1hrdtfpwXgW5GiXQ6uvYH6ExiTSWlLFMyDgD63APm1P2Hs1hlR1gNE3SC4q34mfExhoxY3JJgfbP0x2rt8PfdWk5Lzxtaylj85bmZi/9xDvXdoqjtSv4Mxb wujunshen@hadoop

保證每個ubuntu系統的authorized_keys檔案都包含wujunshen@hadoop1和wujunshen@hadoop以及它們的rsa字串.

然後在其中一個ubuntu上進行測試,比如我這裡在master裡輸入

ssh hadoop1   

去訪問slave,這樣就不需要輸入密碼就能訪問hadoop1,然後我輸入

ssh hadoop  

回到master。

結果如下:

wujunshen@hadoop:~$ ssh hadoop1
Welcome to Ubuntu 12.04.3 LTS (GNU/Linux 3.8.0-29-generic i686)
* Documentation:  https://help.ubuntu.com/
Last login: Wed Nov 27 19:29:55 2013 from hadoop
wujunshen@hadoop1:~$ ssh hadoop
Welcome to Ubuntu 12.04.3 LTS (GNU/Linux 3.8.0-29-generic i686)
* Documentation:  https://help.ubuntu.com/
 Last login: Wed Nov 27 19:30:03 2013 from hadoop1
wujunshen@hadoop:~$

截圖:

enter image description here

注意:如果ssh hadoop或ssh hadoop1 出現錯誤: Host key verification failed

解決方法:到 /home/wujunshen/.ssh目錄下找到known_hosts檔案,刪除known_hosts檔案。命令:

 rm known_hosts  

安裝

去官網下載hadoop-2.2.0.tar.gz

然後在兩個ubuntu裡進行以下操作。

解壓壓縮包在/home/wujunshen目錄下

命令:

tar zxf hadoop-2.2.0.tar.gz  

解開之後是個hadoop-2.2.0資料夾,改名為hadoop

命令:

mv hadoop-2.2.0 hadoop  

安裝結束。(安裝很簡單,但你要想用起來,接下來是重頭戲)

配置

以下操作,master和slave都是一樣的。

在/home/wujunshen/hadoop/etc/hadoop下找 hadoop-env.sh,修改此檔案 找到export JAVA_HOME這一列,後面改成自己的jdk安裝目錄,比如我這裡是/usr/lib/jdk1.7.0_45

改成

export JAVA_HOME=/usr/lib/jdk1.7.0_45  

在同一路徑下找 core-site.xml,修改它在 < configuration >中新增:

<property>
 <name>hadoop.tmp.dir</name>
 <value>/home/wujunshen/hadoop/tmp/hadoop-${user.name}</value>
 <description>A base for other temporarydirectories.</description>
 </property>
 <property>
 <name>fs.default.name</name>
 <value>hdfs://192.168.72.130:8010</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>  

注意

  1. /home/wujunshen/hadoop下預設是沒有tmp資料夾的,要用命令: mkdir /home/wujunshen/hadoop/tmp建立
  2. hdfs://192.168.72.130:8010 裡的IP地址就是master 的IP地址

同一路徑下修改 mapred-site.xml

因為預設是沒有這個檔案的,要用模板檔案造一個,命令為:

mv /home/wujunshen/hadoop/etc/hadoop/mapred-site.xml.template /home/hduser/hadoop/etc/hadoop/mapred-site.xml  

在 < configuration >中新增:

<property>
<name>mapred.job.tracker</name>
<value>192.168.72.130:54311</value>
<description>The host and port that the MapReduce job tracker runs
 at.  If "local", thenjobs are run in-process as a single map
 and reduce task.
 </description>
 </property>

<property>
<name>mapred.map.tasks</name>
<value>10</value>
<description>As a rule of thumb, use 10x the number of slaves(i.e., number of tasktrackers).          
</description>
</property>

<property>
<name>mapred.reduce.tasks</name>
<value>2</value>
<description>As a rule of thumb, use 2x the number of slaveprocessors (i.e., number of tasktrackers).
</description>
</property>

注意:< value >192.168.72.130:54311< /value >裡的IP地址就是master 的IP地址

同一路徑下修改 hdfs-site.xml, 在 < configuration >中新增:

<property>
<name>dfs.replication</name>
<value>1</value>
<description>Default block replication.
 Theactual number of replications can be specified when the file is created.
 Thedefault is used if replication is not specified in create time.
 </description>
</property> 

注意:< value >1< /value >裡的數字1表明的是dfs檔案備份個數, 如果你只有3個slave,但是你卻指定值為4,那麼這是不會生效的,因為每個salve上只能存放一個備份檔案。 如果你設定了100個slave,那麼這個就寫100。 我這裡slave就1個,就寫了1。 網上那些因為都是三節點,一個master,兩個slave,所以都寫2,但網上很少有人會說要根據實際slave的個數修改。

同一路徑下修改slaves檔案 增加所有slaves的hostname。比如我這裡slave就一個,hostname是hadoop1,所以只有一個hadoop1,該檔案內容只為

hadoop1  

執行

所有操作只需要在master執行即可。系統會自動登入到slave上。

初次執行Hadoop的時候需要初始化Hadoop檔案系統 ,在master上輸入命令

cd /home/wujunshen/hadoop/bin
./hdfs namenode -format  

執行成功,你會在日誌中(倒數幾行)找到如下成功的提示資訊:

common.Storage: Storage directory /home/wujunshen/hadoop/tmp/hadoop-wujunshen/dfs/name has been successfully formatted.  

再去啟動hadoop,命令:

cd home/wujunshen/hadoop/sbin/
./start-dfs.sh
./start-yarn.sh  

注意:你也可以直接執行./start-all.sh,不用分開啟動dfs和yarn.第一次執行start-all會出現一個問題,輸入yes就行了。

檢視執行結果 執行你的jdk執行目錄下的jps,比如我這裡是 /usr/lib/jdk1.7.0_45/bin/

輸入命令:

/usr/lib/jdk1.7.0_45/bin/jps  

在hadoop上結果為:

6419 ResourceManager
6659 Jps
6106 NameNode
6277 SecondaryNameNode  

在hadoop1結果為:

3930 SecondaryNameNode
4222 Jps
3817 DataNode
3378 NodeManager  

或執行命令

cd /home/wujunshen/hadoop/bin
./hdfs dfsadmin -report  

結果:

Configured Capacity: 51653570560 (48.11 GB)
Present Capacity: 46055575552 (42.89 GB)
DFS Remaining: 46055550976 (42.89 GB)
DFS Used: 24576 (24 KB)
DFS Used%: 0.00%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0

-------------------------------------------------
Datanodes available: 1 (1 total, 0 dead)

Live datanodes:
Name: 192.168.72.128:50010 (hadoop1)
Hostname: hadoop1
Decommission Status : Normal
Configured Capacity: 51653570560 (48.11 GB)
DFS Used: 24576 (24 KB)
Non DFS Used: 5597995008 (5.21 GB)
DFS Remaining: 46055550976 (42.89 GB)
DFS Used%: 0.00%
DFS Remaining%: 89.16%
Last contact: Wed Nov 27 23:56:32 PST 2013

截圖:

enter image description here

注意:有時候會發現hadoop1上的datanode沒有出現,這個時候以我的體會,最好是把/home/wujunshen/hadoop下的tmp資料夾刪除,然後重新建,重新初始化hadoop檔案系統,重啟hadoop,然後執行兩種檢視方式再看看

測試

兩種測試方法,實際是執行了兩個示例程式,一個是wordcount,另外一個是randomwriter

1.執行下列命令:

cd /home/wujunshen
wget http://www.gutenberg.org/cache/epub/20417/pg20417.txt
cd hadoop
bin/hdfs dfs -mkdir /tmp
bin/hdfs dfs -copyFromLocal /home/wujunshen/pg20417.txt /tmp
bin/hdfs dfs -ls /tmp
bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount /tmp/ /tmp-output  

2.執行下列命令:

cd  /home/wujunshen/hadoop
bin/hdfs dfs -mkdir /input
bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar randomwriter input  

總結

如果你能看到這裡,而且按照我之前說的已經執行成功了。那麼恭喜你,你實現了hadoop多節點偽分散式的配置。對的,你沒看錯!!!就是偽分散式~ 可能有人不服氣會說:怎麼到這裡就是偽分散式了呢?不是都OK的麼?那麼我請你仔細看看你測試中選擇的兩種示例程式啟動的job,如圖是執行第二個randomwriter 程式的job:
enter image description here

看到紅框了伐?全是Local!!!也就是說不管你執行哪個示例程式,啟動的job都只是在master這個節點本地執行的job。哪裡有讓slave節點參與了?

再說,看看wordcount這個單詞就知道是個計算單詞的示例程式,如果只有master一個節點計算,那麼這能算分散式多節點參與計算麼? 所以各位朋友,請接著耐心地看下去,看我如何施展魔法讓hadoop真正的進行分散式計算!!!

真.配置

之前配置裡所說的那些檔案修改還是要的。這裡我們再對其中一些檔案進行修改。

在/home/wujunshen/hadoop/etc/hadoop 下找到 yarn-env.sh,修改它

找到設定JAVA_HOME的那一列 改成:

export JAVA_HOME=/usr/lib/jdk1.7.0_45  

在/home/wujunshen/hadoop/etc/hadoop 下修改mapred-site.xml 在 < configuration >中新增(原先的配置還留著):

<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>192.168.72.130:10020</value>
</property>
<property>
<value>192.168.72.130:19888</value>
</property>  

在/home/wujunshen/hadoop/etc/hadoop 下修改yarn-site.xml 在 < configuration >中新增:

<property>
 <name>yarn.resourcemanager.address</name>
 <value>hadoop:8032</value>
 </property>

<property>
 <description>The address of the scheduler interface.</description>
 <name>yarn.resourcemanager.scheduler.address</name>
 <value>hadoop:8030</value>
</property>
<property>
 <description>The address of the RM web application.</description>
 <name>yarn.resourcemanager.webapp.address</name>
 <value>hadoop:8088</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>hadoop:8031</value>
</property>
<property>
<description>The address of the RM admin interface.</description>
<name>yarn.resourcemanager.admin.address</name>
<value>hadoop:8033</value>
</property>
<property>
<description>The address of the RM admin interface.</description>
<name>yarn.nodemanager.address</name>
<value>hadoop:10000</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>  

注意:這裡很多value都是hadoop打頭的,我一開始修改這些檔案都是填寫master的IP地址,我後來試驗了一下,其實用master的hostname,也就是hadoop也可以的。再然後,我發現是之前修改了/etc路徑下的hosts檔案,在其中加入了

192.168.72.130 hadoop
192.168.72.128 hadoop1

後,使得Master與所有Slave機器之間不僅可以通過IP進行通訊,而且還可以通過主機名進行通訊導致的。

好了重複測試裡那兩個示例程式,這裡我執行了randomwriter程式,因為之前已經建立過input資料夾,現在執行命令會報錯說input已存在,很簡單,後面加個1就行,命令變成

cd  /home/wujunshen/hadoop
bin/hdfs dfs -mkdir /input1
bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar randomwriter input1

重複執行這些命令的話,就把後面改成2,3,4就好了。反正是例子,隨意一點,不用像工作中要取個很正式的名字。

結果如下:

13/11/28 19:37:23 INFO mapreduce.Job: Running job: job_1385696103815_0001
13/11/28 19:37:43 INFO mapreduce.Job: Job job_1385696103815_0001 running in uber mode : false
13/11/28 19:37:43 INFO mapreduce.Job:  map 0% reduce 0%
13/11/28 19:51:05 INFO mapreduce.Job:  map 10% reduce 0%
13/11/28 19:51:11 INFO mapreduce.Job:  map 20% reduce 0%
13/11/28 19:51:13 INFO mapreduce.Job:  map 30% reduce 0%
13/11/28 19:51:19 INFO mapreduce.Job:  map 40% reduce 0%
13/11/28 19:51:21 INFO mapreduce.Job:  map 50% reduce 0%
13/11/28 19:51:40 INFO mapreduce.Job:  map 60% reduce 0%
13/11/28 20:03:37 INFO mapreduce.Job:  map 70% reduce 0%
13/11/28 20:03:48 INFO mapreduce.Job:  map 80% reduce 0%
13/11/28 20:03:49 INFO mapreduce.Job:  map 90% reduce 0%
13/11/28 20:03:51 INFO mapreduce.Job:  map 100% reduce 0%
13/11/28 20:03:53 INFO mapreduce.Job: Job job_1385696103815_0001 completed successfully
13/11/28 20:03:53 INFO mapreduce.Job: Counters: 30
    File System Counters
            FILE: Number of bytes read=0
            FILE: Number of bytes written=789520
            FILE: Number of read operations=0
            FILE: Number of large read operations=0
            FILE: Number of write operations=0
            HDFS: Number of bytes read=1270
            HDFS: Number of bytes written=10772863128
            HDFS: Number of read operations=40
            HDFS: Number of large read operations=0
            HDFS: Number of write operations=20
    Job Counters
            Killed map tasks=5
            Launched map tasks=15
            Other local map tasks=15
            Total time spent by all maps in occupied slots (ms)=9331745
            Total time spent by all reduces in occupied slots (ms)=0
    Map-Reduce Framework
            Map input records=10
            Map output records=1021605
            Input split bytes=1270
            Spilled Records=0
            Failed Shuffles=0
            Merged Map outputs=0
            GC time elapsed (ms)=641170
            CPU time spent (ms)=806440
            Physical memory (bytes) snapshot=577269760
            Virtual memory (bytes) snapshot=3614044160
            Total committed heap usage (bytes)=232574976
    org.apache.hadoop.examples.RandomWriter$Counters
            BYTES_WRITTEN=10737514428
            RECORDS_WRITTEN=1021605
    File Input Format Counters
            Bytes Read=0
    File Output Format Counters
            Bytes Written=10772863128
Job ended: Thu Nov 28 20:03:53 PST 2013
The job took 1594 seconds.

可以看到這個時候Job名字打頭已經不是local了,而是job了。而且可以登入http://192.168.72.130:8088檢視執行的job狀態

如圖:
enter image description here

上圖還是這個job處於running狀態時的資訊。

完成時資訊如下圖:
enter image description here

現在我們再執行那個wordcount程式,這裡和randomwriter類似。

命令是

cd  /home/wujunshen/hadoop
bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount /tmp/ /tmp-output100(為啥是tmp-output100,之前在說randomwriter示例程式時候已經說過)

結果:

13/11/29 00:01:40 INFO client.RMProxy: Connecting to ResourceManager at hadoop/192.168.72.130:8032
13/11/29 00:01:41 INFO input.FileInputFormat: Total input paths to process : 1
13/11/29 00:01:41 INFO mapreduce.JobSubmitter: number of splits:1
13/11/29 00:01:41 INFO Configuration.deprecation: user.name is deprecated. Instead, use mapreduce.job.user.name
13/11/29 00:01:41 INFO Configuration.deprecation: mapred.jar is deprecated. Instead, use mapreduce.job.jar
13/11/29 00:01:41 INFO Configuration.deprecation: mapred.output.value.class is deprecated. Instead, use mapreduce.job.output.value.class
13/11/29 00:01:41 INFO Configuration.deprecation: mapreduce.combine.class is deprecated. Instead, use mapreduce.job.combine.class
13/11/29 00:01:41 INFO Configuration.deprecation: mapreduce.map.class is deprecated. Instead, use mapreduce.job.map.class
13/11/29 00:01:41 INFO Configuration.deprecation: mapred.job.name is deprecated. Instead, use mapreduce.job.name
13/11/29 00:01:41 INFO Configuration.deprecation: mapreduce.reduce.class is deprecated. Instead, use mapreduce.job.reduce.class
13/11/29 00:01:41 INFO Configuration.deprecation: mapred.input.dir is deprecated. Instead, use mapreduce.input.fileinputformat.inputdir
13/11/29 00:01:41 INFO Configuration.deprecation: mapred.output.dir is deprecated. Instead, use mapreduce.output.fileoutputformat.outputdir
13/11/29 00:01:41 INFO Configuration.deprecation: mapred.map.tasks is deprecated. Instead, use mapreduce.job.maps
13/11/29 00:01:41 INFO Configuration.deprecation: mapred.output.key.class is deprecated. Instead, use mapreduce.job.output.key.class
13/11/29 00:01:41 INFO Configuration.deprecation: mapred.working.dir is deprecated. Instead, use mapreduce.job.working.dir
13/11/29 00:01:42 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1385696103815_0009
13/11/29 00:01:42 INFO impl.YarnClientImpl: Submitted application application_1385696103815_0009 to ResourceManager at hadoop/192.168.72.130:8032
13/11/29 00:01:42 INFO mapreduce.Job: The url to track the job: http://hadoop:8088/proxy/application_1385696103815_0009/
13/11/29 00:01:42 INFO mapreduce.Job: Running job: job_1385696103815_0009
13/11/29 00:01:53 INFO mapreduce.Job: Job job_1385696103815_0009 running in uber mode : false
13/11/29 00:01:53 INFO mapreduce.Job:  map 0% reduce 0%
13/11/29 00:02:03 INFO mapreduce.Job:  map 100% reduce 0%
13/11/29 00:02:18 INFO mapreduce.Job:  map 100% reduce 50%
13/11/29 00:02:19 INFO mapreduce.Job:  map 100% reduce 100%
13/11/29 00:02:20 INFO mapreduce.Job: Job job_1385696103815_0009 completed successfully
13/11/29 00:02:20 INFO mapreduce.Job: Counters: 43
    File System Counters
            FILE: Number of bytes read=267032
            FILE: Number of bytes written=771667
            FILE: Number of read operations=0
            FILE: Number of large read operations=0
            FILE: Number of write operations=0
            HDFS: Number of bytes read=674677
            HDFS: Number of bytes written=196192
            HDFS: Number of read operations=9
            HDFS: Number of large read operations=0
            HDFS: Number of write operations=4
    Job Counters
            Launched map tasks=1
            Launched reduce tasks=2
            Data-local map tasks=1
            Total time spent by all maps in occupied slots (ms)=7547
            Total time spent by all reduces in occupied slots (ms)=25618
    Map-Reduce Framework
            Map input records=12760
            Map output records=109844
            Map output bytes=1086547
            Map output materialized bytes=267032
            Input split bytes=107
            Combine input records=109844
            Combine output records=18040
            Reduce input groups=18040
            Reduce shuffle bytes=267032
            Reduce input records=18040
            Reduce output records=18040
            Spilled Records=36080
            Shuffled Maps =2
            Failed Shuffles=0
            Merged Map outputs=2
            GC time elapsed (ms)=598
            CPU time spent (ms)=4680
            Physical memory (bytes) snapshot=267587584
            Virtual memory (bytes) snapshot=1083478016
            Total committed heap usage (bytes)=152768512
    Shuffle Errors
            BAD_ID=0
            CONNECTION=0
            IO_ERROR=0
            WRONG_LENGTH=0
            WRONG_MAP=0
            WRONG_REDUCE=0
    File Input Format Counters
            Bytes Read=674570
    File Output Format Counters
            Bytes Written=196192  

可以看到job名字也是以job打頭的一個名字。

注意:這裡有可能會碰到錯誤:

java.io.FileNotFoundException: Path is not a file: /tmp/hadoop-yarn  

解決方法很簡單,命令是:

cd  /home/wujunshen/hadoop
bin/hdfs dfs -mkdir /tmp
bin/hdfs dfs -copyFromLocal /home/wujunshen/pg20417.txt /tmp
bin/hdfs dfs -ls /tmp  

(如果之前已經執行過以上命令就沒必要再輸入這些命令了。我順便講一下這幾個命令,其實hadoop是在ubuntu的檔案系統中劃出了一塊作為它自己的檔案系統,所謂的hdfs全稱就是hadoop file system,但是這個檔案系統中的檔案和資料夾是無法用ubuntu的命令找到的,也無法在win7,win8中用FTP客戶端cuteFTP找到。因為這是虛擬的檔案系統,現實中不存在。所以如果要在這個虛擬化的檔案系統中進行檔案和資料夾建立,還有拷貝和檢視等操作,必須開頭是以bin/hdfs dfs打頭的,這樣就能在這個虛擬的檔案系統中進行普通系統的操作,當然後面要有個減號,可以看到mkdir /tmp,copyFromLocal /home/wujunshen/pg20417.txt /tmp和ls /tmp就是普通檔案系統操作命令)

bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount /tmp/pg20417.txt /tmp-output101  

出現該錯誤的原因是在執行上條命令時候,在虛擬檔案系統hdfs的tmp資料夾下自動建立了一個/tmp/hadoop-yarn,而我們是對pg20417.txt 這個文字中的word個數進行計算,要找的是file而不是path,所以我們改成/tmp/pg20417.txt, 讓wordcount 程式知道自己要找的是個file而不是path,而且還知道自己要找的是哪個file。

登入http://192.168.72.130:8088檢視執行的job狀態

enter image description here

可以看到我試驗的各種成功和失敗的job資訊

真.總結

其實hadoop中有個很重要的東西就是yarn。在真.配置裡修改的那些有關yarn的配置檔案是讓hadoop變成真正的分散式系統的關鍵。 在這裡我簡單地對yarn介紹一下:

yarn原意為“紗線”,想想我們剛才對它進行了配置讓我們實現了真正的分散式配置,我頓時覺得用紗線這個名字還挺形象的,呵呵。 它是hadoop的一個資源管理器。它的資源管理和執行框架都是按master/slave範例實現——節點管理器(NM)執行、監控每個節點,並向資源管理器報告資源的可用性狀態。 特定應用的執行由Master控制,負責將一個應用分割成多個Job,並和資源管理器協調執行所需的資源。資源一旦分配好,Master就和節點管理器一起安排、執行、監控獨立的Job。 yarn提供了一種新的資源管理模型和執行方式,用來執行MapReduce任務。因此,在最簡單的情況下,現有的MapReduce應用仍然能照原樣執行(需要重新編譯),yarn只不過能讓開發人員更精確地指定執行引數。

好了,我終於寫完了。大家隨便看看吧~

題外話

我蠻喜歡hadoop這個黃色小象的logo,貼出來給大家養養眼 enter image description here

另外不知道大家在登入時有沒有注意到右上角的登入帳號,見下圖紅框:

enter image description here

這個dr. who可是大大有名啊~它是目前人類歷史上最長的電視連續劇,英國科幻劇《神祕博士》的劇名。前不久google上還紀念過這部電視劇開播50週年。新版的dr. who從2005年開始也開播了快10年了。至於它的外傳劇集《火炬木小組》在國內年輕人之中更加有名。(火炬木小組絕對是個坑,從2006年開始播,到現在也只有四季,平均每兩年出一季,第一,第二季還一季20多集,從第三季開始居然只有五六集。而且到現在也沒說會不會拍第五季,不過看第四季最後一集應該有續集。這片子主角傑克上校扮演者在美劇《綠箭俠》裡演一號反派。第四季裡那個會說上海話的黑人在夏天《星際迷航》最新電影版裡也出來過,就是被可汗脅迫炸樓的那位。)

相關文章