Hadoop開發過程中所遇到的那些坑
核心內容:
1、Hadoop開發過程中常見問題即解決方案
在Hadoop開發的過程中,我們總是遇到各種各樣的問題,今天就整理總結一下:
***的解決方案:6個檢查+具體日志
在Hadoop開發的過程中如果遇到各種異常,首先使用jps命令查看節點的啟動是否正常,然后在去查看相關的日志文件,但是在查看相關日志之前,你可以先檢查一下面幾點:
1、防火墻原因:檢查各個節點的防火墻是否關閉成功。(重點是檢查NameNode)
2、檢查IP地址與主機名的映射關系是否綁定成功
3、檢查NameNode是否處于安全模式
4、檢查NameNode是否已經進行了格式化處理
5、檢查配置文件的配置是否成功
6、檢查NameNode節點和DataNode節點中存放的namespaceID的版本號是否相同
好的,當我們查看完上述6點之后如果還沒有解決問題,那我們再去查看相關的日志文件即可。
OK,到現在為止我在給大家介紹一下在開發過程中經常遇到的幾個異常問題:
1、啟動hadoop時沒有NameNode的可能原因
這個問題對于Hadoop的初學者是經常遇到的,之所以出現這個問題,可能有3點原因:
1)、NameNode沒有進行格式化處理(6個檢查以包括)
先刪除hadoop.tmp.dir所對應的目錄(即logs和tmp),然后對NameNode進行格式化處理
2)、檢查IP地址與主機名的映射關系是否綁定成功(6個檢查以包括)
3)、檢查配置文件的配置是否成功(6個檢查以包括),重點是hadoop-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml和slaves。
2、Name node is in safe mode.
例如:
原因:NameNode在剛開始啟動的時候會進入到安全模式,倒計時30s后退出,在安全模式下會不能進行增、刪、改操作,只能進行查看操作。但是如果數據節點DataNode丟失的block塊達到一定比例的話則系統一直處于安全模式,即只讀狀態。
解決方法:
1)、在HDFS的配置文件hdfs-site.xml中,修改dfs.safemode.threshold.pct所對應的數值,將其數值改成一個較小的數值,默認的數值是0.999f。
2)、執行命令 hadoop dfsadmin -safemode leave 強制NameNode離開安全模式。(6個檢查以包括)
3)、could only be replicatied to 0 nodes, instead of 1.
例如:
這個異常可能出現的現象:執行命令jps顯示的進程都很正常,但是用web界面查看的話,顯示的live nodes為0,這說明數據節點DataNode沒有正常啟動,但是數據節點DataNode又正常啟動了。
這個問題可能出現的原因:
1)、防火墻原因,檢查所有節點的防火墻是否關閉成功。(6個檢查以包括)
2)、磁盤空間原因:執行命令df -al 查看磁盤空間的使用情況,如果是磁盤空間不足的話,則調整磁盤空間。
如果是磁盤空間不足的話,具體進行下面的步驟在進行查看:
3、如果上述方法都不行的話,可用以下方法進行處理(但是該方法會造成數據的丟失,所以慎用!)
先刪除hadoop.tmp.dir所對應的目錄,然后對NameNode重新進行格式化處理。(6個檢查以包括)
4、啟動時報錯 java.net.UnknownHostException
原因:集群中的主機名沒有映射到相應的IP地址(6個檢查以包括)
解決方法:在/etc/hosts文件中添加所有節點的主機名與IP地址的映射關系。
5、TaskTracker進程啟動了,但是DataNode進程沒有啟動
解決方法:先刪除hadoop.tmp.dir所對應的文件夾,然后對NameNode重新進行格式化處理。
6、java.lang.OutOfMemoryError
原因分析:出現這個異常,明顯是JVM內存不足的原因,要修改所有數據節點DataNode所對應的JVM內存大小。
方法:在MapReduce的配置文件mapred-site.xml中,修改mapred.child.java.opts所對應的數值。
注意:一般JVM的***內存使用應該為總內存大小的一半,例如我們的服務器的內存大小為4G,則設置為2048m,但是這個值可能依舊不是***的數值。其中
-Xms 表示內存初始化的大小,-Xmx表示能夠使用的***內存。
在linux 下查看服務器內存的硬件信息:
7、Incompatible namespaceIDs in
原因分析:每次對NameNode格式化之后都會產生一個新的namespaceID,如果多次對NameNode格式化的話可能導致NameNode節點和DataNode節點中存放的版本號不一致。
解決方法:
1)、在NameNode節點和DataNode節點中檢查namespaceID的版本號是否相同,如果不相同的話,修改為相同的值后然后重新啟動該節點。(6個檢查以包括)
2)、先刪除hadoop.tmp.dir所對應的目錄,然后對NameNode重新進行格式化處理。(6個檢查以包括)
上面這些就是我在開發過程中經常遇到的一些問題,希望對大家有所幫助。