首先獻上Hadoop下載地址:
http://apache.fayea.com/hadoop/core/
選擇相應版本,點一下,直接進行http下載了。
對原來寫的一篇文章,相當不滿意,過於粗糙了,於是刪除重新再來。言歸正傳:
題前說明:
我一共三台機器,機器名分別是:
master
slave1
slave2
登錄名統一是:master
我先在master機器上執行以下操作:
一、解壓縮
這里需要說明下,根據網上的教程,解壓縮后,把文件copy到/usr/目錄下。在master機器啟動的時候,一直提示,對於slave1和slave2機器操作無權限,類似於下面的提示:
slave2: /usr/hadoop/sbin/hadoop-daemon.sh: line 178: /usr/hadoop/logs/hadoop-master-datanode-slave2.out: Permission denied
個人分析,/usr目錄的所有者是root,而我安裝hadoop的賬戶是master(ps:這個名字起的有點糟糕,和主機器名重了),這樣,盡管里面的hadoop目錄的所有者是master,也訪問失敗。於是我把hadoop目錄整個移到了~/work文件夾下(work是自己建的目錄)。所以,個人建議,還是把工作目錄建在個人目錄下,比較不容易出現權限類的問題,當然,僅僅針對我這種linux新手來說的。
tip:
解壓縮命令:tar -zxvf hadoop-2.7.0.tar.gz
解壓出來的文件是hadoop-2.7.0
copy命令:cp -r hadoop-2.7.0 ~/work/hadoop 這里直接重命名為hadoop
二、創建工作文件夾
一共三個,我建在了~/hadoop/這個文件夾下,便於管理:
附命令:
cd ~/hadoop
mkdir tmp
mkdir -p dfs/name
cd dfs
mkdir data
三、重頭戲,配置
從教程里看到一共有以下7個文件,目前還不了解他們的作用,后續補充:
2、vi ~/work/hadoop/etc/hadoop/yarn-env.sh
配置內容同1,略。
3、vi ~/work/hadoop/etc/hadoop/slaves
把作為datanode的機器名加上,我這里是兩台機器:
slave1
slave2
4、vi ~/work/hadoop/etc/hadoop/core-site.xml
這里要吐槽一下,gedit命令不能用,這個vi編輯好累。
1 <configuration> 2 <property> 3 <name>fs.defaultFS</name> 4 <value>hdfs://master:8020</value> 5 </property> 6 <property> 7 <name>io.file.buffer.size</name> 8 <value>131072</value> 9 </property> 10 <property> 11 <name>hadoop.tmp.dir</name> 12 <value>file:/home/master/hadoop/tmp</value> 13 <description>Abase for other temporary directories.</description> 14 </property> 15 <property> 16 <name>hadoop.proxyuser.master.hosts</name> 17 <value>*</value> 18 </property> 19 <property> 20 <name>hadoop.proxyuser.master.groups</name> 21 <value>*</value> 22 </property> 23 </configuration>
tip:
1)第三個節點value,是我在上面步驟二創建的目錄之一,/home/master/hadoop/tmp
2)第四、五節點,name里,有我登錄用戶名master,你使用自己的名字替換即可。
5、vi ~/work/hadoop/etc/hadoop/hdfs-site.xml
1 <configuration> 2 <property> 3 <name>dfs.namenode.secondary.http-address</name> 4 <value>master:9001</value> 5 </property> 6 <property> 7 <name>dfs.namenode.name.dir</name> 8 <value>file:/home/master/hadoop/dfs/name</value> 9 </property> 10 <property> 11 <name>dfs.datanode.data.dir</name> 12 <value>file:/home/master/hadoop/dfs/data</value> 13 </property> 14 <property> 15 <name>dfs.replication</name> 16 <value>3</value> 17 </property> 18 <property> 19 <name>dfs.webhdfs.enabled</name> 20 <value>true</value> 21 </property> 22 </configuration>
tip:
1)第二、三個節點里的value值,是在步驟二創建的另外兩個工作目錄
2)還有個節點value值是3,代表目前我搭建的是由三台機器組成的集群。
6、vi ~/work/hadoop/etc/hadoop/mapred-site.xml
1 <configuration> 2 <property> <name>mapreduce.framework.name</name> 3 <value>yarn</value> 4 </property> 5 <property> 6 <name>mapreduce.jobhistory.address</name> 7 <value>master:10020</value> 8 </property> 9 <property> 10 <name>mapreduce.jobhistory.webapp.address</name> 11 <value>master:19888</value> 12 </property> 13 </configuration>
沒有什么可說的,copy自網絡,且不需要修改。
7、vi ~/work/hadoop/etc/hadoop/yarn-site.xml
1 <configuration> 2 <property> 3 <name>yarn.nodemanager.aux-services</name> 4 <value>mapreduce_shuffle</value> 5 </property> 6 <property> 7 <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> 8 <value>org.apache.hadoop.mapred.ShuffleHandler</value> 9 </property> 10 <property> 11 <name>yarn.resourcemanager.address</name> 12 <value>master:8032</value> 13 </property> 14 <property> 15 <name>yarn.resourcemanager.scheduler.address</name> 16 <value>master:8030</value> 17 </property> 18 <property> 19 <name>yarn.resourcemanager.resource-tracker.address</name> 20 <value>master:8031</value> 21 </property> 22 <property> 23 <name>yarn.resourcemanager.admin.address</name> 24 <value>master:8033</value> 25 </property> 26 <property> 27 <name>yarn.resourcemanager.webapp.address</name> 28 <value>master:8088</value> 29 </property> 30 </configuration>
Ctrl+C+V即可。
至此,主要配置工作已經完成,如果說,其他機器還要重復步驟一到步驟三,相信會直接崩潰,想想吧,大公司那幾千台的機器。
幸好,咱們有跨機器拷貝方案:
scp ~/work/hadoop master@slave1:~/work/
scp ~/work/hadoop master@slave2:~/work/
兩個命令搞定,是不是很簡單?
后續我們在修改各種配置文件的時候,都可以考慮使用這個命令。
四、接下來要逐台機器配置環境變量,也就是PATH
vi /etc/enviroment (這個單詞太長,記不住,只要輸入到en的時候按Tab,就會自動補全了)
在打開的編輯器中,PATH值結尾處,加上如下內容:
/home/master/work/hadoop/bin:/home/master/work/hadoop/sbin

再提醒一句,是每台機器都執行,貌似還可以用這個方式來做這個工作:
PATH=“$PATH”:/home/master/work/hadoop/bin:/home/master/work/hadoop/sbin
五、收獲的季節來了,開始驗證:
tip:以下步驟只需要在mater機器執行。
1、格式化文件系統hdfs:這個相信Hadoop實戰這本書誤導了每一個新手:
原命令是:bin/Hadoop NameNode -format
執行直接報錯:
Error: Could not find or load main class NameNode
其實就是大小寫沒處理好,如下命令正確:
bin/hadoop namenode -format
2、啟動:/bin/start-all.sh
如果你真按這個命令來,那就中招了。
吐槽一下,是我買的這本書太老呢還是Hadoop變化太快?
現在,大部分命令都在/sbin里面,崩潰不?
所以,要在這個目錄下執行啟動命令:
sbin/star-all.sh
執行這個命令,會提醒過時還是什么的,那么也可以按他建議的來執行,無傷大雅:
sbin/start-dfs.sh
3、檢查是否成功
看着是都起來了,不過在驗證的時候,出現了問題:
http://localhost:50030打不開,目前沒找到原因,有人說是不使用這個端口了,但是現在尚未看到官方的東西,不能下結論。
http://localhost:50070可以打開頁面
4、看來靠這種方式驗證不是很靠譜,於是查到用下列方式:jps命令(建議啟動后執行一次這個檢查)
如果你執行jps提示沒有,那是因為你的jdk替換了系統原有的jdk,路徑變了,而這個變化沒在PATH里維護,所以,不是想在哪都能執行成功的,兩種使用方式:
1)、進到jdk安裝目錄下執行:jps
2)、配置PATH:PATH=“$PATH”/usr/lib/jvm/jdk1.8.0_60/bin
推薦這個,會麻煩一次,以后各種方便,其中$PATH 后的內容是我的jdk安裝路徑。
共有6個服務。
再次在master執行jps,得到以下結果:
3937 NameNode
4778 NodeManager
4300 SecondaryNameNode
5119 Jps
在slave1,和slave2分別執行jps,得到以下結果:
5158 DataNode
5243 Jps
至此,折騰了好久好久的安裝學習,終於大功告成,必須慶祝下,晚上去小酌一杯!
以下是安裝過程驗證中遇到的一個問題,僅作參考,不一定每個人都能遇到:
排查解決步驟:
1)http://localhost:50070 可以看到一些狀態、日志
a.Overview:是dfs的健康狀態。
b.Utilities下的Logs:查看Hadoop啟動及運行的日志
2015-09-02 01:17:37,962 WARN org.apache.hadoop.hdfs.server.common.Storage: java.io.IOException: Incompatible clusterIDs in /usr/local/hadoop/data1: namenode clusterID = CID-c7970b3b-e127-4054-ba7b-7736183904d2; datanode clusterID = CID-4b42cd9e-35ec-4194-b516-d4de4055c35b
2015-09-02 01:17:37,977 INFO org.apache.hadoop.hdfs.server.common.Storage: Lock on /usr/local/hadoop/data2/in_use.lock acquired by nodename 6889@ubuntu
2015-09-02 01:17:37,978 WARN org.apache.hadoop.hdfs.server.common.Storage: org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /usr/local/hadoop/data2 is in an inconsistent state: cluster Id is incompatible with others.
2015-09-02 01:17:37,980 FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for Block pool <registering> (Datanode Uuid unassigned) service to localhost/127.0.0.1:9000. Exiting.
java.io.IOException: All specified directories are failed to load.
at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:477)
at org.apache.hadoop.hdfs.server.datanode.DataNode.initStorage(DataNode.java:1387)
at org.apache.hadoop.hdfs.server.datanode.DataNode.initBlockPool(DataNode.java:1352)
at org.apache.hadoop.hdfs.server.datanode.BPOfferService.verifyAndSetNamespaceInfo(BPOfferService.java:316)
at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.connectToNNAndHandshake(BPServiceActor.java:228)
at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.run(BPServiceActor.java:852)
at java.lang.Thread.run(Thread.java:745)
提醒連個cid不一致,原因是Hadoop啟動后,在使用格式化namenode,會導致datanode和namenode的clusterID不一致
這個ID的位置這么找:
先找到/etc/hadoop/hdfs-site.xml
里面有datanode的路徑,在那個路徑下找:/current/VERSION文件,即可修改clusterID
我是這樣處理的,我把配置文件改為完全按教程的要求,如下,也消除了上面的錯誤:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
執行jps
顯示正常了:
root@ubuntu:/usr/lib/jvm/jdk1.8.0_60/bin# jps
8736 NameNode
9141 ResourceManager
9926 DataNode
8983 SecondaryNameNode
10156 Jps
10125 GetConf
更詳細的驗證當前的各個服務的狀態方法:
http://www.aboutyun.com/thread-7712-1-1.html
tip:
重新格式化重啟后,發現namenode啟動失敗
再次格式化,再次重啟,發現所有datanode啟動失敗
解決辦法:
1、刪除了步驟二創建的文件夾里產生的內容,具體是dfs/data里的內容
2、刪除了日志文件
不清楚原因,初步估計是第1步起了作用,后續繼續觀察。
