大數據Hadoop常見異常處理,初學的你要看看
在學習Hadoop的過程中,時常會報出異常,對於初學者而言,常見的異常情況可以通過一些技術手段進行調試和解決。同時,筆者也提醒大家,在配置文件和編寫程序的過程中也要細心,盡量少出錯,以免耽誤自己的寶貴時間。
hadoop啟動不正常
用瀏覽器訪問namenode的50070埠,不正常,需要診斷問題出在哪裡:
第一步:在伺服器的終端命令行使用jps查看相關進程
(namenode1個節點 datanode3個節點 secondary namenode1個節點)
第二步:如果已經知道了啟動失敗的服務進程,進入到相關進程的日誌目錄下,查看日誌,分析異常的原因
1) 配置文件出錯,saxparser exception; ——找到錯誤提示中所指出的配置文件檢查修改即可
2) unknown host——主機名不認識,配置/etc/hosts文件即可,或者是配置文件中所用主機名跟實際不一致(註:在配置文件中,建議使用主機名,而不要用ip地址)
3)directory 訪問異常—— 檢查namenode的工作目錄,看許可權是否正常
start-dfs.sh啟動後,發現有datanode啟動不正常
第一步:查看datanode的日誌,看是否有異常,如果沒有異常,手動將datanode啟動起來sbin/hadoop-daemon.sh start datanode
第二步:很有可能是slaves文件中就沒有列出需要啟動的datanode
第三步:排除上述兩種情況後,基本上,能在日誌中看到異常信息:
1、配置文件
2、ssh免密登陸沒有配置好
3、datanode的身份標識跟namenode的集群身份標識不一致
(刪掉datanode的工作目錄)
hadoop datanode節點超時時間設置
datanode進程死亡或者網路故障造成datanode無法與namenode通信,namenode不會立即把該節點判定為死亡,要經過一段時間,這段時間暫稱作超時時長。HDFS默認的超時時長為10分鐘+30秒。如果定義超時時間為timeout,則超時時長的計算公式為:
timeout = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval。
而默認的heartbeat.recheck.interval 大小為5分鐘,dfs.heartbeat.interval默認為3秒。
需要注意的是hdfs-site.xml 配置文件中的heartbeat.recheck.interval的單位為毫秒,dfs.heartbeat.interval的單位為秒。所以,舉個例子,如果heartbeat.recheck.interval設置為5000(毫秒),dfs.heartbeat.interval設置為3(秒,默認),則總的超時時間為40秒。
hdfs-site.xml中的參數設置格式:
<property>
<name>heartbeat.recheck.interval</name>
<value>2000</value>
</property>
<property>
<name>dfs.heartbeat.interval</name>
<value>1</value>
</property>
HDFS冗餘數據塊的自動刪除
在日常維護hadoop集群的過程中發現這樣一種情況:
某個節點由於網路故障或者DataNode進程死亡,被NameNode判定為死亡,HDFS馬上自動開始數據塊的容錯拷貝;當該節點重新添加到集群中時,由於該節點上的數據其實並沒有損壞,所以造成了HDFS上某些block的備份數超過了設定的備份數。通過觀察發現,這些多餘的數據塊經過很長的一段時間才會被完全刪除掉,那麼這個時間取決於什麼呢?
該時間的長短跟數據塊報告的間隔時間有關。Datanode會定期將當前該結點上所有的BLOCK信息報告給Namenode,參數dfs.blockreport.intervalMsec就是控制這個報告間隔的參數。
hdfs-site.xml文件中有一個參數:
<property>
<name>dfs.blockreport.intervalMsec</name>
<value>3600000</value>
<description>Determines block reporting interval in milliseconds.</description>
</property>
其中3600000為默認設置,3600000毫秒,即1個小時,也就是說,塊報告的時間間隔為1個小時,所以經過了很長時間這些多餘的塊才被刪除掉。通過實際測試發現,當把該參數調整的稍小一點的時候(60秒),多餘的數據塊確實很快就被刪除了。
namenode安全模式問題
當namenode發現集群中的block丟失數量達到一個閥值時,namenode就進入安全模式狀態,不再接受客戶端的數據更新請求
在正常情況下,namenode也有可能進入安全模式:
集群啟動時(namenode啟動時)必定會進入安全模式,然後過一段時間會自動退出安全模式(原因是datanode彙報的過程有一段持續時間)
也確實有異常情況下導致的安全模式
原因:block確實有缺失
措施:可以手動讓namenode退出安全模式,bin/hdfs dfsadmin -safemode leave
或者:調整safemode門限值: dfs.safemode.threshold.pct=0.999f
ntp時間服務同步問題
第一種方式:同步到網路時間伺服器
# ntpdate time.windows.com
將硬體時間設置為當前系統時間。
#hwclock –w
加入crontab:
30 8 * * * root /usr/sbin/ntpdate 192.168.0.1; /sbin/hwclock -w 每天的8:30將進行一次時間同步。
重啟crond服務:
service crond restart
第二種方式:同步到區域網內部的一台時間同步伺服器
一、搭建時間同步伺服器
1、編譯安裝ntp server
rpm -qa | grep ntp
若沒有找到,則說明沒有安裝ntp包,從光碟上找到ntp包,使用
rpm -Uvh ntp***.rpm
進行安裝
2、修改ntp.conf配置文件
vi /etc/ntp.conf
①、第一種配置:允許任何IP的客戶機都可以進行時間同步
將「restrict default nomodify notrap noquery」這行修改成:
restrict default nomodify notrap
配置文件示例:/etc/ntp.conf
②、第二種配置:只允許192.168.23.***網段的客戶機進行時間同步
在restrict default nomodify notrap noquery(表示默認拒絕所有IP的時間同步)之後增加一行:
restrict 192.168.23.0 mask 255.255.255.0 nomodify notrap
3、啟動ntp服務
service ntpd start
開機啟動服務
chkconfig ntpd on
4、ntpd啟動後,客戶機要等幾分鐘再與其進行時間同步,否則會提示「no server suitable for synchronization found」錯誤。
二、配置時間同步客戶機
手工執行 ntpdate <ntp server> 來同步
或者利用crontab來執行
crontab -e
0 21 * * * ntpdate 192.168.23.22 >> /root/ntpdate.log 2>&1
每天晚上9點進行同步
如果需要更多大數據資料,請關注公眾號:程序員交流學習
推薦閱讀:
※大數據計數原理1+0=1這你都不會算(五)No.55
※大數據計數原理1+0=1這你都不會算(四)No.52
※大數據計數原理1+0=1這你都不會算(九)No.64
※三個月成為大數據工程師,你需要具備哪些條件?
※扯個關於大數據的淡
TAG:大數據 |