鎖屏面試題百日百刷,每個作業日堅持更新面試題,請看到最后就能獲取你想要的,接下來的是今日的面試題:
1.HBase內部機制是什么?
Hbase是一個能適應聯機業務的資料庫系統
物理存盤:hbase的持久化資料是將資料存盤在HDFS上,
存盤管理:一個表是劃分為很多region的,這些region分布式地存放在很多regionserver上Region內部還可以
劃分為store,store內部有memstore和storefile,
版本管理:hbase中的資料更新本質上是不斷追加新的版本,通過compact操作來做版本間的檔案合并Region
的split,
集群管理:ZooKeeper + HMaster + HRegionServer,
2.HTable API有沒有執行緒安全問題,在程式是單例還是多例?
在單執行緒環境下使用hbase的htable是沒有問題,但是突然高并發多執行緒情況下就可能出現問題,
以下為Htable的API說明:
This class is not thread safe for updates; the underlying write buffer can be corrupted if multiple threads contend over a single HTable instance. 當有多個執行緒競爭時可能把當前正在寫的執行緒corrupted,那么原因是什么呢?
根據Htable的原始碼:
public HTable(final byte [] tableName)throws IOException{this(HBaseConfiguration.create(), tableName);}public static Configuration create() {Configuration conf = new Configuration();return addHbaseResources(conf);}
從上面我們可以看到每一個HTable的實體化程序都要創建一個新的conf,我們甚至可以認為一個conf對應的是一個HTable的connection,因此如果客戶端對于同一個表,每次新new 一個configuration物件的話,那么意味著這兩個HTable雖然操作的是同一個table,但是建立的是兩條鏈接connection,它們的socket不是共用的,在多執行緒的情況下,經常會有new Htable的情況發生,而每一次的new都可能是一個新的connection,而我們知道zk上的鏈接是有限制的如果鏈接達到一定閾值的話,那么新建立的鏈接很有可能擠掉原先的connection,而導致執行緒不安全,
因此hbase官方檔案建議我們:HTable不是執行緒安全的,建議使用同一個HBaseConfiguration實體來創建HTable實體,這樣可以共享ZooKeeper和socket實體,例如,最好這樣做:
HBaseConfiguration conf = HBaseConfiguration.create();HTable table1 = new HTable(conf, "myTable");HTable table2 = new HTable(conf, "myTable");
而不是這樣:
HBaseConfiguration conf1 = HBaseConfiguration.create();HTable table1 = new HTable(conf1, "myTable");HBaseConfiguration conf2 = HBaseConfiguration.create();HTable table2 = new HTable(conf2, "myTable");
當然最方便的方法就是使用HTablepool了,維持一個執行緒安全的map里面存放的是tablename和其參考的映射,可以認為是一個簡單的計數器,當需要new 一個HTable實體時直接從該pool中取,用完放回,
3.HBase有沒有并發問題?
針對HBase在高并發情況下的性能,我們進行如下測驗:
測驗版本:hbase 0.94.1、 hadoop 1.0.2、 jdk-6u32-linux-x64.bin、snappy-1.0.5.tar.gz
測驗hbase搭建:14臺存盤機器+2臺master、DataNode和regionserver放在一起,
測驗一:高并發讀(4w+/s) + 少量寫(允許分拆、負載均衡)
癥狀:1-2天后,hbase掛掉(系統性能極差,不到正常的10%),其實并非全部掛掉,而是某些regionserver掛了,并在幾個小時內引發其他regionserver掛掉,系統無法恢復:單獨啟regionserver無法恢復正常,重啟后正常,
測驗二:高并發讀(4w+/s)
癥狀:1-2天后,hbase掛掉(系統性能極差,不到正常的10%),后發現是由于zookeeper.session.timeout設定不正確導致(參見regionserver部分:http://hbase.apache.org/book.html#trouble),重啟后正常,
測驗三:高并發讀(4w+/s)
癥狀:1-2天后,hbase掛掉(系統性能極差,不到正常的10%),從log未看出問題,但regionserver宕機,且datanode也宕機,重啟后正常,
測驗四:高并發讀(4w+/s)+禁止分拆、禁止majorcompaction、禁止負載均衡(balance_switch命令)癥狀:1-2天后,hbase掛掉(系統性能極差,不到正常的10%),從log未看出問題,但regionserver宕機,且datanode也宕機,重啟后正常,
測驗期間,還發現過:無法獲取".MATE."表的內容(想知道regionserver的分布情況)、hbase無法正確停止、hbase無法正確啟動(日志恢復失敗,檔案錯誤,最終手動洗掉日志重啟),
全部內容在[git](https://gitee.com/zjlalaforgit/interview)上,了解更多請點我頭像或到我的主頁去獲得,謝謝
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/549541.html
標籤:大數據
