1. 程式人生 > >HBase2.0新特性詳解

HBase2.0新特性詳解

作者 | 個推大資料運維工程師  行者

升級背景

個推作為專業的資料智慧服務商,在業務開展過程中存在海量的資料儲存與查詢的需求,為此個推選用了高可靠、高效能、面向列、可伸縮的分散式資料儲存系統——HBase。

然而,執行HBase老叢集(使用HBase1.0版本)多年後,遇到了兩大問題:各節點基礎環境不一致;該叢集的伺服器執行多年已過保。而且隨著個推業務量增長,效能方面也開始遇到瓶頸。經過綜合評估,個推決定將老叢集升級並遷移到HBase2.0新叢集來解決HBase老叢集存在的上述問題。

升級步驟

下面是個推升級並遷移的全步驟,供開發者參考。由於整個過程將涉及多個部門且用時長,建議各位在操作的過程中可以讓各部門指定專人對接。

準備1:HBase表認領,找到所有表的讀寫應用與業務方;

準備2:HBase2.0新叢集部署,並打通到所有讀寫應用伺服器的網路;

除錯3:測試環境除錯應用,確認能正常使用HBase2.0叢集;

除錯4:開發資料校驗工具,對遷移後新老叢集資料進行完整性校驗;

遷移5:所有表雙寫工程上線,並確認新老叢集寫入資料一致;

遷移6:所有讀取應用變更,遷移到新叢集,確認讀取正常;

收尾7:老叢集寫入工程停止,表禁用半個月,無異常後老叢集下線。

HBase2.0 新特性

2018年4月29日,HBase2.0釋出,共包含了4551個Issues。HBase2.0的新特性非常多,本次只介紹主要的幾個特性,更多內容見官網文件。

 

特性1:AssignmentManager V2

AMv1存在的問題及原因分析

AMV1存在的主要問題是Regoins in Transition(RIT)。深度使用HBase的人一般都被 RIT困擾過,長時間的RIT簡直令人抓狂。一些RIT確實是由於Region無法被RegionServer open造成的,但大部分的RIT,都是AM本身的問題引起的。

引發RIT的原因主要有以下幾點:

1. Region狀態變化複雜

Region open 的過程有7 個元件參與並涉及20 多個步驟,但越複雜的邏輯意味著越容易出 bug。 

2.region 狀態多處快取

Master 記憶體 、Meta 表、Zookeeper 都會儲存 region 的狀態,Hbase1.0要求三者要保持完全同步;

Master 和 RegionServer 都會修改 Meta 表的狀態和 Zookeeper 的狀態,這將非常容易導致region狀態出現混亂;

如果出現不一致,到底以哪裡的狀態為準? 

 

3.嚴重依賴 Zookeeper進行狀態通知

Region 狀態的通知完全通過 Zookeeper,這導致了 region 的上線/下線的速度存在著一定的瓶頸。特別是在 region 比較多的時候,Zookeeper的通知會出現嚴重的滯後現象。

AMv2 的改進   

主要的改進有以下四點:

1.region 每次狀態變化,會先記錄到 ProcedureWAL中,然後記錄在 Meta 表; 

2.region 狀態資訊只存放兩個地方:meta 表、HMaster 的記憶體,不再存放Zookeeper;

3.只有 HMaster 才可以更新 meta 表中的資訊;

4.HMaster與RS直接進行狀態資訊同步,去除Zookeeper依賴;

整體上來看,AMv2去除了 Zookeeper 依賴,有清晰明瞭的 region transition 機制,程式碼的可讀性更強,非常有效地解決了RIT現象。

特性2:In-memory Flush & Compaction

HBase寫入流程中,資料會先寫入Memstore(記憶體中),達到閾值後,會觸發flush重新整理,生成HFile檔案落到磁碟中。需要注意的是MemStore的最小flush單元是‘HRegion’而不是單個MemStore,如果HRegion中Memstore過多,每次flush的IO開銷會很大。

HBase1.x 的問題 

Memstore flush重新整理的觸發條件很多,不過大多數對業務影響小,開發者無需擔心。但如果觸發Region Server級別flush,將會導致整個 RS 執行 flush,阻塞所有落在該Region Server上的更新操作,而且阻塞時間很長,可能會達到分鐘級別,對業務影響非常大。  

HBase2.0的改進

在2.0版本中,MemStore中的資料先Flush成一個Immutable的Segment,多個Immutable Segments可以在記憶體中進行Compaction,當達到一定閾值以後才將記憶體中的資料持久化成HDFS中的HFile檔案。這就是2.0的新特性:In-memory Flush and Compaction ,而且該特性在2.0版本中已被預設啟用(系統表除外)。

好處1:減少資料量、降低磁碟 IO,很多表的列簇只保留1個版本;

好處2:Segment 來替代 ConcurrentSkipListMap資料結構儲存索引,節省空間,同樣的 MemStore 可以儲存更多的資料。

特性3:Offheaping of Read/Write Path

HBase 服務讀寫資料較多依賴堆內記憶體實現,JVM採用的是stop-the-world的方式進行垃圾回收,很容易造成 JVM 程序因為 GC 而停頓時間比較長。 而HBase 是一個低延遲、對響應性要求比較高的系統,GC 很容易造成HBase 服務抖動、延遲高。

HBase社群解決GC延遲的思路是儘量減少使用JVM 堆內記憶體,堆內記憶體使用減少了,GC也就隨著減少了,社群為此支援了讀寫鏈路的offheap。

讀鏈路的offheap主要包括以下幾個優化 :

1. 對BucketCache引用計數,避免讀取時的拷貝;

2. 使用ByteBuffer做為服務端KeyValue的實現,從而使KeyValue可以儲存在offheap的記憶體中;

3. 對BucketCache進行了一系列效能優化。

寫鏈路的offheap包括以下幾個優化:

1. 在RPC層直接把網路流上的KeyValue讀入offheap的bytebuffer中;

2. 使用offheap的MSLAB pool;

3. 使用支援offheap的Protobuf版本(3.0+)。

HBase2.0 的“坑”

V2.0.3之前版本不支援HBCK2 

<pre>

HBCK2 versions should be able to work across multiple hbase-2 releases. It will fail with a complaint if it is unable to run. There is no HbckService in versions of hbase before 2.0.3 and 2.1.1. HBCK2 will not work against these versions.

</pre>

建議HBase升級到V2.0.3或V2.1.1,詳情看HBCK2文件。

[https://github.com/apache/hbase-operator-tools/tree/master/hbase-hbck2]

重度依賴Procedure V2  

AMv2之所以能保持簡潔高效的一個重要原因就是其重度依賴了Procedure V2,把一些複雜的邏輯都轉移到了Procedure V2中。但是這樣做的問題是:一旦ProcedureWAL出現了損壞,這個後果就是災難性的。當然,小編相信經過一段時間的bug修復和完善後,這些問題將不復存在。

HBase作為個推大資料一項重要的基礎服務,效能的好壞影響重大。個推將HBase1.0升級到了HBase2.0版本後,在可靠性、安全性方面都有了很大提升,有效解決了1.0版本中的多種問題。未來,個推將會持續關注HBase 2.0,與大家共同探討如何在生產環境中更好地對其進行使用。

相關推薦

HBase2.0特性

作者 | 個推大資料運維工程師  行者 升級背景 個推作為專業的資料智慧服務商,在業務開展過程中存在海量的資料儲

Servlet 3 0 特性

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Servlet2.5和 3.0區別(Servlet 3.0 特性

Servlet 3.0 新特性概述 Servlet 3.0 作為 Java EE 6 規範體系中一員,隨著 Java EE 6 規範一起釋出。該版本在前一版本(Servlet 2.5)的基礎上提供了若干新特性用於簡化 Web 應用的開發和部署。其中有幾項特性的引

Servlet 3.0 特性

開發十年,就只剩下這套架構體系了! >>>   

C# 9.0特性系列之一:只初始化設定器(init only setter)

## 1、背景與動機 自C#1.0版本以來,我們要定義一個不可變資料型別的基本做法就是:先宣告欄位為readonly,再宣告只包含get訪問器的屬性。例子如下: ``` struct Point { public int X { get; } public int Y { get; }

C# 9.0特性系列之三:模組初始化器

## [1][1] 背景動機 關於模組或者程式集初始化工作一直是C#的一個痛點,微軟內部外部都有大量的報告反應很多客戶一直被這個問題困擾,這還不算沒有統計上的客戶。那麼解決這個問題,還有基於什麼樣的考慮呢? * 在庫載入的時候,能以最小的開銷、無需使用者顯式呼叫任何介面,使客戶做一些期望的和一次性的初始化。

C#9.0特性系列之四:頂級程式語句(Top-Level Programs)

## 1 背景與動機 通常,如果只想用C#在控制檯上列印一行“Hello World!”,這可不是Console.WriteLine("Hello World!");一條語句就可以搞定的,還涉及到其他必要基礎程式碼(如定義類和入口函式Main),例如下面: ```C# using System; clas

C# 9.0特性系列之五:記錄(record)和with表示式

## [1][1] 背景與動機 傳統面向物件程式設計的核心思想是一個物件有著唯一標識,表現為物件引用,封裝著隨時可變的屬性狀態,如果你改變了一個屬性的狀態,這個物件還是原來那個物件,就是物件引用沒有因為狀態的改變而改變,也就是說該物件可以有很多種狀態。C#從最初開始也是一直這樣設計和工作的。但是一些時候,你

C#9.0特性系列之六:增強的模式匹配

自C#7.0以來,模式匹配就作為C#的一項重要的新特性在不斷地演化,這個借鑑於其小弟F#的函數語言程式設計的概念,使得C#的本領越來越多,C#9.0就對模式匹配這一功能做了進一步的增強。 為了更為深入和全面的瞭解模式匹配,在介紹C#9.0對模式匹配增強部分之前,我對模式匹配整體做一個回顧。 ## 1

JavaEE6引入的JPA2.0四大特性(轉)

   Java EE 5平臺引入了Java持久化API(Java Persistence API,JPA),它為Java EE和Java SE應用程式提供了一個基於POJO的持久化模組。JPA處理關係資料與Java物件之間的對映,它使物件/關係(O/R)對映標準化,JPA

Java1.8的特性

前言: Java 8 已經發布很久了,很多報道表明Java 8 是一次重大的版本升級。在Java Code Geeks上已經有很多介紹Java 8新特性的文章,例如Playing with Java 8 – Lambdas and Concurrency、Java 8 Date Time

JAVA8特性

JAVA8 十大新特性詳解 前言: Java 8 已經發布很久了,很多報道表明Java 8 是一次重大的版本升級。在Java Code Geeks上已經有很多介紹Java 8新特性的文章,

JAVA8 十大特性

Java官方庫的新特性 Java 8增加了很多新的工具類(date/time類),並擴充套件了現存的工具類,以支援現代的併發程式設計、函數語言程式設計等。 4.1 Optional Java應用中最常見的bug就是空值異常。在Java 8之前,Google Guava引入了Optionals類來解決NullP

JDK1.8 十大特性

“Java is still not dead—and people are starting to figure that out.” 本教程將用帶註釋的簡單程式碼來描述新特性,你將看不到大片嚇人的文字。 一、介面的預設方法Java 8允許我們給介面新增一個非抽象的方法實現,只需要使用 defaul

jdk 1.5 1.6 1.7 1.8 1.9的特性帶例子

1.5 1.自動裝箱與拆箱: 2.列舉(常用來設計單例模式) 3.靜態匯入 4.可變引數 5.內省 1.6 1.Web服務元資料 2.指令碼語言支援 3.JTable的排序和過濾 4.更簡單,更強大的JAX-WS 5.輕量級Http Serv

Android 5.X 特性(一)——主題、Palette、陰影、著色和裁剪

Android 5.X 系列開始使用新的設計風格Material Design來統一整個Android系統的介面設計風格。 Material Design 主題 Material Design 現在有三種預設的主題可以設定,程式碼如下: @andr

重磅 | OpenStack Queens釋出!特性

打造開源雲端計算中國第一互動社群內容專注於Linux、Kubernetes、OpenStack、

Java | 學習系列 Java1.8 特性( 包含學習程式碼 )

1. 簡介 毫無疑問,Java 8是Java自Java 5(釋出於2004年)之後的最重要的版本。這個版本包含語言、編譯器、庫、工具和JVM等方面的十多個新特性。在本文中我們將學習這些新特性,並用實際的例子說明在什麼場景下適合使用。 這個教程包含Jav

JAVA8的特性

簡介 Oracle在2014年3月份釋出了java8正式版,該版本增加了很多新特性,比如:函式式介面、lambda表示式、集合的流式操作、註解的更新、安全性增強、IO\NIO的改進 函式式介面 什麼是函式式介面 這是java8的一個核心概念,(Functional I

java10 特性

喜歡 如果 des enc hashmap 兩個 替換 user 亂碼   引言:    點擊--》java9 新特性 詳解    點擊--》java8 新特性 詳解    正題:    1、局部變量var    將前端思想var關鍵字引入java後段,自動檢測所屬於類型,