1、集羣部署介紹html
1.1 Hadoop簡介java
Hadoop是Apache軟件基金會旗下的一個開源分佈式計算平臺。以Hadoop分佈式文件系統HDFS(Hadoop Distributed Filesystem)和MapReduce(Google MapReduce的開源實現)爲核心的Hadoop爲用戶提供了系統底層細節透明的分佈式基礎架構。node
對於Hadoop的集羣來說,能夠分紅兩大類角色:Master和Salve。一個HDFS集羣是由一個NameNode和若干個DataNode組成的。其中NameNode做爲主服務器,管理文件系統的命名空間和客戶端對文件系統的訪問操做;集羣中的DataNode管理存儲的數據。MapReduce框架是由一個單獨運行在主節點上的JobTracker和運行在每一個從節點的TaskTracker共同組成的。主節點負責調度構成一個做業的全部任 務,這些任務分佈在不一樣的從節點上。主節點監控它們的執行狀況,而且從新執行以前的失敗任務;從節點僅負責由主節點指派的任務。當一個Job被提交時,JobTracker接收到提交做業和配置信息以後,就會將配置信息等分發給從節點,同時調度任務並監控TaskTracker的執行。linux
從上面的介紹能夠看出,HDFS和MapReduce共同組成了Hadoop分佈式系統體系結構的核心。HDFS在集羣上實現分佈式文件系統,MapReduce在集羣上實現了分佈式計算和任務處理。HDFS在MapReduce任務處理過程當中提供了文件操做和存儲等支持,MapReduce在HDFS的基礎上實現了任務的分發、跟蹤、執行等工做,並收集結果,兩者相互做用,完成了Hadoop分佈式集羣的主要任務。apache
1.2 環境說明vim
個人環境是在虛擬機中配置的,Hadoop集羣中包括4個節點:1個Master,2個Salve,節點之間局域網鏈接,能夠相互ping通,節點IP地址分佈以下:安全
虛擬機系統服務器 |
機器名稱網絡 |
IP地址session |
Ubuntu 13.04 |
Master.Hadoop |
192.168.1.141 |
Ubuntu 9.11 |
Salve1.Hadoop |
192.168.1.142 |
Fedora 17 |
Salve2.Hadoop |
192.168.1.137 |
Master機器主要配置NameNode和JobTracker的角色,負責總管分佈式數據和分解任務的執行;3個Salve機器配置DataNode 和TaskTracker的角色,負責分佈式數據存儲以及任務的執行。其實應該還應該有1個Master機器,用來做爲備用,以防止Master服務器宕機,還有一個備用立刻啓用。後續經驗積累必定階段後補上一臺備用Master機器(可經過配置文件修改備用機器數)。
注意:因爲hadoop要求全部機器上hadoop的部署目錄結構要求相同(由於在啓動時按與主節點相同的目錄啓動其它任務節點),而且都有一個相同的用戶名帳戶。參考各類文檔上說的是全部機器都創建一個hadoop用戶,使用這個帳戶來實現無密碼認證。這裏爲了方便,分別在三臺機器上都從新創建一個hadoop用戶。
1.3 環境配置
Hadoop集羣要按照1.2小節表格所示進行配置,下面介紹如何修改機器名稱和配置hosts文件,以方便使用。
注意:個人虛擬機都採用NAT方式鏈接網絡,IP地址是自動分配的,因此這裏就使用自動分配的IP地址而未特意修改成某些IP地址。
(1)修改當前機器名稱
假定咱們發現咱們的機器的主機名不是咱們想要的。
1)在Ubuntu下修改機器名稱
修改文件/etc/hostname裏的值便可,修改爲功後用hostname命令查看當前主機名是否設置成功。
另外爲了能正確解析主機名,最好也修改/etc/hosts文件裏對應的主機名
2)在Fedora下修改機器名稱
經過對"/etc/sysconfig/network"文件修改其中"HOSTNAME"後面的值,改爲咱們規定的名稱。
命令:vi /etc/sysconfig/network,修改以下:
一樣爲了能正確解析主機名,最好也修改/etc/hosts文件裏對應的主機名。
(2)配置hosts文件(必須)
"/etc/hosts"這個文件是用來配置主機將用的DNS服務器信息,是記載LAN內接續的各主機的對應[HostName IP]用的。當用戶在進行網絡鏈接時,首先查找該文件,尋找對應主機名對應的IP地址。
咱們要測試兩臺機器之間知否連通,通常用"ping 機器的IP",若是想用"ping 機器的主機名"發現找不見該名稱的機器(這也就是爲何在修改主機名的同時最好修改該文件中對應的主機名),解決的辦法就是修改"/etc/hosts"這個文件,經過把LAN內的各主機的IP地址和HostName的一一對應寫入這個文件的時候,就能夠解決問題。
例如:機器爲"Master.Hadoop:192.168.1.141"對機器爲"Salve1.Hadoop:192.168.1.142"用命令"ping"記性鏈接測試。測試結果以下:
從上圖中的值,直接對IP地址進行測試,可以ping通,可是對主機名進行測試,發現沒有ping通,提示"unknown host——未知主機",這時查看"Master.Hadoop"的"/etc/hosts"文件內容會發現裏面沒有"192.168.1.142 Slave1.Hadoop"內容,故而本機器是沒法對機器的主機名爲"Slave1.Hadoop" 解析。
在進行Hadoop集羣配置中,須要在"/etc/hosts"文件中添加集羣中全部機器的IP與主機名,這樣Master與全部的Slave機器之間不只能夠經過IP進行通訊,並且還能夠經過主機名進行通訊。因此在全部的機器上的"/etc/hosts"文件中都要添加以下內容:
192.168.1.141 Master.Hadoop
192.168.1.142 Slave1.Hadoop
192.168.1.137 Slave2.Hadoop
如今咱們在進行對機器爲"Slave1.Hadoop"的主機名進行ping通測試,看是否能測試成功。
從上圖中咱們已經能用主機名進行ping通了,說明咱們剛纔添加的內容,在局域網內能進行DNS解析了,那麼如今剩下的事兒就是在其他的Slave機器上進行相同的配置。而後進行測試。
1.4 所需軟件
(1)JDK軟件
下載地址:http://www.oracle.com/technetwork/java/javase/index.html
JDK版本:jdk-7u25-linux-i586.tar.gz
(2)Hadoop軟件
下載地址:http://hadoop.apache.org/common/releases.html
Hadoop版本:hadoop-1.1.2.tar.gz
2、SSH無密碼驗證配置
Hadoop運行過程當中須要管理遠端Hadoop守護進程,在Hadoop啓動之後,NameNode是經過SSH(Secure Shell)來啓動和中止各個DataNode上的各類守護進程的。這就必須在節點之間執行指令的時候是不須要輸入密碼的形式,故咱們須要配置SSH運用無密碼公鑰認證的形式,這樣NameNode使用SSH無密碼登陸並啓動DataName進程,一樣原理,DataNode上也能使用SSH無密碼登陸到 NameNode。
注意:若是你的Linux沒有安裝SSH,請首先安裝SSH
Ubuntu下安裝ssh:sudo apt-get install openssh-server
Fedora下安裝ssh:yum install openssh-server
2.1 SSH基本原理和用法
1)SSH基本原理
SSH之因此可以保證安全,緣由在於它採用了公鑰加密。過程以下:
(1)遠程主機收到用戶的登陸請求,把本身的公鑰發給用戶。
(2)用戶使用這個公鑰,將登陸密碼加密後,發送回來。
(3)遠程主機用本身的私鑰,解密登陸密碼,若是密碼正確,就贊成用戶登陸。
2)SSH基本用法
假如用戶名爲java,登陸遠程主機名爲linux,以下命令便可:
$ ssh java@linux
SSH的默認端口是22,也就是說,你的登陸請求會送進遠程主機的22端口。使用p參數,能夠修改這個端口,例如修改成88端口,命令以下:
$ ssh -p 88 java@linux
注意:若是出現錯誤提示:ssh: Could not resolve hostname linux: Name or service not known,則是由於linux主機未添加進本主機的Name Service中,故不能識別,須要在/etc/hosts裏添加進該主機及對應的IP便可:
linux 192.168.1.107
2.2 配置Master無密碼登陸全部Salve
1)SSH無密碼原理
Master(NameNode | JobTracker)做爲客戶端,要實現無密碼公鑰認證,鏈接到服務器Salve(DataNode | Tasktracker)上時,須要在Master上生成一個密鑰對,包括一個公鑰和一個私鑰,然後將公鑰複製到全部的Slave上。當Master經過SSH鏈接Salve時,Salve就會生成一個隨機數並用Master的公鑰對隨機數進行加密,併發送給Master。Master收到加密數以後再用私鑰解密,並將解密數回傳給Slave,Slave確認解密數無誤以後就容許Master進行鏈接了。這就是一個公鑰認證過程,其間不須要用戶手工輸入密碼。
2)Master機器上設置無密碼登陸
a. Master節點利用ssh-keygen命令生成一個無密碼密鑰對。
在Master節點上執行如下命令:
ssh-keygen –t rsa –P ''
運行後詢問其保存路徑時直接回車採用默認路徑。生成的密鑰對:id_rsa(私鑰)和id_rsa.pub(公鑰),默認存儲在"/home/用戶名/.ssh"目錄下。
查看"/home/用戶名/"下是否有".ssh"文件夾,且".ssh"文件下是否有兩個剛生產的無密碼密鑰對。
b. 接着在Master節點上作以下配置,把id_rsa.pub追加到受權的key裏面去。
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
查看下authorized_keys的權限,若是權限不對則利用以下命令設置該文件的權限:
chmod 600 authorized_keys
c. 用root用戶登陸修改SSH配置文件"/etc/ssh/sshd_config"的下列內容。
檢查下面幾行前面」#」註釋是否取消掉:
RSAAuthentication yes # 啓用 RSA 認證
PubkeyAuthentication yes # 啓用公鑰私鑰配對認證方式
AuthorizedKeysFile %h/.ssh/authorized_keys # 公鑰文件路徑
設置完以後記得重啓SSH服務,才能使剛纔設置有效。
退出root登陸,使用普通用戶驗證是否設置成功。
從上圖中得知無密碼登陸本級已經設置完畢,接下來的事兒是把公鑰複製所
有的Slave機器上。
注意:有時候在測試時可能會出現錯誤: Agent admitted failure to sign using the key.解決辦法是:ssh-add ~/.ssh/id_rsa ,以下所示:
d.使用ssh-copy-id命令將公鑰傳送到遠程主機上(這裏以Slave1.Hadoop爲例)。
e. 測試是否無密碼登陸其它機器成功。
到此爲止,咱們通過5步已經實現了從"Master.Hadoop"到"Slave1.Hadoop"SSH無密碼登陸,下面就是重複上面的步驟把剩餘的兩臺(Slave2.Hadoop和Slave3.Hadoop)Slave服務器進行配置。這樣,咱們就完成了"配置Master無密碼登陸全部的Slave服務器"。
接下來配置全部Slave無密碼登陸Master,其和Master無密碼登陸全部Slave原理同樣,就是把Slave的公鑰追加到Master的".ssh"文件夾下的"authorized_keys"中,記得是追加(>>)。
注意:期間可能會出現一些問題以下:
(1)若是在ssh鏈接時出現錯誤「ssh:connect to host port 22: Connection refused」,以下圖所示:
則多是由於遠程登陸的那臺機器沒有安裝ssh服務或安裝了沒有開啓ssh服務,下面到Slave3.Hadoop主機進行測試:
爲了一勞永逸,設置系統啓動時開啓服務:# systemctl enable sshd.service
(2)若是在用命令ssh-copy-id時發現找不到該命令「ssh-copy-id:Command not found」,則多是ssh服務的版本過低的緣由,好比若你的機器是Redhat系統就可能該問題,解決辦法是:手動複製本地的pubkey內容到遠程服務器,命令以下:
cat ~/.ssh/id_rsa.pub | ssh hadoop@Master.Hadoop 'cat >> ~/.ssh/authorized_keys'
該命令等價於下面兩個命令:
①在本地機器上執行:scp ~/.ssh/id_rsa.pub hadoop@Master.Hadoop:/~
②到遠程機器上執行:cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
3、Java環境安裝
全部的機器上都要安裝JDK,如今就先在Master服務器安裝,而後其餘服務器按照步驟重複進行便可。安裝JDK以及配置環境變量,須要以"root"的身份進行。
3.1 安裝JDK
首先用root身份登陸"Master.Hadoop"後在"/usr"下建立"java"文件夾,再將"jdk-7u25-linux-i586.tar.gz"複製到"/usr/java"文件夾中,而後解壓便可。查看"/usr/java"下面會發現多了一個名爲"jdk1.7.0_25"文件夾,說明咱們的JDK安裝結束,刪除"jdk-7u25-linux-i586.tar.gz"文件,進入下一個"配置環境變量"環節。
3.2 配置環境變量
(1)編輯"/etc/profile"文件
編輯"/etc/profile"文件,在後面添加Java的"JAVA_HOME"、"CLASSPATH"以及"PATH"內容以下:
# set java environment
export JAVA_HOME=/usr/java/jdk1.7.0_25/
export JRE_HOME=/usr/java/jdk1.7.0_25/jre
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
或者
# set java environment
export JAVA_HOME=/usr/java/jdk1.7.0_25/
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
以上兩種意思同樣,那麼咱們就選擇第1種來進行設置。
(2)使配置生效
保存並退出,執行下面命令使其配置當即生效。
source /etc/profile 或 . /etc/profile
3.3 驗證安裝成功
配置完畢並生效後,用下面命令判斷是否成功。
java -version
從上圖中得知,咱們肯定JDK已經安裝成功。
3.4 安裝剩餘機器
這時用普通用戶hadoop經過scp命令格式把"/usr/java/"文件複製到其餘Slave上面,剩下的事兒就是在其他的Slave服務器上按照上圖的步驟配置環境變量和測試是否安裝成功,這裏以Slave1.Master爲例:
scp -r /usr/java seed@Slave1.Master:/usr/
注意:有的機器庫函數版本較低,可能安裝不了高版本的JDK,好比有些Redhat9,此時不能夠選擇較低版本的JDK進行安裝,由於全部集羣中的JDK版本必須相同(通過測試),有兩種方法可解決:一是放棄該機器,選用另外一臺能裝該版本的JDK的機子;二是選擇低版本的JDK,在全部機器上從新安裝。
4、Hadoop集羣安裝
全部的機器上都要安裝hadoop,如今就先在Master服務器安裝,而後其餘服務器按照步驟重複進行便可。安裝和配置hadoop須要以"root"的身份進行。
4.1 安裝hadoop
首先用root用戶登陸"Master.Hadoop"機器,將下載的"hadoop-1.1.2.tar.gz"複製到/usr目錄下。而後進入"/usr"目錄下,用下面命令把"hadoop-1.1.2.tar.gz"進行解壓,並將其重命名爲"hadoop",把該文件夾的讀權限分配給普通用戶hadoop,而後刪除"hadoop-1.0.0.tar.gz"安裝包。
cd /usr
tar –xzvf hadoop-1.1.2.tar.gz
mv hadoop-1.1.2 hadoop
chown –R hadoop:hadoop hadoop #將文件夾"hadoop"讀權限分配給hadoop普通用戶
rm -rf hadoop-1.1.2.tar.gz
最後在"/usr/hadoop"下面建立tmp文件夾,並把Hadoop的安裝路徑添加到"/etc/profile"中,修改"/etc/profile"文件,將如下語句添加到末尾,並使其生效(. /etc/profile):
# set hadoop path
export HADOOP_HOME=/usr/hadoop
export PATH=$PATH :$HADOOP_HOME/bin
4.2 配置hadoop
(1)配置hadoop-env.sh
該"hadoop-env.sh"文件位於"/usr/hadoop/conf"目錄下。
在文件中修改下面內容:
export JAVA_HOME=/usr/java/jdk1.7.0_25
Hadoop配置文件在conf目錄下,以前的版本的配置文件主要是Hadoop-default.xml和Hadoop-site.xml。 因爲Hadoop發展迅速,代碼量急劇增長,代碼開發分爲了core,hdfs和map/reduce三部分,配置文件也被分紅了三個core- site.xml、hdfs-site.xml、mapred-site.xml。core-site.xml和hdfs-site.xml是站在 HDFS角度上配置文件;core-site.xml和mapred-site.xml是站在MapReduce角度上配置文件。
(2)配置core-site.xml文件
修改Hadoop核心配置文件core-site.xml,這裏配置的是HDFS master(即namenode)的地址和端口號。
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/hadoop/tmp</value>
(備註:請先在 /usr/hadoop 目錄下創建 tmp 文件夾)
<description>A base for other temporary directories.</description>
</property>
<!-- file system properties -->
<property>
<name>fs.default.name</name>
<value>hdfs://192.168.1.141:9000</value>
</property>
</configuration>
備註:如沒有配置hadoop.tmp.dir參數,此時系統默認的臨時目錄爲:/tmp/hadoo-hadoop。而這個目錄在每次重啓後都會被刪掉,必須從新執行format才行,不然會出錯。
(3)配置hdfs-site.xml文件
修改Hadoop中HDFS的配置,配置的備份方式默認爲3。
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
(備註:replication 是數據副本數量,默認爲3,salve少於3臺就會報錯)
</property>
<configuration>
(4)配置mapred-site.xml文件
修改Hadoop中MapReduce的配置文件,配置的是JobTracker的地址和端口。
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>http://192.168.1.141:9001</value>
</property>
</configuration>
(5)配置masters文件
有兩種方案:
(1)第一種
修改localhost爲Master.Hadoop
(2)第二種
去掉"localhost",加入Master機器的IP:192.168.1.141
爲保險起見,啓用第二種,由於萬一忘記配置"/etc/hosts"局域網的DNS失效,這樣就會出現意想不到的錯誤,可是一旦IP配對,網絡暢通,就能經過IP找到相應主機。
(6)配置slaves文件(Master主機特有)
有兩種方案:
(1)第一種
去掉"localhost",每行添加一個主機名,把剩餘的Slave主機名都填上。
例如:添加形式以下:
Slave1.Hadoop
Slave2.Hadoop
(2)第二種
去掉"localhost",加入集羣中全部Slave機器的IP,也是每行一個。
例如:添加形式以下
192.168.1.142
192.168.1.137
緣由和添加"masters"文件同樣,選擇第二種方式。
如今在Master機器上的Hadoop配置就結束了,剩下的就是配置Slave機器上的Hadoop。
最簡單的方法是將 Master上配置好的hadoop所在文件夾"/usr/hadoop"複製到全部的Slave的"/usr"目錄下(實際上Slave機器上的slavers文件是沒必要要的, 複製了也沒問題)。用下面命令格式進行。(備註:此時用戶能夠爲普通用戶也能夠爲root)
scp -r /usr/hadoop root@服務器IP:/usr/
例如:從"Master.Hadoop"到"Slave1.Hadoop"複製配置Hadoop的文件。
scp -r /usr/hadoop root@Slave1.Hadoop:/usr/
以root用戶進行復制,固然無論是用戶root仍是普通用戶,雖然Master機器上的"/usr/hadoop"文件夾用戶hadoop有權限,可是Slave1上的hadoop用戶卻沒有"/usr"權限,因此沒有建立文件夾的權限。因此不管是哪一個用戶進行拷貝,右面都是"root@機器 IP"格式。由於咱們只是創建起了普通用戶的SSH無密碼鏈接,因此用root進行"scp"時,扔提示讓你輸入"Slave1.Hadoop" 服務器用戶root的密碼。
查看"Slave1.Hadoop"服務器的"/usr"目錄下是否已經存在"hadoop"文件夾,確認已經複製成功。查看結果以下:
從上圖中知道,hadoop文件夾確實已經複製了,可是咱們發現hadoop權限是root,因此咱們如今要給"Slave1.Hadoop"服務器上的用戶hadoop添加對"/usr/hadoop"讀權限。
以root用戶登陸"Slave1.Hadoop",執行下面命令。
chown -R hadoop:hadoop(用戶名:用戶組) hadoop(文件夾)
接着在"Slave1 .Hadoop"上修改"/etc/profile"文件,將如下語句添加到末尾,並使其有效(source /etc/profile):
# set hadoop environment
export HADOOP_HOME=/usr/hadoop
export PATH=$PATH :$HADOOP_HOME/bin
若是不知道怎麼設置,能夠查看前面"Master.Hadoop"機器的"/etc/profile"文件的配置,到此爲止在一臺Slave機器上的Hadoop配置就結束了。剩下的事兒就是照葫蘆畫瓢把剩餘的幾臺Slave機器進行部署Hadoop。
4.3 啓動及驗證
(1)格式化HDFS文件系統
在"Master.Hadoop"上使用普通用戶hadoop進行操做。(備註:只需一次,下次啓動再也不須要格式化,只需 start-all.sh)
hadoop namenode -format
從上圖中知道咱們已經成功格式化了,可是美中不足就是出現了一個警告,從網上得知這個警告並不影響hadoop執行,可是也有辦法解決,詳情看後面的"常見問題FAQ"。
(2)啓動hadoop
在啓動前關閉集羣中全部機器的防火牆,否則會出現datanode開後又自動關閉。使用下面命令啓動。
start-all.sh
能夠經過如下啓動日誌看出,首先啓動namenode 接着啓動datanode1,datanode2,…,而後啓動secondarynamenode。再啓動jobtracker,而後啓動tasktracker1,tasktracker2,…。
啓動 hadoop成功後,在 Master 中的 tmp 文件夾中生成了 dfs 文件夾,在Slave 中的 tmp 文件夾中均生成了 dfs 文件夾和 mapred 文件夾。
(3)驗證hadoop
(1)驗證方法一:用"jps"命令
在Master上用 java自帶的小工具jps查看進程。
在Slave2上用jps查看進程。
若是在查看Slave機器中發現"DataNode"和"TaskTracker"沒有起來時,先查看一下日誌的,若是是"namespaceID"不一致問題,採用"常見問題FAQ6.2"進行解決,若是是"No route to host"問題,採用"常見問題FAQ6.3"進行解決。
(2)驗證方式二:用"hadoop dfsadmin -report"
用這個命令能夠查看Hadoop集羣的狀態。
4.4 網頁查看集羣
(1)訪問"http://192.168.1.141:50030"
(2)訪問"http://192.168.1.142:50070"
5、常見問題FAQ
5.1 關於 Warning: $HADOOP_HOME is deprecated.
hadoop安裝完以後敲入hadoop命令時,老是提示這個警告:
Warning: $HADOOP_HOME is deprecated.
經查hadoop-1.1.2/bin/hadoop腳本和"hadoop-config.sh"腳本,發現腳本中對HADOOP_HOME的環境變量設置作了判斷,其實根本不須要設置HADOOP_HOME環境變量。
解決方案一:編輯"/etc/profile"文件,去掉HADOOP_HOME的變量設定,從新輸入hadoop fs命令,警告消失。
解決方案二:編輯"/etc/profile"文件,添加一個環境變量,以後警告消失:
export HADOOP_HOME_WARN_SUPPRESS=1
5.2 解決"no datanode to stop"問題
當我中止Hadoop時發現以下信息:
no datanode to stop
緣由:每次namenode format會從新建立一個namenodeId,而tmp/dfs/data下包含了上次format下的id,namenode format清空了namenode下的數據,可是沒有清空datanode下的數據,致使啓動時失敗,有兩種解決方案:
第一種解決方案以下:
1)先刪除"/usr/hadoop/tmp"
rm -rf /usr/hadoop/tmp
2)建立"/usr/hadoop/tmp"文件夾
mkdir /usr/hadoop/tmp
3)刪除"/tmp"下以"hadoop"開頭文件
rm -rf /tmp/hadoop*
4)從新格式化hadoop
hadoop namenode -format
5)啓動hadoop
start-all.sh
使用第一種方案,有種很差處就是原來集羣上的重要數據全沒有了。假如說Hadoop集羣已經運行了一段時間。建議採用第二種。
第二種方案以下:
1)修改每一個Slave的namespaceID使其與Master的namespaceID一致。
或者
2)修改Master的namespaceID使其與Slave的namespaceID一致。
該"namespaceID"位於"/usr/hadoop/tmp/dfs/name/current/VERSION"文件中,前面藍色的可能根據實際狀況變化,但後面紅色通常是不變的。
例如:查看"Master"下的"VERSION"文件
本人建議採用第二種,這樣方便快捷,並且還能防止誤刪。
5.3 Slave服務器中datanode啓動後又自動關閉
查看日誌發下以下錯誤。
ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Call to ... failed on local exception: java.net.NoRouteToHostException: No route to host
解決方案是:關閉防火牆
5.4 從本地往hdfs文件系統上傳文件
出現以下錯誤:
INFO hdfs.DFSClient: Exception in createBlockOutputStream java.io.IOException: Bad connect ack with firstBadLink
INFO hdfs.DFSClient: Abandoning block blk_-1300529705803292651_37023
WARN hdfs.DFSClient: DataStreamer Exception: java.io.IOException: Unable to create new block.
解決方案是:
1)關閉防火牆
2)禁用selinux
編輯 "/etc/selinux/config"文件,設置"SELINUX=disabled"
5.5 安全模式致使的錯誤
出現以下錯誤:
org.apache.hadoop.dfs.SafeModeException: Cannot delete ..., Name node is in safe mode
在分佈式文件系統啓動的時候,開始的時候會有安全模式,當分佈式文件系統處於安全模式的狀況下,文件系統中的內容不容許修改也不容許刪除,直到安全模式結束。安全模式主要是爲了系統啓動的時候檢查各個DataNode上數據塊的有效性,同時根據策略必要的複製或者刪除部分數據塊。運行期經過命令也能夠進入安全模式。在實踐過程當中,系統啓動的時候去修改和刪除文件也會有安全模式不容許修改的出錯提示,只須要等待一下子便可。
解決方案是:關閉安全模式
hadoop dfsadmin -safemode leave
5.6 解決Exceeded MAX_FAILED_UNIQUE_FETCHES
出現錯誤以下:
Shuffle Error: Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-out
程序裏面須要打開多個文件,進行分析,系統通常默認數量是1024,(用ulimit -a能夠看到)對於正常使用是夠了,可是對於程序來說,就太少了。
解決方案是:修改2個文件。
1)"/etc/security/limits.conf"
vi /etc/security/limits.conf
加上:
soft nofile 102400
hard nofile 409600
2)"/etc/pam.d/login"
vim /etc/pam.d/login
添加:
session required /lib/security/pam_limits.so
針對第一個問題我糾正下答案:
這是reduce預處理階段shuffle時獲取已完成的map的輸出失敗次數超過上限形成的,上限默認爲5。引發此問題的方式可能會有不少種,好比網絡鏈接不正常,鏈接超時,帶寬較差以及端口阻塞等。一般框架內網絡狀況較好是不會出現此錯誤的。
5.7 解決"Too many fetch-failures"
出現這個問題主要是結點間的連通不夠全面。
解決方案是:
1)檢查"/etc/hosts"
要求本機ip 對應服務器名
要求要包含全部的服務器ip +服務器名
2)檢查".ssh/authorized_keys"
要求包含全部服務器(包括其自身)的public key
5.8 處理速度特別的慢
出現map很快,可是reduce很慢,並且反覆出現"reduce=0%"。
解決方案以下:
結合解決方案5.7,而後修改"conf/hadoop-env.sh"中的"export HADOOP_HEAPSIZE=4000"
5.9 解決hadoop OutOfMemoryError問題
出現這種異常,明顯是jvm內存不夠得緣由。
解決方案以下:要修改全部的datanode的jvm內存大小。
Java –Xms 1024m -Xmx 4096m
通常jvm的最大內存使用應該爲總內存大小的一半,咱們使用的8G內存,因此設置爲4096m,這一值可能依舊不是最優的值。