2011-08-30 66 views
3

我正在使用Spring + Datanucleus JDO + Hbase。 Hbase處於具有兩個節點的完全分佈式模式。我在這裏遇到嚴重的性能問題。Hbase性能

我的web應用程序可以被視爲pinger,它只是持續ping URLS並存儲它們的響應。我的應用程序爲INSERT運行多個線程進入數據庫。我觀察到,一旦併發寫入數量超過20個左右,插入開始花費很多時間(有些甚至需要1000秒)。當發生這種情況時,READS開始失敗,我的Web應用程序無法從數據庫中提取任何數據(我的Web應用程序掛起)。我不是一個NoSQL數據庫傢伙,因此不知道從哪裏開始尋找性能。

我的主要配置是: 動物園管理員法定人數尺寸:1個 HBase的regionservers:2 數據節點:2個 hbase.zookeeper.property.maxClientCnxns:400 複製因子:3

我是否需要增加堆的大小爲Hbase?高WRITE吞吐量是否會影響READ?

我的配置有問題嗎?將數據寫入Hbase似乎寫入文件會更快。這是我在Hbase的最後一次鏡頭。請幫助

回答

2

我看到的一個大問題是,您在2個複製因子爲3的節點上運行HBase(實際上只有2個節點,因爲只有2個節點要複製)。這意味着所有寫入操作都必須複製到兩個節點。 HBase真的需要至少5個左右的節點才能開始。

這聽起來像是你正在填滿你的第一個區域,它正在分裂,在分裂過程中,一旦MemStore填滿你將開始阻塞。您應該考慮創建預先分割成多個區域的表格,以便爲您提供均勻的寫入分配。

我建議看看HBase book's chapter on performance,特別是pre-splitting tables上的部分。

你也應該使用compression,確保你得到本地壓縮工作(gzip,lzo或snappy) - 不要使用純Java壓縮,否則你會真的很慢,鏈接討論了一下。

+0

@cftrnas似乎我必須做很多事情才能使它的生產值得。一個問題,但。除了hbase之外,我是否還需要對hadoop進行任何優化?我已經完成了最小化,比如增加ulimit等等。我目前無法在兩個以上的節點上運行hbase,會將複製因子降低到1嗎? –

+0

如果這僅僅是一個開發/測試安裝,那麼是的 - 肯定是複製因子爲1.在生產中,你會需要(需要)更多的節點和3的複製。我也不能強調它是多麼重要[拆分表格](http://ofps.oreilly.com/titles/9781449396107/performance.html#perfsplitcompactpresplit)。還要考慮壓縮並增加您的區域大小。 – cftarnas

+0

感謝您的鏈接。我實際上做了大部分在那裏提到的事情,並且現在能夠獲得良好的READ性能。我的應用掛起(讀取時)的主要問題是我的區域服務器的hbase.regionserver.handler.count的默認值(10)。當接近30個寫入發生時,我無法讀取。我沒有做過預分割表,因爲我的最大表大小是19 Mb,當它達到256 Mb時,Hbase會默認分割它。你是否仍然建議預先分裂因爲我的WRITE通過投入是非常低的。 –

0

如果您要使用多線程寫入HBase,則需要確保儘可能多地重複使用HBaseConfiguration。否則,每個線程都建立一個新的連接,ZK最終會停止提供連接,直到舊的連接關閉。

一個快速解決方案是讓單例句柄將配置傳遞給你的HTable對象。這應該保證使用相同的配置,並且將最大限度地減少併發連接。

+0

我使用datanucleus作爲ORM並使用PersistenceManagerFactory。這是我工作的抽象級別,我沒有訪問HTable和相關的hbase對象。我想PMF將重新使用連接。但我無法找到一種方法,可以指定使用hbase的datanuceus連接池(與RDBMS不同)。在我工作的抽象層面上,連接池是否可能? –

+0

我真的不熟悉Datanucleus。所以我不能評論連接的處理方式。但是,您可以轉到HBase主控臺的Web控制檯(如ipofhbasemaster:60010)並查看ZK轉儲。這將列出所有到ZK的活動連接。如果超過400(您的限制),它將拒絕新的連接。 – Tony