一.在root下進行格式化
這樣很糟糕
這樣的話,若是第一次裝的話,我的建議是將生成的文件都刪掉,恢復到最開始的狀態,
1. 首先你需要刪除
vi conf/hdfs-site.xml 配置文件的dfs.name.dir和dfs.data.di的路徑位置,我的是:/home/hadoop/dfs
故為:rm -rf /home/hadoop/dfs
2.其次你需要刪除
vi conf/mapred-site.xml 文件中的mapred.system.dir 的文件位置:
<value>/home/hadoop/mapreduce/system</value>
故將其進行刪除: rm -rf /home/hadoop/mapreduce
3.然后你的將tmp 下的hadoop文件刪除
先轉換為root下:
su root
輸入密碼
rm -rf /tmp/hadoop*
4. 重復上面的1、2、3 ,在你要配置的每個Linus的虛擬機上都執行一遍
5.完成后,回到master上,
切換為hadoop用戶 : su hadoop
保證是hadoop用戶,后
在執行格式化: hadoop namenode -format
執行啟動集群: start-all.sh
完成后 查看進程:jps
總共為6個,OK 你的集群配置就好了!
二.容易范的錯誤:
1. 在 root 用戶下啟動命令“ ./start-all.sh”,會造成文件權限被修改,需要重新設置權限:更改
被 root 用戶變更權限的文件:
/opt/hadoop/name/current 所有文件改為 hadoop 用戶
/opt/hadoop/hadoop-1.2.1/logs 所有文件權限改為 hadoop 用戶
/opt/hadoop/name 下的 in_use.lock 文件刪除掉
2. 在配置xml文件的時候,
<property>
<name>mapred.local.dir</name>
<value>/home/hadoop/mapreduce/local</value>
<value></value>之間中不能有空格,否則弄了半天,卻不清楚是為啥,調試不通過,十分痛苦,
因而不能有空格
三.hadoop無法正常啟動-localhost:50060無法打開localhost:50070無法打開
最近接觸大數據,開始學習hadoop,在自己電腦上搭建了偽分布的環境之后,關機的時候沒有關閉hadoop環境,再次開機重新啟動服務的時候發現只有jobTracker可以啟動,剩下的都啟動不了了,在瀏覽器中打開localhost:50030/可以打開,但是localhost:50060/和localhost:50070無法打開,上網各種查,終於解決了問題,正好打算開始寫自己的博客,就以這個問題開始吧。
其實這主要是因為多次個格式化namenode引起的
在/tmp/下生成了多個文件,並且在hsperfdata_hadoop文件夾下生成了多個ID,其中有一個是沒用的(和上層目錄下hadoop_namenode.pid不同的那個).趕緊刪掉它吧,然后再次格式化,重啟服務,一切OK~~
四. Browse the filesystem鏈接打不開
現象:在訪問Master:50070之后,點擊browse the filesystem后,該頁無法顯示。
原因:點擊browse the filesystem后,網頁轉向的地址用的是hadoop集群的某一個datanode的主機名,由於客戶端的瀏覽器無法解析這個主機名,因此該頁無法顯示。
解決:需要在客戶端的hosts文件里加入hadoop集群的ip地址與對應的主機名,這樣就能解決問題了。
五 解決"no datanode to stop"問題
當我停止Hadoop時發現如下信息:
原因:每次namenode format會重新創建一個namenodeId,而tmp/dfs/data下包含了上次format下的id,namenode format清空了namenode下的數據,但是沒有清空datanode下的數據,導致啟動時失敗,所要做的就是每次fotmat前,清空tmp一下的所有目錄。
第一種解決方案如下:
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/data/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
解決方案是:關閉防火牆
service iptables stop
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)關閉防火牆
service iptables stop
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"
vim /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,這一值可能依舊不是最優的值。
5.10 Namenode in safe mode
解決方案如下:
bin/hadoop dfsadmin -safemode leave
5.11 IO寫操作出現問題
0-1246359584298, infoPort=50075, ipcPort=50020):Got exception while serving blk_-5911099437886836280_1292 to /172.16.100.165:
java.net.SocketTimeoutException: 480000 millis timeout while waiting for channel to be ready for write. ch : java.nio.channels.SocketChannel[connected local=/
172.16.100.165:50010 remote=/172.16.100.165:50930]
at org.apache.hadoop.net.SocketIOWithTimeout.waitForIO(SocketIOWithTimeout.java:185)
at org.apache.hadoop.net.SocketOutputStream.waitForWritable(SocketOutputStream.java:159)
……
It seems there are many reasons that it can timeout, the example given in HADOOP-3831 is a slow reading client.
解決方案如下:
在hadoop-site.xml中設置dfs.datanode.socket.write.timeout=0
5.12 status of 255 error
錯誤類型:
java.io.IOException: Task process exit with nonzero status of 255.
at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:424)
錯誤原因:
Set mapred.jobtracker.retirejob.interval and mapred.userlog.retain.hours to higher value. By default, their values are 24 hours. These might be the reason for failure, though I'm not sure restart.
解決方案如下:單個datanode
如果一個datanode 出現問題,解決之后需要重新加入cluster而不重啟cluster,方法如下:
bin/hadoop-daemon.sh start datanode
bin/hadoop-daemon.sh start jobtracker