首先我們統一一下定義,在這里所提到的Hadoop是指Hadoop Common,主要提供DFS(分布式文件存儲)與Map/Reduce的核心功能。
Hadoop在windows下還未經過很好的測試,所以筆者推薦大家在linux(cent os 5.X)下安裝使用。
準備安裝Hadoop集群之前我們得先檢驗系統是否安裝了如下的必備軟件:ssh、rsync和Jdk1.6(因為Hadoop需要使用到Jdk中的編 譯工具,所以一般不直接使用Jre)。可以使用yum install rsync來安裝rsync。一般來說ssh是默認安裝到系統中的。Jdk1.6的安裝方法這里就不多介紹了。
確保以上準備工作完了之后我們就開始安裝Hadoop軟件,假設我們用三臺機器做Hadoop集群,分別是:192.168.1.111、192.168.1.112和192.168.1.113(下文簡稱111,112和113),且都使用root用戶。
下面是在linux平臺下安裝Hadoop的過程:
[root@192.168.1.111] #這里將Hadoop安裝到/opt/hadoop [root@192.168.1.111] mkdir /opt/hadoop [root@192.168.1.111] cd /opt/hadoop [root@192.168.1.111] #更改所屬關系和權限(對于其它用戶而言) [root@192.168.1.111] chown root ./; chmod 755 ./ [root@192.168.1.111] # 下載項目包(去官網(http://hadoop.apache.org/)下載Hadoop項目) [root@192.168.1.111] wget http://www.apache.org/dist/hadoop/core/hadoop-0.20.2/hadoop-0.20.2.tar.gz [root@192.168.1.111] # 解壓 [root@192.168.1.111] tar xzvf hadoop-0.20.2.tar.gz [root@192.168.1.111] # 進入目錄 [root@192.168.1.111] cd hadoop-0.20.2 [root@192.168.1.111] # 因為Hadoop子項目的需要,一般需要設置環境變量如下: [root@192.168.1.111] export HADOOP_HOME=`pwd` [root@192.168.1.111] # 也可以將環境變量設置到/etc/profile中 |
在所有服務器的同一路徑下都進行這幾步,就完成了集群Hadoop軟件的安裝,是不是很簡單?沒錯安裝是很簡單的,下面就是比較困難的工作了。
集群配置
根據Hadoop文檔的描述“The Hadoop daemons are NameNode/DataNode and JobTracker/TaskTracker.”可以看出Hadoop核心守護程序就是由NameNode/DataNode 和JobTracker/TaskTracker這幾個角色構成。
Hadoop的DFS需要確立NameNode與DataNode角色,一 般NameNode會部署到一臺單獨的服務器上而不與DataNode共同同一機器。另外Map/Reduce服務也需要確立JobTracker和 TaskTracker的角色,一般JobTracker與NameNode共用一臺機器作為master,而TaskTracker與DataNode 同屬于slave。至于NameNode/DataNode和JobTracker/TaskTracker的概念這里就不多講了,需要了解的可以參看相 關文檔。
在這里我們使用111作為NameNode與JobTracker,其它兩臺機器作為DataNode和TaskTracker,具體的配置如下:
環境的配置
在$HADOOP_HOME/conf/hadoop-env.sh中定義了Hadoop啟動時需要的環境變量設置,其中我們至少需要配置 JAVA_HOME(Jdk的路徑)變量;另外我們一般還需要更改HADOOP_LOG_DIR(Hadoop的日志路徑)這個變量,默認的設置是 “export HADOOP_LOG_DIR=${HADOOP_HOME}/logs”,一般需要將其配置到一個磁盤空間比較大的目錄下。
Hadoop核心程序配置
Hadoop 包括一組默認配置文件($HADOOP_HOME/src目錄下的core/core-default.xml, hdfs/hdfs-default.xml 和mapred/mapred-default.xml),大家可以先好好看看并理解默認配置文件中的那些屬性。雖然默認配置文件能讓Hadoop核心程 序順利啟動,但對于開發人員來說一般需要自己的來設置一些常規配置以滿足開發和業務的需求,所以我們需要對默認配置文件的值進行覆蓋,具體方法如下。
$HADOOP_HOME/conf/core-site.xml是Hadoop的核心配置文件,對應并覆蓋core-default.xml中的配置項。我們一般在這個文件中增加如下配置:
Core-site.xml代碼

- <configuration>
- <property>
- <!-- 用于dfs命令模塊中指定默認的文件系統協議 -->
- <name>fs.default.name</name>
- <value>hdfs://192.168.1.111:9000</value>
- </property>
- </configuration>
$HADOOP_HOME/conf/hdfs-site.xml是HDFS的配置文件,對應并覆蓋hdfs-default.xml中的配置項。我們一般在這個文件中增加如下配置:
Hdfs-site.xml代碼

- <configuration>
- <property>
- <!-- DFS中存儲文件命名空間信息的目錄 -->
- <name>dfs.name.dir</name>
- <value>/opt/hadoop/data/dfs.name.dir</value>
- </property>
- <property>
- <!-- DFS中存儲文件數據的目錄 -->
- <name>dfs.data.dir</name>
- <value>/opt/hadoop/data/dfs.data.dir</value>
- </property>
- <property>
- <!-- 是否對DFS中的文件進行權限控制(測試中一般用false)-->
- <name>dfs.permissions</name>
- <value>false</value>
- </property>
- </configuration>
$HADOOP_HOME/conf/mapred-site.xml是Map/Reduce的配置文件,對應并覆蓋mapred-default.xml中的配置項。我們一般在這個文件中增加如下配置:
Mapred-site.xml代碼

- <configuration>
- <property>
- <!-- 用來作JobTracker的節點的(一般與NameNode保持一致) -->
- <name>mapred.job.tracker</name>
- <value>192.168.1.111:9001</value>
- </property>
- <property>
- <!-- map/reduce的系統目錄(使用的HDFS的路徑) -->
- <name>mapred.system.dir</name>
- <value>/system/mapred.system.dir</value>
- </property>
- <property>
- <!-- map/reduce的臨時目錄(可使用“,”隔開,設置多重路徑來分攤磁盤IO) -->
- <name>mapred.local.dir</name>
- <value>/opt/hadoop/data/mapred.local.dir</value>
- </property>
- </configuration>
主從配置
在$HADOOP_HOME/conf目錄中存在masters和slaves這兩個文件,用來做Hadoop的主從配置。上面已經提到了 Hadoop主要由NameNode/DataNode 和JobTracker/TaskTracker構成,在主從配置里我們一般將NameNode和JobTracker列為主機,其它的共為從機,于是對 于此處的配置應該是:
Masters代碼

- 192.168.1.111
Slaves代碼

- 192.168.1.112
- 192.168.1.113
如果你對以上介紹的配置項做了正確的配置,那么你的Hadoop集群只差啟動和初體念了,當然,在$HADOOP_HOME/conf目錄下還包括其它的一些配置文件,但那些都不是必須設置的,如果有興趣你可以自己去了解了解。
值得注意的是Hadoop集群的所有機器的配置應該保持一致,一般我們在配置完master后,使用scp將配置文件同步到集群的其它服務器上。
注:
如果想更換ssh的端口的話,需要把hadoop-env.sh中的HADOOP_SSH_OPTS部分,修改為export HADOOP_SSH_OPTS="-p 7003" #7003是ssh的端口號
啟動
經過以上兩個步驟,Hadoop的安裝和配置已經OK了,那么下面我們就來啟動Hadoop集群。啟動前我們需要做一些準備,因為集群的啟動是 從NameNode開始的,于是DataNode的運行需要NameNode的遠程調用,Hadoop使用ssh命令遠程運行DataNode節點,這就 是為什么Hadoop需要ssh的支持。我們可以想象一下,如果集群里有100臺機器,那么我們就需要輸入100遍主機的訪問密碼,但如果配置SSH使用 無密碼公鑰認證的方式,就解決了此問題。
簡單的說,在111上需要生成一個密鑰對,即一個私鑰和一個公鑰。將公鑰拷貝到112和113上,如 此一來,當111向112發起ssh連接的時候,112上就會生成一個隨機數并用111的公鑰對這個隨機數進行加密,并且發送給111,111收到這個加 密的數以后用私鑰進行解密,并將解密后的數返回112,112確認解密的數無誤后就允許111進行連接了。這就完成了一次公鑰認證過程。
公鑰生成的步驟如下:
[root@192.168.1.111] ssh-keygen -t rsa [root@192.168.1.111] #以下是生成一個為id_rsa/id_rsa.pub的無密碼的公/私鑰對 Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: [root@192.168.1.111] ls -l ~/.ssh [root@192.168.1.111] #這樣我們會看到如下所示的結果集: -rw------- 1 root root 1675 Jul 5 14:01 id_rsa -rw-r--r-- 1 root root 394 Jul 5 14:01 id_rsa.pub |
然后將id_rsa.pub的內容復制到每個機器(也包括本機)的~/.ssh/authorized_keys文件中。如果 authorized_keys不存在,則使用touch ~/.ssh/authorized_keys生成一個;如果該文件已經存在,則追加內容進去就OK了,這里我們推薦使用如下命令:
[root@192.168.1.111] cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys [root@192.168.1.111] #因為ssh服務對文件的權限有著非常嚴格的限制(authorized_keys只能擁有指定用戶的寫權限)于是需要進行如下處理 [root@192.168.1.111] chmod 644 ~/.ssh/authorized_keys |
經過以上步驟,我們的無密碼訪問就配置好了,可以通過如下命令進行驗證:
[root@192.168.1.111] ssh 192.168.1.112 [root@192.168.1.112] exit [root@192.168.1.111] ssh 192.168.1.113 [root@192.168.1.113] exit |
如此一來,就可以正常啟動Hadoop集群了。啟動方式如下:
[root@192.168.1.111] cd $HADOOP_HOME/bin [root@192.168.1.111] #查看一下目錄下的文件 [root@192.168.1.111] ls -l -rwxr-xr-x 1 root root 9998 Feb 19 15:55 hadoop -rwxr-xr-x 1 root root 1966 Feb 19 15:55 hadoop-config.sh -rwxr-xr-x 1 root root 3690 Feb 19 15:55 hadoop-daemon.sh -rwxr-xr-x 1 root root 1227 Feb 19 15:55 hadoop-daemons.sh -rwxr-xr-x 1 root root 2710 Feb 19 15:55 rcc -rwxr-xr-x 1 root root 2043 Feb 19 15:55 slaves.sh -rwxr-xr-x 1 root root 1066 Feb 19 15:55 start-all.sh -rwxr-xr-x 1 root root 965 Feb 19 15:55 start-balancer.sh -rwxr-xr-x 1 root root 1645 Feb 19 15:55 start-dfs.sh -rwxr-xr-x 1 root root 1159 Feb 19 15:55 start-mapred.sh -rwxr-xr-x 1 root root 1019 Feb 19 15:55 stop-all.sh -rwxr-xr-x 1 root root 1016 Feb 19 15:55 stop-balancer.sh -rwxr-xr-x 1 root root 1146 Feb 19 15:55 stop-dfs.sh -rwxr-xr-x 1 root root 1068 Feb 19 15:55 stop-mapred.sh [root@192.168.1.111] #啟動服務之前,我們需要做一件事情,非常重要,那就是格式化命名空間 [root@192.168.1.111] ./hadoop namenode -format [root@192.168.1.111] #啟動dfs和map/reduce服務 [root@192.168.1.111] ./start-all.sh |
我們用如下命令驗證一下是否啟動成功:
[root@192.168.1.111] $HADOOP_HOME/bin/hadoop dfs -ls |
如果沒有錯誤提示或者出現文件列表,那么恭喜你,Hadoop成功啟動了,另外,我們可以通過訪問 http://192.168.1.111:50070來查看hdfs的狀態,訪問http://192.168.1.111:50030來查看map /reduce的狀態。
如果出現錯誤,或Hadoop集群未啟動,可以查看$HADOOP_HOME/logs/下的日志文件。