天天看點

hadoop-0.20.1部署手記

因為需要分析大量的通路日志,現有的分析方式(單機)不能滿足需求,是以需要部署hadoop來解決這個問題。在我做分布式檔案系統之前,曾經部署測試過hadoop,使用的版本為hadoop-0.19.0,記得當時配置起來很快就成功了。這次測試,我使用的是最新版本hadoop-0.20.1,在部署過程中,花了不少時間才做成功(2天)。為備忘,特記錄之。

hadoop-0.20.1跟舊的版相比,有些檔案發生了變化,主要的變化是conf目錄,我在這裡給出一個簡單的對比表:

Hadoop-0.19.0

Hadoop-0.20.1

ll hadoop-0.19.0/conf/

ll hadoop-0.20.1/conf/

total 92-rw-rw-r-- 1 root root  2065 Nov 14  2008 capacity-scheduler.xml-rw-rw-r-- 1 root root   535 Nov 14  2008 configuration.xsl-rw-rw-r-- 1 root root 49456 Nov 14  2008 hadoop-default.xml-rw-rw-r-- 1 root root  2237 Nov 14  2008 hadoop-env.sh-rw-rw-r-- 1 root root  1245 Nov 14  2008 hadoop-metrics.properties-rw-rw-r-- 1 root root   178 Nov 14  2008 hadoop-site.xml-rw-rw-r-- 1 root root  2815 Nov 14  2008 log4j.properties-rw-rw-r-- 1 root root    10 Nov 14  2008 masters-rw-rw-r-- 1 root root    10 Nov 14  2008 slaves-rw-rw-r-- 1 root root   401 Nov 14  2008 sslinfo.xml.example

total 56-rw-rw-r-- 1 root root 3936 Sep  2 04:44 capacity-scheduler.xml-rw-rw-r-- 1 root root  535 Sep  2 04:44 configuration.xsl-rw-rw-r-- 1 root root  178 Sep  2 04:44 core-site.xml-rw-rw-r-- 1 root root 2237 Sep  2 04:44 hadoop-env.sh-rw-rw-r-- 1 root root 1245 Sep  2 04:44 hadoop-metrics.properties-rw-rw-r-- 1 root root 4190 Sep  2 04:44 hadoop-policy.xml-rw-rw-r-- 1 root root  178 Sep  2 04:44 hdfs-site.xml-rw-rw-r-- 1 root root 2815 Sep  2 04:44 log4j.properties-rw-rw-r-- 1 root root  178 Sep  2 04:44 mapred-site.xml-rw-rw-r-- 1 root root   10 Sep  2 04:44 masters

-rw-rw-r-- 1 root root   10 Sep  2 04:44 slaves

-rw-rw-r-- 1 root root 1243 Sep  2 04:44 ssl-client.xml.example

-rw-rw-r-- 1 root root 1195 Sep  2 04:44 ssl-server.xml.example

網上現有的hadoop文章,需要修改的檔案是hadoop-site.xml,可是hadoop-0.20.1版本确沒有這個檔案,取而代之的是core-site.xml。

一、部署hadoop

hadoop部署分兩步:名稱節點(namenode)無密碼通路各資料節點(datanode)和配置hadoop.我的實驗環境為一個名稱節點,兩個資料節點.不幸的是其中的一個資料節點壞了。是以隻能用一個資料節點來測試。在這個測試中,namenode的ip:192.168.199.135,datanode的ip:192.168.199.136.

(一)、名稱節點(namenode)無密碼通路各資料節點(datanode)

1、名稱節點和資料節點各自建立使用者hadoop,使用相同的密碼。

2、以hadoop使用者名登陸名稱節點執行 ssh-keygen  -t  rsa 然後一路回車,完畢後生成檔案.ssh/id_rsa.pub,把這個檔案複制到目前位置,命名為authorized_keys;然後執行指令 ssh 127.0.0.1,如果不需要密碼則直接登陸進去的話,就達到要求;否則需檢查authorized_keys的權限,看是否為644(-rw-r--r--)。接下來,同樣也hadoop使用者登陸資料節點伺服器,建立.ssh目錄,并給與600權限(chmod 600 .ssh); 再把名稱伺服器上的authorized_keys複制到目錄./ssh,注意權限和目錄結構跟名稱節點保持一緻,然後再從名稱節點用ssh登陸資料節點,如果不需要密碼能登陸成功,則ssh的配置結束。

(二) hadoop配置

1、下載下傳jdk并設定。我的 JAVA_HOME =/usr/local/jdk1.6.0_06

2、下載下傳hadoop,解包,複制到/usr/local/hadoop.即 HADOOP_HOME=/usr/local/hadoop

3、資料存放目錄分離,即資料的實際存放不在 HADOOP_HOME(網上的n多文章是在hadoop安裝目錄).我用2個1TB的硬碟單獨來存放實際的資料塊,其名稱為/disk2,/disk3.格式化這兩個硬碟并建立檔案系統,然後挂接到這2個目錄。相關步驟省略。

4、設定目錄、檔案的屬主。chown -R  hadoop:hadoop  /disk2  /disk3  /usr/local/hadoop

5、在檔案/usr/local/hadoop/conf/core-site.xml 的<configuration>與</configuration>中間插入如下内容(内容從網上找的):

<property>

<name>fs.default.name</name>

<value>hdfs://hadoopm:9000</value>

<description>The name of the default file system. Either the literal string "local" or a host:port for DFS.</description>

</property> 

<name>mapred.job.tracker</name>

<value>hadoopm: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>

<name>hadoop.tmp.dir</name>

<value>/disk2/hadoop/tmp</value>

<description>A base for other temporary directories.</description>

<name>dfs.name.dir</name>

<value>/disk2/hadoop/filesystem/name</value>

<description>Determines where on the local filesystem the DFS name node should store the name table. If this is a comma-delimited list of directories then the name table is replicated in all of the directories, for redundancy. </description>

<name>dfs.data.dir</name>

<value>/disk2/hadoop/filesystem/data</value>

<description>Determines where on the local filesystem an DFS data node should store its blocks. If this is a comma-delimited list of directories, then data will be stored in all named directories, typically on different devices. Directories that do not exist are i

gnored.</description>

<name>dfs.replication</name>

<value>1</value>

<description>Default block replication. The actual number of replications can be specified when the file is created. The default isused if replication is not specified in create time.</description>

根據字面意思,不難了解每個文本塊的作用,是以這裡不再啰嗦。有一點需要提及,就是“<value>hdfs://hadoop:9000</value>”,我起初用的是ip,運作程式時可能會出錯。

STARTUP_MSG: Starting DataNodeSTARTUP_MSG:   host = hadoop-s2/127.0.0.1STARTUP_MSG:   args = []STARTUP_MSG:   version = 0.20.1STARTUP_MSG:   build = http://svn.apache.org/repos/asf/hadoop/common/tags/release-0.20.1-rc1 -r 810220; compiled by 'oom' on Tue Sep  1 20:55:56 UTC 2009************************************************************/2009-10-15 10:16:01,592 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: hadoop-m/192.168.199.135:9000. Already tried 0 time(s).2009-10-15 10:16:02,594 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: hadoop-m/192.168.199.135:9000. Already tried 1 time(s).………………………………………(省略)………………

6、修改檔案/usr/local/hadoop/conf/slaves及/usr/local/hadoop/conf/masters,把資料節點的主機名加到slaves、名稱節點主機名加到masters。可以加多個,每行一個。注意主機名需要在每個伺服器的/etc/hosts映射好。

7、修改檔案/usr/local/hadoop/conf/hadoop-env.sh,加入 export JAVA_HOME=/usr/local/jdk1.6.0_06一行即可。

8、在每個資料節點重複1~7這些步驟。

二、初始化和啟動hadoop叢集

(一)hadoop的大部分操作都是在命名節點進行的。以hadoop使用者登陸系統然後執行 hadoop namenode -format ,一般都能順利完成這個過程。執行完初始化後,各資料節點并沒有進行任何操作(最重要的事情就是生成一堆目錄)。

(二)啟動hadoop服務。命名伺服器以hadoop使用者執行 start-all.sh . 檢視程序,如果正常,應該看見2-3個java程序。啟動正常的話,資料節點開始生成相關的目錄。其對比輸出如下:

名稱節點未執行start-all.sh資料節點相關目錄的情況

名稱節點執行start-all.sh資料節點相關目錄的情況

[root@hadoop-s2 conf]# ll /disk2total 16drwx------ 2 hadoop hadoop 16384 Oct 13 19:53 lost+found

[root@hadoop-s2 conf]# ll /disk2total 20drwxrwxr-x 3 hadoop hadoop  4096 Oct 16 09:42 hadoopdrwx------ 2 hadoop hadoop 16384 Oct 13 19:53 lost+found

三、測試

1、檢視hadoop狀态,使用指令 $hadoop dfs -report.下面是我的伺服器的輸出:

[hadoop@hadoop-m ~]$ hadoop dfsadmin -reportConfigured Capacity: 984509087744 (916.9 GB)Present Capacity: 933221065008 (869.13 GB)DFS Remaining: 932155265024 (868.14 GB)DFS Used: 1065799984 (1016.43 MB)DFS Used%: 0.11% 

-------------------------------------------------

Datanodes available: 1 (1 total, 0 dead)

Name: 192.168.193.137:50010

Decommission Status : Normal

Configured Capacity: 984509087744 (916.9 GB)

DFS Used: 1065799984 (1016.43 MB)

Non DFS Used: 51288022736 (47.77 GB)

DFS Remaining: 932155265024(868.14 GB)

DFS Used%: 0.11%

DFS Remaining%: 94.68%

Last contact: Thu Oct 15 15:56:07 CST 2009

特别要注意有沒有“Datanodes available: 1 (1 total, 0 dead)”出現,如果沒有資料節點被連接配接,請登入資料節點,檢視hadoop的日志檔案,查找其失敗的原因。

2、建立目錄。$hadoop  dfs -mkdir sery ,然後再傳幾個大檔案 $hadoop dfs -put 7.*  sery . 傳了900M  左右的資料(2個iso檔案),很快傳完。執行 $hadoop dfs -ls sery , 其輸出為:

[hadoop@hadoop-m ~]$ hadoop dfs -ls  seryFound 2 items-rw-r--r--   1 hadoop supergroup  523335680 2009-10-15 15:52 /7.0-RELEASE-amd64-disc1.iso-rw-r--r--   1 hadoop supergroup  534177792 2009-10-15 15:52 /7.0-RELEASE-i386-disc1.iso 

3、故障測試。需要2個資料節點,先關閉一個資料節點,然後網hadoop建立目錄和拷貝資料。完畢後啟動被關閉的資料節點的服務,觀察其運作情況。

四、雜項

如果資料節點有2個以上的分區或硬碟需要拿來存放資料,則需要修改配置檔案core-site.xml,請看下面的例子:

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>

  <name>fs.default.name</name>

  <value>hdfs://192.168.0.135:9000</value>

  <description>The name of the default file system. Either the literal string "local" or a host:port for DFS.</description>

  <name>mapred.job.tracker</name>

  <value>hadoop-m: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 an

d reduce task.</description>

  <name>hadoop.tmp.dir</name>

  <value>/disk2/hadoop/filesystem/tmp,/disk3/hadoop/filesystem/tmp</value>

  <description>A base for other temporary directories.</description>

  <name>dfs.name.dir</name>

  <value>/disk2/hadoop/filesystem/name,/disk3/hadoop/filesystem/name</value>

  <description>Determines where on the local filesystem the DFS name node should store the name table. If this is a comma-delimited

list of directories then the name table is replicated in all of the directories, for redundancy. </description>

  <name>dfs.data.dir</name>

  <value>/disk2/hadoop/filesystem/data,/disk3/hadoop/filesystem/data</value>

  <description>Determines where on the local filesystem an DFS data node should store its blocks. If this is a comma-delimited list

of directories, then data will be stored in all named directories, typically on different devices. Directories that do not exist are

 ignored.</description>

  <name>dfs.replication</name>

  <value>1</value>

  <description>Default block replication. The actual number of replications can be specified when the file is created. The default i

s used if replication is not specified in create time.</description>

</configuration>

注意:<value>......</value>出現2個字段值,中間用逗号分割。如有更多共享分區,則依照這個規則加入。

本文轉自sery51CTO部落格,原文連結:http://blog.51cto.com/sery/214271 ,如需轉載請自行聯系原作者