環境:centos 6.6 + hadoop2.6
虛擬機:(vmware fusion 7.0.0)
虛擬機hostname / IP地址
master / 192.168.187.102
slave01 / 192.168.187.103
slave02 / 192.168.187.104
注:前三個步驟都是准備工作,如果已經完成,可直接進入步驟四
步驟一: 先在3台虛擬機上,設置hostname及修改hosts文件
1.1 先正確設置各虛擬機的hostname
sudo vi /etc/sysconfig/network
將HOSTNAME=后的內容,改成想要的機器名
1.2 修改hosts文件
sudo vi /etc/hosts
192.168.187.102 master
192.168.187.103 slave01
192.168.187.104 slave02
這樣,就不用記IP了
這一步完成后,最好重啟一次系統,以便生效。然后可以用ping master(或slave01、slave02)試下,正常的話,應該能ping通
注:hostname不要命名為“xxx.01,xxx.02”之類以“.數字”結尾,否則到最后hadoop的NameNode服務將啟動失敗。
步驟二:在3台虛擬機上安裝jdk
yum install java
注:hadoop是java寫的,jdk是必須的。上述命令,會安裝openjdk最基本的運行時,沒有源碼和javac等其它工具。如果要安裝javac等編譯工具及源碼
yum install java-1.7.0-openjdk-devel
yum install java-1.7.0-openjdk-src
另外openjdk安裝后,不會默許設置JAVA_HOME環境變量,要查看安裝后的目錄,可以用命令
sudo update-alternatives --config java 看到
默認jre目錄為:/usr/lib/java/jvm/jre-1.7.0-openjdk.x86_64
如要設置環境變量,可用命令 sudo vi /etc/profile
在最后添加
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.75.x86_64 export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/jre/lib/dt.jar:$JAVA_HOME/jre/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin
注:如果不喜歡openjdk,想安裝oracle官方的jdk,可按下面步驟操作
a) rpm -qa | grep java
即:查看當前已經安裝的跟java相關的包,如果顯示有openjdk在其中
b) yum -y remove java
一般這樣就會卸載干凈,執行完以后,再運行 a)中的rpm -qa | grep java看看,如果還有殘留,可運行
rpm -e --nodeps tzdata-java-2015a-1.el6.noarch (最后的部分為要刪除的包名,即剛才查出來的結果)
重新安裝sun jdk,先從官網下載安裝文件
a) 上傳rpm安裝文件到虛擬機,參考下面的命令
scp jdk-7u51-linux-x64.rpm root@master:/home/hadoop/
b) 到虛擬機上,執行安裝
rpm -ivh jdk-7u51-linux-x64.rpm
c) 然后修改環境變量 sudo vi /etc/profile,在最后加下面三行
export JAVA_HOME=/usr/java/jdk1.7.0_51 export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin
保存退出,然后輸入 source /etc/profile 以便讓新環境變量生效
注:如果機器上之前用 yum install hadoop之類的命令安裝過低版本的hadoop,也必須先卸載干凈
步驟三:在3台虛擬機上創建專門用戶hadoop
useradd hadoop (創建用戶)
passwd hadoop (設置密碼,為簡單起見,3台機器上的hadoop密碼最好設置成一樣,比如hadoop123)
為了方便,建議將hadoop加入root用戶組,操作方法:
先以root身份登錄,然后輸入
usermod -g root hadoop ,執行完后hadoop即歸屬於root組了,可以再輸入
id hadoop 查看輸出驗證一下,如果看到類似下面的輸出:
uid=502(hadoop) gid=0(root) 組=0(root)
就表示OK了
步驟四:配置ssh免密碼登錄
hadoop工作時,各節點要相互通訊,正常情況下linux之間通訊要提供用戶名、密碼(目的是保證通訊安全),如果需要人工干預輸入密碼,顯然不方便,做這一步的目的,是讓各節點能自動通過安全認證,不影響正常通訊。
4.1 先在master上,生成公鑰、私鑰對
以hadoop身份登錄到系統
cd (進入個人主目錄,默認為/home/hadoop)
ssh-keygen -t rsa -P '' (注:最后是二個單引號)
即:以rsa算法,生成公鑰、私鑰對,-P ''表示空密碼。該命令運行完后,會在個人主目錄下生成.ssh目錄,里面會有二個文件id_rsa(私鑰) ,id_rsa.pub(公鑰)
4.2 導入公鑰
cat .ssh/id_rsa.pub >> .ssh/authorized_keys
執行完以后,可以在本機上測試下,用ssh連接自己,即:ssh localhost (或ssh master),如果不幸還是提示要輸入密碼,說明還沒起作用,還有一個關鍵的操作
chmod 600 .ssh/authorized_keys (修改文件權限,否則不起作用)
然后再測試下 ssh localhost ,如果不需要輸入密碼,就連接成功,表示ok,一台機器已經搞定了。
4.3 在其它機器上生成公鑰、密鑰,並將公鑰文件復制到master
a) 以hadoop身份登錄其它二台機器 slave01、slave02,執行 ssh-keygen -t rsa -P '' 生成公鑰、密鑰
b) 然后用scp命令,把公鑰文件發放給master(即:剛才已經搞定的那台機器)
slave01上:
scp .ssh/id_rsa.pub hadoop@master:/home/hadoop/id_rsa_01.pub
slave02上:
scp .ssh/id_rsa.pub hadoop@master:/home/hadoop/id_rsa_02.pub
這二行執行完后,回到master中,查看下/home/hadoop目錄,應該有二個新文件id_rsa_01.pub、id_rsa_02.pub,然后在master上,導入這二個公鑰
cat id_rsa_01.pub >> .ssh/authorized_keys
cat id_rsa_02.pub >> .ssh/authorized_keys
這樣,master這台機器上,就有所有3台機器的公鑰了。
4.4 將master上的“最全”公鑰,復制到其它機器
a) 繼續保持在master上,
scp .ssh/authorized_keys hadoop@slave01:/home/hadoop/.ssh/authorized_keys
scp .ssh/authorized_keys hadoop@slave02:/home/hadoop/.ssh/authorized_keys
b) 修改其它機器上authorized_keys文件的權限
slave01以及slave02機器上,均執行命令
chmod 600 .ssh/authorized_keys
4.5 驗證
在每個虛擬機上,均用 ssh 其它機器的hostname 驗證下,如果能正常無密碼連接成功,表示ok
小結:該步驟非常重要,主要思路是在各節點上生成公鑰、私鑰,然后將公鑰發放其它所有節點。RSA算法是非對稱加密算法,僅公布“公鑰”,只要私鑰不外泄,還是不能解密的,所以安全性依然有保障。
如果本步驟失敗,根據我個人經驗,多半是權限問題,請檢查hadoop是否具有足夠權限,建議將hadoop加入sudoers列表及root用戶組。另外,這里也整理了一些SSH免密碼設置失敗的原因,請移步 ssh 免密碼設置失敗原因總結
步驟五:上傳並解壓hadoop2.6
a)在本機上,用scp命令上傳hadoop2.6到master
scp hadoop-2.6.0.tar.gz hadoop@master:/home/hadoop/
b) 以hadoop身份登錄到master,運行以下命令解壓
tar -zxvf hadoop-2.6.0.tar.gz
步驟六:修改配置
一共有7個文件要修改:
$HADOOP_HOME/etc/hadoop/hadoop-env.sh
$HADOOP_HOME/etc/hadoop/yarn-env.sh
$HADOOP_HOME/etc/hadoop/core-site.xml
$HADOOP_HOME/etc/hadoop/hdfs-site.xml
$HADOOP_HOME/etc/hadoop/mapred-site.xml
$HADOOP_HOME/etc/hadoop/yarn-site.xml
$HADOOP_HOME/etc/hadoop/slaves
其中$HADOOP_HOME表示hadoop根目錄,本文中默認為/home/hadoop/hadoop-2.6.0
a) hadoop-env.sh 、yarn-env.sh
這二個文件主要是修改JAVA_HOME后的目錄,改成實際本機jdk所在目錄位置
vi etc/hadoop/hadoop-env.sh (及 vi etc/hadoop/yarn-env.sh)
找到下面這行的位置,改成(jdk目錄位置,大家根據實際情況修改)
export JAVA_HOME=/usr/java/jdk1.7.0_51
另外 hadoop-env.sh中 , 建議加上這句:
export HADOOP_PREFIX=/home/hadoop/hadoop-2.6.0
b) core-site.xml 參考下面的內容修改:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 3 <configuration> 4 <property> 5 <name>fs.defaultFS</name> 6 <value>hdfs://master:9000</value> 7 </property> 8 <property> 9 <name>hadoop.tmp.dir</name> 10 <value>/home/hadoop/tmp</value> 11 </property> 12 </configuration>
注:/home/hadoop/tmp 目錄如不存在,則先mkdir手動創建
core-site.xml的完整參數請參考
http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-common/core-default.xml
c) hdfs-site.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 3 <configuration> 4 <property> 5 <name>dfs.datanode.ipc.address</name> 6 <value>0.0.0.0:50020</value> 7 </property> 8 <property> 9 <name>dfs.datanode.http.address</name> 10 <value>0.0.0.0:50075</value> 11 </property> 12 <property> 13 <name>dfs.replication</name> 14 <value>2</value> 15 </property> 16 </configuration>
注:dfs.replication表示數據副本數,一般不大於datanode的節點數。
hdfs-site.xml的完整參數請參考
http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
d) mapred-site.xml
1 <?xml version="1.0"?> 2 <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 3 <configuration> 4 <property> 5 <name>mapreduce.framework.name</name> 6 <value>yarn</value> 7 </property> 8 </configuration>
mapred-site.xml的完整參數請參考
e)yarn-site.xml
1 <?xml version="1.0"?> 2 <configuration> 3 <property> 4 <name>yarn.nodemanager.aux-services</name> 5 <value>mapreduce_shuffle</value> 6 </property> 7 </configuration>
yarn-site.xml的完整參數請參考
http://hadoop.apache.org/docs/r2.6.0/hadoop-yarn/hadoop-yarn-common/yarn-default.xml
另外,hadoop 1.x與2.x相比, 1.x中的很多參數已經被標識為過時,具體可參考
http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-common/DeprecatedProperties.html
最后一個文件slaves暫時不管(可以先用mv slaves slaves.bak 將它改名),上述配置弄好后,就可以在master上啟用 NameNode測試了,方法:
$HADOOP_HOME/bin/hdfs namenode –format 先格式化
15/02/12 21:29:53 INFO namenode.FSImage: Allocated new BlockPoolId: BP-85825581-192.168.187.102-1423747793784
15/02/12 21:29:53 INFO common.Storage: Storage directory /home/hadoop/tmp/dfs/name has been successfully formatted.
等看到這個時,表示格式化ok
$HADOOP_HOME/sbin/start-dfs.sh
啟動完成后,輸入jps查看進程,如果看到以下二個進程:
5161 SecondaryNameNode
4989 NameNode
表示master節點基本ok了
再輸入$HADOOP_HOME/sbin/start-yarn.sh ,完成后,再輸入jps查看進程
5161 SecondaryNameNode
5320 ResourceManager
4989 NameNode
如果看到這3個進程,表示yarn也ok了
f) 修改slaves
如果剛才用mv slaves slaves.bak對該文件重命名過,先運行 mv slaves.bak slaves 把名字改回來,再
vi slaves 編輯該文件,輸入
slave01
slave02
保存退出,最后運行
$HADOOP_HOME/sbin/stop-dfs.sh
$HADOOP_HOME/sbin/stop-yarn.sh
停掉剛才啟動的服務
步驟七:將master上的hadoop目錄復制到slave01,slave02
仍然保持在master機器上
cd 先進入主目錄
scp -r hadoop-2.6.0 hadoop@slave01:/home/hadoop/
scp -r hadoop-2.6.0 hadoop@slave02:/home/hadoop/
注:slave01、slave02上的hadoop臨時目錄(tmp)及數據目錄(data),仍然要先手動創建。
步驟八:驗證
master節點上,重新啟動
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
順利的話,master節點上有幾下3個進程:
7482 ResourceManager
7335 SecondaryNameNode
7159 NameNode
slave01、slave02上有幾下2個進程:
2296 DataNode
2398 NodeManager
同時可瀏覽:
http://master:50070/
http://master:8088/
查看狀態
另外也可以通過 bin/hdfs dfsadmin -report 查看hdfs的狀態報告
其它注意事項:
a) master(即:namenode節點)若要重新格式化,請先清空各datanode上的data目錄(最好連tmp目錄也一起清空),否則格式化完成后,啟動dfs時,datanode會啟動失敗
b) 如果覺得master機器上只運行namenode比較浪費,想把master也當成一個datanode,直接在slaves文件里,添加一行master即可
c) 為了方便操作,可修改/etc/profile,把hadoop所需的lib目錄,先加到CLASSPATH環境變量中,同時把hadoop/bin,hadoop/sbin目錄也加入到PATH變量中,可參考下面的內容:
export HADOOP_HOME=/home/hadoop/hadoop-2.6.0
export JAVA_HOME=/usr/java/jdk1.7.0_51
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$HADOOP_HOME/share/hadoop/common/hadoop-common-2.6.0.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.6.0.jar:$HADOOP_HOME/share/hadoop/common/lib/commons-cli-1.2.jar
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/sbin:$HADOOP_HOME/bin