HBase性能優化案例分析

發表于:2014-03-24來源:InfoQ作者:梁堰波點擊數: 標簽:HBase
HBase性能優化案例分析。 HDFS設計的初衷是為了存儲大文件(例如日志文件),面向批處理、順序I/O的。然而架設在HDFS之上的HBase設計的初衷卻是為了解決海量數據的隨機讀寫的請求。把這兩種設計初衷截然相反的組件怎么揉在一起的呢?這種分層的結構設計主要是為了使架構更

  HDFS設計的初衷是為了存儲大文件(例如日志文件),面向批處理、順序I/O的。然而架設在HDFS之上的HBase設計的初衷卻是為了解決海量數據的隨機讀寫的請求。把這兩種設計初衷截然相反的組件怎么揉在一起的呢?這種分層的結構設計主要是為了使架構更清晰,HBase層和HDFS層各司其職;但是卻帶來了潛在的性能下降。在很多業務場景中大家使用HBase抱怨最多的兩個問題就是:Java GC相關的問題和隨機讀寫性能的問題。Facebook Messages(以下簡稱FM系統)系統可以說是HBase在online storage場景下的第一個案例(《Apache Hadoop Goes Realtime at Facebook》, SIGMOD 2011),最近他們在存儲領域頂級會議FAST2014上發表了一篇論文《Analysis of HDFS Under HBase: A Facebook Messages Case Study》分析了他們在使用HBase中遇到的一些問題和解決方案,使用HBase做online storage的同學們可以參考下。

  該論文首先講了Facebook的分析方法包括tracing/analysis/simulation,FM系統的架構和文件與數據構成等,接下來開始分析FM系統在性能方面的一些問題,并提出了解決方案。

  FM系統的主要讀寫I/O負載

  

  Figure 2描述了每一層的I/O構成,解釋了在FM系統對外請求中讀占主導,但是由于logging/compaction/replication/caching導致寫被嚴重放大。

  HBase的設計是分層結構的,依次是DB邏輯層、FS邏輯層、底層系統邏輯層。DB邏輯層提供的對外使用的接口主要操作是put()和get()請求,這兩個操作的數據都要寫到HDFS上,其中讀寫比99/1(Figure 2中第一條)。

  由于DB邏輯層內部為了保證數據的持久性會做logging,為了讀取的高效率會做compaction,而且這兩個操作都是寫占主導的,所以把這兩個操作(overheads)加上之后讀寫比為79/21(Figure 2中第二條)。

  相當于調用put()操作向HBase寫入的數據都是寫入了兩份:一份寫入內存Memstore然后flush到HFile/HDFS,另一份通過logging直接寫HLog/HDFS。Memstore中積累一定量的數據才會寫HFile,這使得壓縮比會比較高,而寫HLog要求實時append record導致壓縮比(HBASE-8155)相對較低,導致寫被放大4倍以上。

  Compaction操作就是讀取小的HFile到內存merge-sorting成大的HFile然后輸出,加速HBase讀操作。Compaction操作導致寫被放大17倍以上,說明每部分數據平均被重復讀寫了17次,所以對于內容不變的大附件是不適合存儲在HBase中的。由于讀操作在FM業務中占主要比例,所以加速讀操作對業務非常有幫助,所以compaction策略會比較激進。

  HBase的數據reliable是靠HDFS層保證的,即HDFS的三備份策略。那么也就是上述對HDFS的寫操作都會被轉化成三倍的local file I/O和兩倍的網絡I/O。這樣使得在本地磁盤I/O中衡量讀寫比變成了55/45。

  然而由于對本地磁盤的讀操作請求的數據會被本地OS的cache緩存,那么真正的讀操作是由于cache miss引起的讀操作的I/O量,這樣使得讀寫比變成了36/64,寫被進一步放大。

  另外Figure 3從I/O數據傳輸中真正業務需求的數據大小來看各個層次、各個操作引起的I/O變化。除了上面說的,還發現了整個系統最終存儲在磁盤上有大量的cold data(占2/3),所以需要支持hot/cold數據分開存儲。

  總的來說,HBase stack的logging/compaction/replication/caching會放大寫I/O,導致業務邏輯上讀為主導的HBase系統在地層實際磁盤I/O中寫占據了主導。

  FM系統的主要文件類型和大小

  FM系統的幾種文件類型如Table 2所示,這個是純業務的邏輯描述。在HBase的每個RegionServer上的每個column family對應一個或者多個HFile文件。FM系統中有8個column family,由于每個column family存儲的數據的類型和大小不一樣,使得每個column family的讀寫比是不一樣的。而且很少數據是讀寫都會請求的,所以cache all writes可能作用不大(Figure 4)。

  對于每個column family的文件,90%是小于15M的。但是少量的特別大的文件會拉高column family的平均文件大小。例如MessageMeta這個column family的平均文件大小是293M。從這些文件的生命周期來看,大部分FM的數據存儲在large,long-lived files,然而大部分文件卻是small, short-lived。這對HDFS的NameNode提出了很大的挑戰,因為HDFS設計的初衷是為了存儲少量、大文件準備的,所有的文件的元數據是存儲在NameNode的內存中的,還有有NameNode federation。

  FM系統的主要I/O訪問類型

  下面從temporal locality, spatial locality, sequentiality的角度來看。

  73.7%的數據只被讀取了一次,但是1.1%的數據被讀取了至少64次。也就是說只有少部分的數據被重復讀取了。但是從觸發I/O的角度,只有19%的讀操作讀取的是只被讀取一次的數據,而大部分I/O是讀取那些熱數據。

原文轉自:http://www.infoq.com/cn/articles/hbase-casestudy-facebook-messages

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97