天天看點

優化hbase的查詢操作-大幅提升讀寫速率

環境:suse  8G記憶體,8核,12T磁盤           hbase master 占一台,其他7台作為hbase的region server 注意:此處不讨論hadoop

情景:           我們有7億的資料,需要做查詢操作,需要從1.7億的表中查找一個字段,并寫入到7億資料的表中。           這裡為了描述友善,将7億資料的表稱為:A表,1.7億資料的表稱為B表。                      在初期,我們采用的邏輯是:将A表中的資料讀取一行,根據其中的某個字段去組織一個GET,然後           立刻送出,從B表取得要查詢的字段的值,組織成一個PUT,并送出到A表。           那麼這麼做的話,完全發揮不出hbase的效率,因為每個get之間它的key不一定連續,或者說是在同一範圍           而hbase的服務端會根據每個請求去加載資料到記憶體,由于請求的塊分散,那麼資料在記憶體中的替換過多的頻繁。           很有可能和直接讀取磁盤資料差不多。           并且采用這種邏輯去處理資料,需要花費時間太多。差不多是10W行讀寫資料需要40分鐘。這對于A表的更新操作           完全是不能接受的。                   之後,通過讀資料的讀取操作進行封裝,組織成一個ArrayList<Get> 當到一定程度的時候采取送出。這裡還有一個情況就是           有些資料查詢不到,那麼需要去連接配接資料庫去申請一個自動配置設定的值,并立刻送出,因為後面可能有請求這個資料。           這就需要分開處理。           在組織GET 清單的時候需要先查詢,注意,不要采用table.get去取一個cell的值并判斷是否為null來處理。           而是用table.exist(get) 去查詢,這是在server-side跑的,效率要高很多。           對于查詢不到的值立刻申請值并寫入A表。           對于查詢的到的,那麼就可前面說的組織get 加入到GET清單中,到一定程度再去一次送出,在取到值之後,           在根據将循環資料的記錄,将這些組織成put,數量和GET清單一樣,不要去具體指定,在循環一次後直接table.put                      其他參數修改方面,寫的都很多,這裡就不提了。

處理速度(取至其中一台伺服器中跑的任務): 2011-12-30 17:10:03 Start Write Lines:1700000 2011-12-30 17:14:10 Writed Lines:1700000 2011-12-30 17:14:11 Start Write Lines:1800000 2011-12-30 17:18:21 Writed Lines:1800000 2011-12-30 17:18:22 Start Write Lines:1900000 2011-12-30 17:22:29 Writed Lines:1900000 2011-12-30 17:22:29 Start Write Lines:2000000 2011-12-30 17:26:37 Writed Lines:2000000 2011-12-30 17:26:37 Start Write Lines:2100000

大約是查詢,寫入速度是4分鐘處理10W行資料。 也就是4000/s的速率,較之前的處理方式提升了一個量級

PS:歡迎搞hadoop,hbase的朋友聯系我,互相交流

參考http://www.cnblogs.com/chenjingjing/archive/2010/01/26/1656895.html