Hbase故障處理彙總及評註


Hbase故障處理彙總及評註


1.啟動故障
1、如果啟動hbase集群出現regionserver無法啟動,日誌報告如下類似錯誤時,說明是集群的時間不同步,只需要同步即可解決。
FATAL org.apache.hadoop.hbase.regionserver.HRegionServer: ABORTING region server 10.210.78.22,60020,1344329095415: Unhandled exceptio
n: org.apache.hadoop.hbase.ClockOutOfSyncException: Server 10.210.78.22,60020,1344329095415 has been rejected; Reported time is too far out of sync with mast
er. Time difference of 90358ms > max allowed of 30000ms
org.apache.hadoop.hbase.ClockOutOfSyncException: org.apache.hadoop.hbase.ClockOutOfSyncException: Server 10.210.78.22,60020,1344329095415 has been rejected;
Reported time is too far out of sync with master. Time difference of 90358ms > max allowed of 30000ms
……
Caused by: org.apache.hadoop.ipc.RemoteException: org.apache.hadoop.hbase.ClockOutOfSyncException: Server 10.210.78.22,60020,1344329095415 has been rejected;
Reported time is too far out of sync with master. Time difference of 90358ms > max allowed of 30000ms
只需要執行一下這條命令即可同步國際時間:
/usr/sbin/ntpdate tick.ucla.edu tock.gpsclock.com ntp.nasa.gov timekeeper.isi.edu usno.pa-x.dec.com;/sbin/hwclock –systohc > /dev/null
評註:
對於時間不同步,只要是集群都會出現問題,比較經常遇到問題的,比如zookeeper等。時間保持同步即可。
2、無法啟動hbase,regionserver log裡會有這樣的錯誤,zookeeper也有初始化問題的錯誤
FATAL org.apache.hadoop.hbase.regionserver.HRegionServer: ABORTING region server 10.210.70.57,60020,1340088145399: Initialization of RS failed. Hence aborting RS.
因為之前安裝配置的時候是好好的,中間經歷過強行kill daemon的過程,又是報錯初始化問題,所以估計是有緩存影響了,所以清理了tmp裡的數據,然後發現HRegionServer依然無法啟動,不過還好的是zookeeper啟動了,一怒之下把hdfs裡的hbase數據也都清理了,同時再清理tmp,檢查各個節點是否有殘留hbase進程,kill掉,重啟hbase,然後這個世界都正常了。


評註:
上面適合非生產情況,如果我們學習可以採用上面的方式來推斷錯誤,也就是上面是因為數據異常導致了HRegionServer有問題。這個裡面肯定有其他錯誤,面對錯誤,我們不要指盯著一個錯誤,去想解決辦法,我們要多看日誌,找到幾處錯誤,去排除,那個是被引發的錯誤,哪個是是本質的錯誤,也就是引起集群產生其他錯誤的根源。找到這個,我們就有了更好的解決辦法。
3、無法啟動reginserver daemon,報錯如下:
Exception in thread “main” java.lang.RuntimeException: Failed construction of Regionserver: class org.apache.hadoop.hbase.regionserver.HRegionServer

Caused by: java.net.BindException: Problem binding to /10.210.70.57:60020 : Cannot assign requested address
解決辦法:
根據錯誤提示,檢查ip對應的機器是否正確,如果出錯機器的ip正確,檢查60020端口是否被佔用。
評註:
對於端口的暫用,是比較容易解決的。如不熟悉,可以參考
大數據集群【hadoop、hbase、spark、hive,zookeeper、storm等】故障排除之端口詳解
https://www.aboutyun.com/forum.php?mod=viewthread&tid=21051
4、Hbase未正常關閉啟動報錯
org.apache.hadoop.hbase.NotServingRegionException: Region is not online
解決方法:可先通過hbase hbck進行檢查是否正常,一般會提示不一致(INCONSISTENT),一般方法為通過命令:hbase hbck -fix修復。修復成功狀態為OK。

評註:
由於Hbase是基於Hadoop,是Hadoop Hbase的簡寫,因此Hbase是基於Hadoop的數據庫,集群如出現副本減少,不健康等,都可以通過修復命令來解決。

關於Hbase hbck用法


opts通用可選項
-help 展示help信息;
-detail 展示所有Region的詳情;
-timelag 處理在過去的指定時間內沒有發生過元數據更新的region;
-sleepBeforeRerun 在執行-fix指令後時睡眠指定的時間後再檢查fix是否生效;
-summary 只打印表和狀態的概要信息;
-metaonly 只檢查hbase:meta表的狀態;
-sidelineDir <hdfs> 備份當前的元數據到HDFS上;
-boundaries 校驗META表和StoreFiles的Region邊界是否一致;元數據修復選項
在不確定的情況下,慎用以下指令。
-fix 嘗試修復Region的分配,通常用於向後兼容;
-fixAssignments 嘗試修復Region的分配,用來替換-fix指令;
-fixMeta 嘗試修復元數據問題;這裡假設HDFS上的region信息是正確的;


-noHdfsChecking 不從HDFS加載/檢查Region信息;這裡假設hbase:meta表中的Region信息是正確的,不會在檢查或修復任何HDFS相關的問題,如黑洞(hole)、孤島(orphan)或是重疊(overlap);
-fixHdfsHoles 嘗試修復HDFS中的Region黑洞;
-fixHdfsOrphans 嘗試修復hdfs中沒有.regioninfo文件的region目錄;
-fixTableOrphans 嘗試修復hdfs中沒有.tableinfo文件的table目錄(只支持在線模式);
-fixHdfsOverlaps 嘗試修復hdfs中region重疊的現象;
-fixVersionFile 嘗試修復hdfs中hbase.version文件缺失的問題;
-maxMerge 在修復region重疊的現時,允許merge最多個region(默認n等於5);
-sidelineBigOverlaps 在修復region重疊問題時,允許暫時擱置重疊量較大的部分;
-maxOverlapsToSideline 在修復region重疊問題時,允許一組裡暫時擱置最多n個region不處理(默認n等於2);
-fixSplitParents 嘗試強制將下線的split parents上線;
-ignorePreCheckPermission 在執行檢查時忽略文件系統權限;
-fixReferencesFiles 嘗試下線引用斷開(lingering reference)的StoreFile;
-fixEmptyMetaCells 嘗試修復hbase:meta表中沒有引用到任何region的entry(REGIONINFO_QUALIFIER為空的行)。Datafile修復選項
專業命令,慎用。
-checkCorruptHFiles 檢查所有HFile —— 通過逐一打開所有的HFile來確定其是否可用;
-sidelineCorruptHFiles 隔離損壞的HFile。該指令中包含-checkCorruptHFiles操作。
Meta修復快捷指令
-repair 是以下指令的簡寫:-fixAssignments -fixMeta -fixHdfsHoles -fixHdfsOrphans
-fixHdfsOverlaps -fixVersionFile -sidelineBigOverlaps -fixReferenceFiles -fixTableLocks
-fixOrphanedTableZnodes;
-repairHoles 是以下指令的簡寫:-fixAssignments -fixMeta -fixHdfsHoles。Table lock選項
-fixTableLocks 刪除已持有超過很長時間的table lock((hbase.table.lock.expire.ms配置項,默認值為10分鐘)。Table Znode選項
-fixOrphanedTableZnodes 如果表不存在,則將其在zookeeper中ZNode狀態設置為disabled。


hadoop fsck 命令詳解


https://www.aboutyun.com/forum.php?mod=viewthread&tid=4869
5、Load Balancer is notenabled
解決方法如下:
進入hbase shell,再輸入如下指令即可
hbase(main):001:0> balance_switch true
false
0 row(s) in 0.3590 seconds
評註:
balance_switch true 開啟自動balance


balance_switch false 關閉自動balance


注意:開啟或關閉自動 balance, 返回的是之前的狀態,不是當前狀態。
6、Compression Link Errors
因為LZO壓縮算法需要在集群中的每臺機器都要安裝,這是一個啟動失敗的常見錯誤。如果你獲得瞭如下信息
11/02/20 01:32:15 ERROR lzo.GPLNativeCodeLoader: Could not load native gpl library
java.lang.UnsatisfiedLinkError: no gplcompression in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1734)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1028)

就意味著你的壓縮庫出現了問題。
解決辦法:
1.沒有拷貝lzo本地庫到相應目錄造成的
在目錄/opt/modules/hadoop/hadoop-1.0.2/lib/native/Linux-i386-32下需要有libhadoop*.so和libgplcompression*.so庫。
-rw-r--r--. 1 hadoop hadoop 76938 Sep 30 18:17 libgplcompression.a
-rw-rw-r--. 1 hadoop hadoop 1140 Sep 30 18:17 libgplcompression.la
-rwxrwxr-x. 1 hadoop hadoop 59229 Sep 30 18:17 libgplcompression.so
-rwxrwxr-x. 1 hadoop hadoop 59229 Sep 30 18:17 libgplcompression.so.0
-rwxrwxr-x. 1 hadoop hadoop 59229 Sep 30 18:17 libgplcompression.so.0.0.0
-rw-rw-r--. 1 hadoop hadoop 301066 Jul 15 05:40 libhadoop.a
-rw-rw-r--. 1 hadoop hadoop 873 Jul 15 05:40 libhadoop.la
-rw-rw-r--. 1 hadoop hadoop 199000 Jul 15 05:40 libhadoop.so
-rw-rw-r--. 1 hadoop hadoop 199000 Jul 15 05:40 libhadoop.so.1
-rw-rw-r--. 1 hadoop hadoop 199000 Jul 15 05:40 libhadoop.so.1.0.0
2.沒有正常設置LD_LIBRARY_PATH
<property>
<name>mapred.child.env/<name>
<value>LD_LIBRARY_PATH=/opt/modules/hadoop/hadoop-1.0.2/lib/native/Linux-i386-32/<value>
/<property>
在mapred-site.xml 配置裡需要配置本地庫路徑。


linux共享庫位置配置,Java程序在啟動時系統初始化java.library.path屬性。
LD_LIBRARY_PATH環境變量主要是用於指定動態鏈接器(ld)查找ELF可執行文件運行時所依賴的動態庫(so)的路java.library.path徑,其內容是以冒號分隔的路徑列表。ld鏈接器將優先在該變量設置的路徑中查找,若未找到則在標準庫路徑/lib和/usr/lib中繼續搜索。
所以有幾種方式來設置LD_LIBRARY_PATH,第一是環境變量,第二是更改/etc/ld.so.conf 文件。
評註:
上面我們只是知道了解決辦法,更深層的其實我們可以瞭解下什麼是本地庫。


推薦參考


Hadoop本地庫介紹及相關問題解決方法彙總


https://www.aboutyun.com/forum.php?mod=viewthread&tid=7175


7. datanodeCaused by: java.lang.IllegalArgumentException: java.net.UnknownHostException: bonree
錯誤原因:
hdfs以nameservice的方式提供服務,然後在hbase.rootdir屬性配置的就是那個nameservice。在hbase啟動regionserver時,錯誤的把nameservice解析成了host,然後報錯。


解決辦法:
ln -s ${HADOOP_HOME}/etc/hadoop/hdfs-site.xml ${HBASE_HOME}/conf/hdfs-site.xml
或者這樣解決:在hbase-env.sh中HBASE_CLASSPATH的值設置為絕對路徑

評註:
dfs.nameservices為集群的名字,當有1個以上namenode時候使用。
8、重啟機房服務器後,用./start-hbase.sh啟動HBase後,執行hbase shell,出現如下情況
[root@localhost bin]# hbase shell
HBase Shell; enter 'help<return>' for list of supported commands.
Version: 0.20.6, rUnknown, Thu Oct 28 19:02:04 CST 2010
hbase(main):001:0> list
NativeException: org.apache.hadoop.hbase.MasterNotRunningException: null
解決步驟:
1、啟動hadoop後,需要等一段時間,再開啟hbase
2、去掉hadoop的安全模式:
hadoop dfsadmin -safemode leave
3、把/etc/hosts裡的master01的IP改為服務器當前的IP
4、確認hbase的hbase-site.xml中
<name>hbase.rootdir/<name>
<value>hdfs://localhost:8020/hbase/<value>
與hadoop的core-site.xml中
<name>fs.default.name/<name>
<value>hdfs://localhost:8020/<value>
紅字部分保持一致
5、確認hadoop版本與hbase版本兼容
6、重新執行./start-hbase.sh之前,先kill掉當前的hbase和zookeeper進程
評註:
Hbase由於基於Hadoop,因此首先要啟動Hadoop,保障Hadoop是正常的,然後在啟動Hbase。/<return>


對於Hadoop與Hbase版本兼容,可參考


hadoop,hbase,hive,zookeeper版本整合兼容性最全,最詳細說明【適用於任何版本】


https://www.aboutyun.com/forum.php?mod=viewthread&tid=18015
9、集群關閉了,換了一個新的版本。然後就發現集群再也起不來了。



master起不來,regionserver倒是啟動了。
java.io.IOException: Call to namenodename:9000 failed on local exception: java.io.EOFException
解決辦法:

出現這種問題主要原因是:hbase中的hadoop-core的jar和hadoop的不兼容,導致連不上hdfs。
故用hadoop的hadoop-core.jar文件替換hbase的hadoop-core.jar文件。修改完以後啟動正常~~~



評註:
很多錯誤,都是因為我們對版本兼容不瞭解導致的,推薦參考
鏈接:http://pan.baidu.com/s/1dFyYR3F 密碼:yq9u
2.運行故障



1.執行hbase程序orshell命令出現如下提示:



SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/hbase-0.92.1/lib/slf4j-log4j12-1.5.8.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/hadoop-1.0.3/lib/slf4j-log4j12-1.4.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
是因為hbase和hadoop裡都有這個jar包,選擇其一移除即可。
評註:
包衝突,也是比較常見的,而且這個錯誤也比較明顯。很多老鐵在查找錯誤的時候,只是看到了(error)錯誤,而沒有去看這個是什麼錯誤。所以面對一些非常明顯的問題,依然不知道怎麼解決。所以面對錯誤的時候,無論我們是什麼水平,只要你在學習,就要嘗試的去看懂,到底是什麼錯誤。


2.執行hbase的mapreduce作業,有些節點無任何報錯正常執行,有些節點總報類似Status : FAILED java.lang.NullPointerException的錯誤



查看tasktracker的log日誌有如下錯誤:
WARN org.apache.zookeeper.ClientCnxn: Session 0×0 for server null, unexpected error, closing socket connection and attempting reconnect

caused by java.net.ConnectException: Connection refused
官方對這個錯誤給了說明,
Errors like this… are either due to ZooKeeper being down, or unreachable due to network issues.
當初配置zookeeper時只說儘量配置奇數節點防止down掉一個節點無法選出leader,現在看這個問題貌似所以想執行任務的節點都必須配置zookeeper啊。
評註:
對於Hbase我們儘量在Hbase節點上都按照zookeeper,不至於產生一些意外情況。
3、報告找不到方法異常,但是報告的函數並非自己定義的,也並沒有調用這樣的函數,類似信息如下:
java.lang.RuntimeException: java.lang.NoSuchMethodException: com.google.hadoop.examples.Simple$MyMapper.()
at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:45)
at org.apache.hadoop.mapred.MapRunner.configure(MapRunner.java:32)
at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:53)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:209)
at org.apache.hadoop.mapred.TaskTracker$Child.main(TaskTracker.java:1210)
Caused by: java.lang.NoSuchMethodException: com.google.hadoop.examples.Simple$MyMapper.()
at java.lang.Class.getConstructor0(Class.java:2705)


at java.lang.Class.getDeclaredConstructor(Class.java:1984)
at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:41)
… 4 more
網上找到解決方法如下:
This is actually the() function. The display on the web page doesn’t translate into html, but dumps plain text, sois treated as a (nonexistant) tag by your browser. This function is created as a default initializer for non-static classes. This is most likely caused by having a non-static Mapper or Reducer class. Try adding the static keyword to your class declaration, ie:
意思是缺少static關鍵字~添加上即可。如下:
public static class MyMapper extends MapReduceBase implements Mapper {…}



評註:
系統存在這樣的問題的時候還是比較少的,一般都會出一些補丁,對於出現的一些異常,一般都會在新版本中得到解決。所以大家儘量關注一些新的知識。可以節省我們大量的時間。
4、使用mapreduce程序寫HFile操作hbase時,可能會有這樣的錯誤:
java.lang.IllegalArgumentException: Can’t read partitions file

Caused by: java.io.IOException: wrong key class: org.apache.hadoop.io.*** is not class org.apache.hadoop.hbase.io.ImmutableBytesWritable
這裡需要注意的是無論是map還是reduce作為最終的輸出結果,輸出的key和value的類型應該是:< ImmutableBytesWritable, KeyValue> 或者< ImmutableBytesWritable, Put>。改成這樣的類型就行了。



評註:
Hadoop是有MapReduce的,Hbase其實也是可以有的。我們引入相關包後,即刻實現Hbase MapReduce。


推薦參考


淘寶之HBase MapReduce實例分析


https://www.aboutyun.com/forum.php?mod=viewthread&tid=7072
5. java.net.ConnectionException:拒絕鏈接



可能導致該問題的原因及解決方法:
1. 去zookeeper conf/zoo.cfg配置文件查看。這裡有兩個目錄:一個是數據目錄dataDir,一個是日誌目錄dataLogDir,使用cd命令,能不能進入這兩個目錄下面,如果可以進去,就證明無誤。如果提示: 沒有那個文件或目錄,就使用mkdir命令創建這兩個文件夾即可



2.vim /etc/hosts 查看主機名配置是否正確。如果使用和配置有誤,進行修改。



3.使用上述辦法不能解決——關閉防火牆。
centOS6使用chkconfig iftables off 永久關閉防火牆
service iptables stop 臨時關閉防火牆
centOS7 默認的使用firewall作為防火牆
關閉firewall:
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall開機啟動
firewall-cmd --state #查看默認防火牆狀態(關閉後顯示notrunning,開啟後顯示running)


4.防火牆已經關閉,問題還沒有解決,有可能是賬戶的問題,不妨切換賬戶試一下。
端口號的問題: zookeeper默認的端口號是2181,但不是所有的都是使用這個端口號!
去 hbase-site.xml裡面查看:
<property>
<name>hbase.zookeeper.property.clientPort/<name>
<value>4180/<value>
<description>Property from ZooKeeper's config zoo.cfg.
The port at which the clients will connect.
/<description>
/<property>
改變代碼裡面設置的端口號,問題得到解決!!



5.一個最坑的可能原因就是集群節點的時間不同步,hbase,和zookeeper對時間的要求很高!!好像是誤差要在180s。最好的方式就是對整個集群配置時鐘同步,或者是使用date命令為每個節點修改時間。



6.以上方案都嘗試過,問題仍然不能解決,就重啟hbase,和zookeeper試試吧!zookeeper如果上次沒有被正常關閉的話,很容易影響到下一次的使用



評註:
以上只是其中的解決方案,如果能按照上面的方法解決,那算是幸運的,如果不能解決也說正常的,很多情況,因為環境不同,所以出現問題的根本原因是不同的。最重要的還是能找到根本的錯誤,排除干擾錯誤,這樣問題得到解決。



6.windows下開發HBase應用程序,HBase部署在linux環境中,在運行調試時可能會出現無法找到主機,類似異常信息如下:



java.net.UnknownHostException: unknown host: gp-node02



解決辦法如下:



在C:\\WINDOWS\\system32\\drivers\\etc\\hosts文件中添加如下信息:
在linux 的 /etc/hosts也要添加該行信息
192.168.137.139 gp-node02



評註:
其實這個也是網絡問題的一種,無論是開發,還是集群搭建,當我們換機器訪問的時候,我們需要配置下hosts,如果不配置,就只能使用ip地址訪問。


7.執行MapReduce遇到的問題:文件租約超期異常.



org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException
DataNode上有如下信息:IOE:java.io.IOException: xceiverCount 2049 exceeds the limit of concurrent xcievers 2048



原因:
1.執行操作的時候某文件被刪的,避免方式:別同時寫一個文件
2.dfs.datanode.max.xcievers參數到達上限,增大dfs.datanode.max.xcievers參數值
評註:
dfs.datanode.max.xcievers 對於datanode來說,就如同linux上的文件句柄的限制,當datanode 上面的連接數操作配置中的設置時,datanode就會拒絕連接。
8、所有節點region server進程掛掉,hbase不可訪問,查看日誌有如下信息:



java.net.SocketException: Too many open files



解決辦法:

修改ulimit 值為8192,在master 節點上執行$hbase_home/bin/start-hbase.sh 重啟所有節點上的region server,服務恢復.



評註:
在搭建集群的過程中,我們的準備工作中,都需要修改下句柄,防止出現類似問題。


推薦參考


hbase 0.96整合到hadoop2.2三個節點全分佈式安裝高可靠文檔


https://www.aboutyun.com/forum.php?mod=viewthread&tid=7746
9、HMaster啟動之後馬上掛掉
查看日誌裡面報錯信息如下:
2015-10-14 17:48:29,476 FATAL [master:hbase1:60000] master.HMaster: Unhandled exception. Starting shutdown.
org.apache.hadoop.hbase.util.FileSystemVersionException: HBase file layout needs to be upgraded. You have version null and I want version 8. Consult http://hbase.apache.org/book.html for further information about upgrading HBase. Is your hbase.rootdir valid? If so, you may need to run 'hbase hbck -fixVersionFile'.
at org.apache.hadoop.hbase.util.FSUtils.checkVersion(FSUtils.java:600)


at org.apache.hadoop.hbase.master.MasterFileSystem.checkRootDir(MasterFileSystem.java:462)
at org.apache.hadoop.hbase.master.MasterFileSystem.createInitialFileSystemLayout(MasterFileSystem.java:153)
at org.apache.hadoop.hbase.master.MasterFileSystem.<init>(MasterFileSystem.java:129)
at org.apache.hadoop.hbase.master.HMaster.finishInitialization(HMaster.java:800)
at org.apache.hadoop.hbase.master.HMaster.run(HMaster.java:605)
at java.lang.Thread.run(Thread.java:744)
解決方案 1:
試過了很多方法,最終通過在hdfs中,刪除hbase的目錄,然後重啟hbase master 解決
那麼,hbase的目錄是哪一個呢?在 : $HBASE_HOME/conf/hbase-site.xml裡面配置,通常為/hbase
<property>
<name>hbase.rootdir/<name>
<value>/hbase/<value>
/<property>
解決方案 2:/<init>



查看目錄



bin/hadoop fs -ls /hbase



發現/hbase/hbase.version已經消失了,原來是之前的這個文件可能被損壞了,去/lost+found目錄找確實能找到,但是這個文件似乎出了問題,-ls它也看不到。做以下操作:



bin/hadoop fs -mv /hbase /hbase.bk



重啟HBase,這時就生成了/hbase/hbase.version文件,然後:



bin/hadoop fs -cp /hbase/hbase.version /hbase.bk/
bin/hadoop fs -rmr /hbase
bin/hadoop fs -mv /hbase.bk /hbase



這樣再次重啟HBase,發現Hbase開始splitting hlogs,數據得以恢復
評註:
上面是兩種解決辦法,一個可以在學習環境下,一個是在生產環境下。一個問題解決辦法其實有多個,我們如果在有能力的情況,能細緻的解決問題,這樣可以讓我們學習,獲取更多的知識。



10、regionserver 頻繁掛掉的故障



首先regionserver頻繁爆出兩類錯誤:

wal.FSHLog: Error syncing, request close of WAL:



以及出現錯誤:

org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException: Failed 293 actions: NotServingRegionException: 42 times



以及出現regionserver dead 故障:

Region server exiting java.lang.RuntimeException: HRegionServer Aborted



可能導致該問題的原因及解決方法:

tickTime超時:我們的HBase 並沒有設置tickTime,最終hbase與zk的會話最大超時時間並不是zookeeper.session.timeout參數決定的,而是有zk的maxSessionTimeout決定。zk會根據minSessionTimeout與maxSessionTimeout兩個參數重新調整最後的超時值,minSessionTimeout=2*tickTime, maxSessionTimeout=20*tickTime。我們的大數據集群,zk的tickTime設置為默認值(2000ms)2秒,因此,最終hbase 與 zk的超時時間就為40秒。經過調整zk的tickTime為6秒,相應的zookeeper.session.timeout為120秒,最終解決regionserver 頻繁掛掉的故障。



評註:
關於超時時間,確實很多人遇到過,特別是zookeeper的相關問題。有時候我們需要弄清楚配置之間的關係,才能搞明白,到底是哪個配置起了作用。



3.操作故障



1、創建表格失敗,提示信息如下:



org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient permissions for user 'mingtong' (action=create)
可能導致該問題的原因及解決方法:
1. linux最常見的權限問題即當前使用的賬戶沒有建表權限——用權限更高的賬戶對該用戶進行賦權
2.另一個可能就是namespace命名空間的限制:也就是說只有按照ns的格式來創建表格,例如: create 'nc_table:table','info'(注意: nc_table是一個已經存在的nc)
評註:
權限問題是最常見的,但也是新手最常犯的,我們在複製,黏貼,移動文件,安裝配置集群的時候,涉及權限的地方,都需要核實下。


2、運行hbase shell 輸入 list,等基本語句報錯



ERROR: Can't get master address from ZooKeeper; znode data == null



可能原因:



1. 時間不同步, hbase集群所有莫名其妙的問題都有可能是時間不同步導致的!!!一定要注意!!



2. hbase-site.xml裡面的hbase.rootdir對應的ip與core-site.xml中的fs.defaultFS中的路徑不同,或者是與hdfs文件系統的端口號不一致!



評註:
上面是zookeeper常見錯誤,上面只是解決辦法之一,同時上面其實只是錯誤之一,或則說是被其它錯誤引發的,所以我們遇到問題的時候,首先要綜合排查錯誤,然後找到根本錯誤,然後解決問題。
3. 表名找不見的問題


org.apache.hadoop.hbase.TableNotFoundException: ns_wangyou.simu_out_GuangXi
可能導致該問題的原因及解決方法:
這個問題很明顯是查詢的hbase數據庫裡面沒有相應的表名導致的。檢查輸入的表名是否正確, 如果正確的話,去創建相應的表即可。
評註:
上面其實是非常簡單的錯誤,可是還是很多新手,遇到後不知所措。遇到錯誤,我們最基本的,可以見文知意,翻譯出來自然之道是什麼原因。
4. 類找不見的問題!(自己寫的類找不見的問題!)
出現該問題的情形: hbase和hadoop的hdfs,mapreduce整合使用的時候:
18/04/16 18:25:06 INFO mapreduce.JobSubmitter: Cleaning up the staging area /user/mingtong/.staging/job_1522546194099_223330
Exception in thread "main" java.lang.RuntimeException: java.lang.ClassNotFoundException: Class mastercom.cn.bigdata.util.hadoop.mapred.CombineSmallFileInputFormat not found
經過各種測試,最終將問題定位在:這一行代碼:
Configuration conf = HBaseConfiguration.create();
只要你的configuration使用的是hbase的,而且後面mapReduce的job用到這個conf,就會報這個問題!



解決方法:
乖乖的使用 Configuration conf = new Configuration(); 來創建conf吧。但是這種方法創建的conf,不會去加載hbase-site.xml配置文件,hbase-site.xml裡面重要的參數需要手動set!!否則就無法正確的連接到Hbase!


由於上面介紹的問題還會引發下面的報錯:
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException): No lease on /wangyou/mingtong/mt_wlyh/Data/hbase_bulkload/output/4503/inin (inode 1964063475): File does not exist. Holder DFSClient_NONMAPREDUCE_-769553346_1 does not have any open files.
按照上述方法改進後,該問題就得到解決!



評註:
對於上面也是我們剛接觸開發時候,所遇到的,還可以在代碼中,設置相關配置項。
5、 與hbase相關jar包找不到的問題



Error:java.lang.ClassNotFoundException:org.apache.hadoop.hbase.client.ConnectionFactory
可能導致該問題的原因及解決方法:



1. 打jar包的時候直接把相應的jar包打進來,這樣能夠解決問題,但是jar包會有200多M

2. 在執行jar包前執行 export HADOOP_CLASSPATH=$HBASE_HOME/lib/*:classpath,簡單有效,但是如果創建hbase連接的操作是在map,reduce裡,這種方法依然會報錯


3. 在hadoop-env.sh裡面,引入hbase的lib目錄:操作如下:
exportHADOOP_CLASSPATH=$HBASE_HOME/lib/*:$HADOOP_CLASSPATH,所有的節點都要修改,修改完後要重啟集群
4. 將$HBASE_HOME/lib目錄下的jar包導入到$HADOOP_HOME/lib目錄下,但這樣很容易引起jar包衝突,不推薦
評註:
一個問題可能有多個方法,對於找不到類其實方法多種,上面多個方法的核心,都是能夠讓我們找到相關類。
6、.jdk版本衝突的問題



java.lang.UnsupportedClassVersionError: PR/Sort : Unsupported major.minor version 52.0
可能導致該問題的原因及解決方法:
很簡單,使用集群裡對應的jdk版本編譯就好了。右鍵項目-->BuildPath -->Configure Build Path --> Java Compiler --->將版本調整成為集群裡面對應的版本即可-->apply。重新打jar包,放到集群上跑,問題得到解決



評註:
這個問題,相信大家一看就清楚,熟悉解決辦法,遇到的時候,能否熟練操作。


7.執行$ hbase hbck 命令時,出現以下提示:
Invalid maximum heap size: -Xmx4096m
The specified size exceeds the maximum representable size.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
原因:jvm設置的內存過大,減小配置文件hbase-env.sh內的設置即可。例如:
export HBASE_HEAPSIZE=1024



評註:
這裡涉及到虛擬機的相關知識,也是Java的基礎,只有我們有比較好的基礎,才能更好的理解Hbase,Hadoop,Spark等相關JVM、內存等配置。


更多參考


深入理解Java虛擬機_JVM高級特性與最佳實踐 第2版
https://www.aboutyun.com/forum.php?mod=viewthread&tid=26485



直接下載


https://pan.baidu.com/s/1EbBWkteyk20kLPJJNGfwjg 提取碼: 889n
8、查詢hbase的時候報錯:
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.hadoop.hbase.util.ByteStringer
這個空指針異常也是挺噁心的,我已經正常連接到了hbase,而且表名也是正常的...原來是代碼不夠嚴謹: 在一些情況下,根據行鍵進行查詢,可能得到的結果集是null,但是我的代碼裡並沒有加上對可能出現的空指針異常進行處理的機制,然後使用for循環遍歷這個空的結果集for (Result result : results)
遍歷一個空的結果集當然會報錯啦!
解決方法: 前面加上一個判斷,就解決了!



評註:
上面表面來看其實是缺包,這是我們排查的第一步,如果確定不缺包的視情況下,我們需要進一步的想,是否是錯誤,引發了這個錯誤。所以我們要根據錯誤,並且推斷錯誤是由什麼引發的。
9.連接Hbase時, 明明hbase.zookeeper.quorum 和hbase.zookeeper.property.clientPort的設置都是正確的,卻總是報錯 INFO client.ZooKeeperRegistry: ClusterId read in ZooKeeper is null
首先,這種情況出現在: 使用的configuration 是 new configuration這種方式獲得的.這裡: 涉及到一個關鍵的配置:



zookeeper.znode.parent --> 這個值的默認值是/hbase



但是如果集群裡面設置的值不是這個的話,就會拋出這個異常!比如說我們的集群:因為使用 new Configuration()獲得的configuration對象是不會讀取Hbase的配置文件hbase-site.xml文件的.在代碼中將該配置按照hbase-site.xml裡面配置的添加進來即可conf.set("zookeeper.znode.parent", "/hbase-unsecure");這樣,該問題得到解決!



評註:
這個錯誤跟第四個問題其實是差不多的,如果配置沒有生效,我們可以在代碼中設置。確保生效。同時配置也是域的,在代碼的設置,會替代配置文件的中的設置。
10、使用bulkload入庫遇到的另外一個問題!報錯信息如下所示:
Exception in thread "main" java.lang.IllegalArgumentException: Can not create a Path from a null string



由報錯信息上可以看出來:是在HFileOutputFormat2類裡面出現的錯誤



這個類是使用bulkload方式進行入庫的很關鍵的類



我們接下來一步一步的去定位錯誤:



拋出來的錯誤信息是來自於path類的這個方法:



[Java] 純文本查看 複製代碼

private void checkPathArg( String path ) throws IllegalArgumentException {

// disallow construction of a Path from an empty string

if ( path == null ) {

throw new IllegalArgumentException(

"Can not create a Path from a null string");

}

if( path.length() == 0 ) {

throw new IllegalArgumentException(

"Can not create a Path from an empty string");

}

}



根據界面上的報錯結合一下: 可以得到path是一個null,



那麼這個空是從何而來,我們繼續看源碼



[Java] 純文本查看 複製代碼

static void configurePartitioner(Job job, List<immutablebyteswritable> splitPoints)/<immutablebyteswritable>

throws IOException {

Configuration conf = job.getConfiguration();

// create the partitions file

FileSystem fs = FileSystem.get(conf);

Path partitionsPath = new Path(conf.get("hbase.fs.tmp.dir"), "partitions_" + UUID.randomUUID());

fs.makeQualified(partitionsPath);

writePartitions(conf, partitionsPath, splitPoints);

fs.deleteOnExit(partitionsPath);

// configure job to use it

job.setPartitionerClass(TotalOrderPartitioner.class);

TotalOrderPartitioner.setPartitionFile(conf, partitionsPath);

}


分析上面的源碼,能夠產生null的又和path相關的,顯然是這行代碼:



Path(conf.get("hbase.fs.tmp.dir"), "partitions_" + UUID.randomUUID());



我們不妨測試一下,在獲得conf對象後,打印一下hbase.fs.tmp.dir的值,果然為空!



那麼問題已經確認,只需要在代碼裡面加上這行!



conf.set("hbase.fs.tmp.dir", "/wangyou/mingtong/mt_wlyh/tmp/hbase-staging");



問題便得到解決,入庫工作得以正常運行!



評註:
當我們編程過程中,產生問題的時候,有些老鐵不知所措,然後就在群裡提問,這樣其實很少人會回答這類問題,而且即使回答,也是不對口的。對於一些異常錯誤,直接貼出來,其實能解決的概率是非常小的。我們VIP群中,也有成員遇到異常,都是語音遠程解決,這裡面產生一個錯誤,可能會有更多相關錯誤,一個錯誤,除了非常簡單外,很少能推斷出到底是哪裡的問題。
11、gz壓縮文件損壞導致入庫失敗的問題


ERROR hdfs.DFSClient: Failed to close inode 16886732
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException): No lease on /hbase_bulkload/output/inin (inode 16886732): File does not exist. Holder DFSClient_NONMAPREDUCE_1351255084_1 does not have any open files.
該問題的場景是在對大量的小的.gz壓縮文件進行入庫的時候,個別壓縮文件損壞導致的,解決的方法就是找到那些出錯的.gz文件刪除掉.
解決方法:
1. 首先去界面查看相應的job執行的日誌,日誌裡有可能會有出錯的.gz文件的id信息,找到將其刪除.
2. 將入庫的文件夾下面的文件按照文件大小進行排序,一般來說,大小為0KB的都是有問題的.. 將其get下來,查看能否解壓,不能正常解壓就幹掉
3. 可以使用命令: hdfs fsck path -openforwrite
檢測某個文件夾下面文件是否正常



評註:
從上面錯誤,讓我想起了另外一個相關的問題。就是我們的代碼從一定意義上來說是沒有問題的,可是數據一多或則一亂就產生問題,這就是由於數據格式不一致,造成我們程序的異常。所以這個問題,問別人,是不可能一下子推斷出來的,只能是我們慢慢查找,debug,才能發現。



4.關閉故障



1、停止HBase時報錯
stop-hbase.sh



stopping hbasecat: /tmp/hbase-root-master.pid: No such file or directory



原因是,默認情況下pid文件保存在/tmp目錄下,/tmp目錄下的文件很容易丟失,



解決辦法:

在hbase-env.sh中修改pid文件的存放路徑:

export HBASE_PID_DIR=/data/hadoop/pids


分享到:


相關文章: