環境以下:
Centos6.5
Apache Hadoop2.7.1
Apache Hbase0.98.12
Apache Zookeeper3.4.6
JDK1.7
Ant1.9.5
Maven3.0.5
最近在測Hbase的壓縮,Hadoop安裝了lzo和snappy,插入50條文本數據,每條數據大約4M,來看他們的壓縮率對比,
而後在測的過程當中,發現用java客戶端去scan這50條數據時,regionserver頻繁宕機看hbase的log發現並沒有明顯異常,查看datanode的log發現以下異常:
java
java.io.IOException: Premature EOF from inputStream apache
at org.apache.hadoop.io.IOUtils.readFully(IOUtils.java:201) 緩存
at org.apache.hadoop.hdfs.protocol.datatransfer.PacketReceiver.doReadFully(PacketReceiver.java:213) app
at org.apache.hadoop.hdfs.protocol.datatransfer.PacketReceiver.doRead(PacketReceiver.java:134) ide
at org.apache.hadoop.hdfs.protocol.datatransfer.PacketReceiver.receiveNextPacket(PacketReceiver.java:109) oop
at org.apache.hadoop.hdfs.server.datanode.BlockReceiver.receivePacket(BlockReceiver.java:472) 測試
at org.apache.hadoop.hdfs.server.datanode.BlockReceiver.receiveBlock(BlockReceiver.java:849) google
at org.apache.hadoop.hdfs.server.datanode.DataXceiver.writeBlock(DataXceiver.java:804) spa
at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.opWriteBlock(Receiver.java:137)
at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.processOp(Receiver.java:74)
at org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:251)
at java.lang.Thread.run(Thread.java:745)
java.io.IOException: Premature EOF from inputStream at org.apache.hadoop.io.IOUtils.readFully(IOUtils.java:201) at org.apache.hadoop.hdfs.protocol.datatransfer.PacketReceiver.doReadFully(PacketReceiver.java:213) at org.apache.hadoop.hdfs.protocol.datatransfer.PacketReceiver.doRead(PacketReceiver.java:134) at org.apache.hadoop.hdfs.protocol.datatransfer.PacketReceiver.receiveNextPacket(PacketReceiver.java:109) at org.apache.hadoop.hdfs.server.datanode.BlockReceiver.receivePacket(BlockReceiver.java:472) at org.apache.hadoop.hdfs.server.datanode.BlockReceiver.receiveBlock(BlockReceiver.java:849) at org.apache.hadoop.hdfs.server.datanode.DataXceiver.writeBlock(DataXceiver.java:804) at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.opWriteBlock(Receiver.java:137) at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.processOp(Receiver.java:74) at org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:251) at java.lang.Thread.run(Thread.java:745)
截圖以下,好吧,出異常了,就拿這個異常google查找結果,發現並無明確的答案,大部分都是說連接超時,或者是句柄數滿了,致使連接中斷等等,而後就按這些答案,改了若干配置,發現依然沒有生效,這領我感到十分奇怪 ,得出一個錯誤的結論,hbase不支持多種壓縮類型並存的表,而後我去掉了其餘類型用來壓縮測試的表,再次測試,發現問題依舊,這再次令我十分詫異,會不會是環境的問題?由於我實在想不出來可能的問題所在了,而後就在本機虛擬機上進行測試,
虛擬機的環境,由於是本身用,因此JDK版本是1.8 和 Centos版本是7,Hbase,Hadoop,Zookeeper版本則保持一致,
搭建完畢後,繼續測試,發現問題依舊,這下使人更迷惑了,看的出來非環境的問題了,不過此次有了點新的線索,因爲用的是JDK8,在Hbase的log裏面發現出現了大量的full gc日誌,意思就是內存嚴重不足,致使垃圾收集時間出現了4,5秒,這下我纔有點頭緒,hbase是個吃內存的玩意,內存給的少,確實有可能致使regionserver掛掉,因而我查看hbase的堆內存分配狀況,發現是默認的1G,這下確實跟這個有很大關係,50條數據佔存儲200M,若是每次scan一次,hbase會將其緩存在cache裏面,第二次繼續scan不一樣壓縮類型的表,會致使內存膨脹,繼而引起,regionserver宕機,而給出的異常提示,並非很是明確,因此才定位問題比較困難,知道了大概緣由所在,而後把hbase的堆內存調到4G,並分發到全部節點上,再次啓動,用java 客戶端,掃描全表測試,此次很是穩定,regionserver沒有出現過再次掛掉的狀況。
最後給出測試壓縮的一個結論:總共測了4種壓縮比較,原始數據200M (1)不用壓縮 佔空間 128.1 M (2)gz壓縮 佔920.3 K (3)snappy壓縮 佔 13.2M (4)lzo壓縮 佔8M 以上能夠看出,gz的壓縮比最高,lzo次之,snappy第三,固然不一樣的壓縮適用於不用的業務場景,這裏不能就簡簡單單的 總結必須用什麼,這裏面snappy和lzo在目前大多數互聯網公司用的比較多,因此你們能夠根據具體業務,來選擇合適的壓縮方案。