Hadoop從偽分布式到真正的分布式


對這兩天學習hadoop的一個總結,概念就不提了。直接說部署的事,關於如何部署hadoop網上的資料很多, 比較經典的還是Tim在IBM developworks上的系列文章
可能是大牛在寫文章的時候把一些常識性的東西給省略了。使我這樣的菜鳥在照貓畫虎的時候費了不少周章,下面慢慢說吧。首先是真實分布式系統的架構:
Hadoop 主從節點分解
主從模式的架構是比較常見的。如果要做水平擴展,通過添加從節點就可以實現計算能力與存儲能力擴容。但要實現這樣的部署模式還需要做幾件事:
以下所有的命令和配置都是在Ubuntu上操作的,不同的Linux系統或許有些許的區別
1. 創建單機的hadoop模板,參考: http://www.ibm.com/developerworks/cn/linux/l-hadoop-1/index.html。這里唯一需要注意的是一些坑,如創建用戶與組,設置臨時目錄等。這些大牛的文章里都沒寫,但還是要配置的。以下是坑列表:
搭建一個偽分布式的hadoop環境,遇到的第一個問題是JAVA_HOME沒設置。Hadoop是用Java開發的,所以對Java的環境依賴比較嚴重。所以需要先配置一下Java。

Oracle JDK和Open JDK都可以。唯一需要注意的是Oracle JDK已經不被Ubuntu的官方repository支持了,安裝麻煩些。Open JDK直接執行: sudo apt-get install openjdk-6-jdk

安裝完后,要設置JAVA_HOME的環境變量:
sudo gedit /etc/environment
然后添加
CLASSPATH=./:/usr/lib/jvm/java-6-openjdk/lib
JAVA_HOME=/usr/lib/jvm/java-6-openjdk
PATH添加:/usr/lib/jvm/java-6-openjdk
或者
修改hadoop-env.sh文件,添加export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-amd64/

遇到的第二個問題是hadoop運行權限的問題,hadoop默認的namenode服務是不允許以root用戶運行的,所以必須新建一個用戶來運行。命令:
sudo addgroup hadoopgroup
sudo adduser --ingroup hadoop hadoop
sudo chmod +w /etc/sudoers
sudo vim /etc/sudoers
添加配置:
在root ALL=(ALL) ALL后 hadoop ALL=(ALL) ALL使hadoop用戶具有root權限
再運行格式化命令:hadoop-0.20 namenode -format時,又遇到了“Create directory”的錯誤,
問題是cache目錄的權限不對,那么就修改一下權限sudo chown hadoop:hadoopgroup cache

運行 hadoop-0.20 namenode -format,輸出成功信息。

接下來運行hadoop-0.20 fs -ls /遇到了第三個問題連接The authenticity of host can't be 
established 這個問題是因為ssh的設置導致的,通過修改/etc/ssh/ssh_config,在文件尾添加:
StrictHostKeyChecking no
UserKnownHostsFile /dev/null

今天遇到了第四個坑,就是重啟機器后啟動hadoop服務失敗。嘗試着去重新格式化namenode,也失敗。錯誤信息如下:

Format aborted in /home/hadoop/dfs/name

后來查看了一下網上的解決方案,原來是如果要重新格式化namenode必須先將原來的namenode文件夾刪除先。我的路徑是/usr/lib/hadoop-0.20/cache/hadoop/。然后,再重新格式化,重新啟動服務就可以了。還有就是用戶權限的問題,最好的辦法就是將所有與hadoop相關的文件夾權限都設置成hadoop用戶所有。

第五個坑是wordcount程序哪里找。網上和文章里都沒找到大牛的jar文件。經過一番搜索,原來hadoop自帶了一個,那就是在hadoop的安裝目錄下有一個hadoop-examples.jar文件。這個就可以用來統計word。
2. 配置hosts文件,這里就看出了系統的不同之處了。Tim的文章里寫的是這樣
master 192.168.108.133
slave1 192.168.108.134
slave2 192.168.108.135
但是在Ubuntu里應該是這樣:
192.168.108.133   master 
192.168.108.134   slave1 
192.168.108.135   slave2 

3. 配置無密碼登陸從master節點到slave節點,做法是先在master節點上生成空密碼的key,然后拷貝到slave節點上。
ssh-keygen -t rsa 然后一路回車
cat ~/.ssh/id_rsa.pub >> authorized_keys
拷貝authorized_keys文件到slave機器的~/.ssh/文件夾下。這里要注意的是master節點和slave節點都必須是 同名用戶操作,這個用戶也是hadoop的服務用戶。
然后在slave機器上就該文件權限: chmod 644 ~/.ssh/authorized_keys,否則也是不工作的。如果你發現ssh的認證比較慢,請修改/etc/ssh/ssh_config文件,將GSSAPIAuthentication yes改為no。

4. 修改hadoop的配置文件,這個就不詳寫的,大牛的文章里也都有。唯一需要注意的是,創建自己的臨時目錄,並更新到core-site.xml文件中。
<property>
     <name>hadoop.tmp.dir</name>
     <value>/app/hadoop/tmp</value>
</property>
注意,這里的/app/hadoop/tmp目錄必須改成hadoop用戶的權限。

5. 按照大牛文章里面的步驟,格式namenode,啟動hadoop服務。這里要注意的是這些步驟都是在master節點上操作的,因為hadoop是通過可信ssh方式讓master與slave溝通的。這也是為什么要配置無密碼登陸的目的。如果一切順利,恭喜你的第一個分布式大數據計算框架已經搭建成功。
注意:
你可能會跟我一樣犯二的時候,不小心把core-site.xml里面的"fs.default.name"寫錯了。那么你就會得到"Invalid URI for NameNode address"的異常信息。

最后要說的是,上面的架構圖是hadoop 1.0的。2.0現在已經把job tracker給干掉了,由於性能和單點失效的原因,已經換了架構。不過對於初學者來說,1.0就已經夠了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM