HBase存儲剖析與數據遷移

1.概述

  HBase的存儲結構和關系型數據庫不一樣,HBase面向半結構化數據進行存儲。所以,對于結構化的SQL語言查詢,HBase自身并沒有接口支持。在大數據應用中,雖然也有SQL查詢引擎可以查詢HBase,比如Phoenix、Drill這類。但是閱讀這類SQL查詢引擎的底層實現,依然是調用了HBase的Java API來實現查詢,寫入等操作。這類查詢引擎在業務層創建Schema來映射HBase表結構,然后通過解析SQL語法數,最后底層在調用HBase的Java API實現。

  本篇內容,筆者并不是給大家來介紹HBase的SQL引擎,我們來關注HBase更低層的東西,那就是HBase的存儲實現。以及跨集群的HBase集群數據遷移。

2.內容

  HBase數據庫是唯一索引就是RowKey,所有的數據分布和查詢均依賴RowKey。所以,HBase數據庫在表的設計上會有很嚴格的要求,從存儲架構上來看,HBase是基于分布式來實現的,通過Zookeeper集群來管理HBase元數據信息,比如表名就存放在Zookeeper的/hbase/table目錄下。如下圖所示:

2.1 Architecture

  HBase是一個分布式存儲系統,底層數據存儲依賴Hadoop的分布式存儲系統(HDFS)。HBase架構分三部分來組成,它們分別是:ZooKeeper、HMaster和HRegionServer。

  • ZooKeeper:HBase的元數據信息、HMaster進程的地址、Master和RegionServer的監控維護(節點之間的心跳,判斷節點是否下線)等內容均需要依賴ZooKeeper來完成。是HBase集群中不可缺少的核心之一。
  • HMaster:HMaster進程在HBase中承擔Master的責任,負責一些管理操作,比如給表分配Region、和數據節點的心跳維持等。一般客戶端的讀寫數據的請求操作不會經過Master,所以在分配JVM內存的適合,一般32GB大小即可。
  • HRegionServer:HRegionServer進程在HBase中承擔RegionServer的責任,負責數據的存儲。每個RegionServer由多個Region組成,一個Region維護一定區間的RowKey的數據。如下圖所示:

  圖中Region(dn2:16030)維護的RowKey范圍為0001~0002。HBase集群的存儲結構如下圖所示:

  Zookeeper通常由奇數個組成,便于分布式選舉,可參考《分布式系統選舉算法剖析》一文了解,這里不多贅述細節。HBase為了保證高可用性(HA),一般都會部署兩個Master節點,其中一個作為主,另一個作為Backup節點。這里誰是主,誰是Backup取決于那個HMaster進程能從Zookeeper上對應的Master目錄中競爭到Lock,持有該目錄Lock的HMaster進程為主Master,而另外一個為Backup,當主Master發生意外或者宕機時,Backup的Master會立刻競爭到Master目錄下的Lock從而接管服務,成為主Master對外提供服務,保證HBase集群的高可用性。

2.2 RegionServer

  HBase負責數據存儲的就是RegionServer,簡稱RS。在HBase集群中,如果只有一份副本時,整個HBase集群中的數據都是唯一的,沒有冗余的數據存在,也就是說HBase集群中的每個RegionServer節點上保存的數據都是不一樣的,這種模式由于副本數只有一份,即是配置多個RegionServer組成集群,也并不是高可用的。這樣的RegionServer是存在單點問題的。雖然,HBase集群內部數據有Region存儲和Region遷移機制,RegionServer服務的單點問題可能花費很小的代價可以恢復,但是一旦停止RegionServre上含有ROOT或者META表的Region,那這個問題就嚴重,由于數據節點RegionServer停止,該節點的數據將在短期內無法訪問,需要等待該節點的HRegionServer進程重新啟動才能訪問其數據。這樣HBase的數據讀寫請求如果恰好指向該節點將會收到影響,比如:拋出連接異常、RegionServer不可用等異常。

3.日志信息

  HBase在實現WAL方式時會產生日志信息,即HLog。每一個RegionServer節點上都有一個HLog,所有該RegionServer節點上的Region寫入數據均會被記錄到該HLog中。HLog的主要職責就是當遇到RegionServer異常時,能夠盡量的恢復數據。

  在HBase運行的過程當中,HLog的容量會隨著數據的寫入越來越大,HBase會通過HLog過期策略來進行定期清理HLog,每個RegionServer內部均有一個HLog的監控線程。HLog數據從MemStore Flush到底層存儲(HDFS)上后,說明該時間段的HLog已經不需要了,就會被移到“oldlogs”這個目錄中,HLog監控線程監控該目錄下的HLog,當該文件夾中的HLog達到“hbase.master.logcleaner.ttl”(單位是毫秒)屬性所配置的閥值后,監控線程會立即刪除過期的HLog數據。

4.數據存儲

  HBase通過MemStore來緩存Region數據,大小可以通過“hbase.hregion.memstore.flush.size”(單位byte)屬性來進行設置。RegionServer在寫完HLog后,數據會接著寫入到Region的MemStore。由于MemStore的存在,HBase的數據寫入并非是同步的,不需要立刻響應客戶端。由于是異步操作,具有高性能和高資源利用率等優秀的特性。數據在寫入到MemStore中的數據后都是預先按照RowKey的值來進行排序的,這樣便于查詢的時候查找數據。

5.Region分割

  在HBase存儲中,通過把數據分配到一定數量的Region來達到負載均衡。一個HBase表會被分配到一個或者多個Region,這些Region會被分配到一個或者多個RegionServer中。在自動分割策略中,當一個Region中的數據量達到閥值就會被自動分割成兩個Region。HBase的表中的Region按照RowKey來進行排序,并且一個RowKey所對應的Region只有一個,保證了HBase的一致性。

  一個Region中由一個或者多個Store組成,每個Store對應一個列族。一個Store中包含一個MemStore和多個Store Files,每個列族是分開存放以及分開訪問的。自動分割有三種策略,分別是:

  • ConstantSizeRegionSplitPolicy:在HBase-0.94版本之前是默認和唯一的分割策略。當某一個Store的大小超過閥值時(hbase.hregion.max.filesize,默認時10G),Region會自動分割。
  • IncreasingToUpperBoundRegionSplitPolicy:在HBase-0.94中,這個策略分割大小和表的RegionServer中的Region有關系。分割計算公式為:Min(R*R*'hbase.hregion.memstore.flush.size','hbase.hregion.max.filesize'),其中,R表示RegionServer中的Region數。比如:hbase.hregion.memstore.flush.size=256MB,hbase.hregion.max.filesize=20GB,那么第一次分割的大小為Min(1*1*256,20GB)=256MB,也就是在第一次大到256MB會分割成2個Region,后續以此公式類推計算。
  • KeyPrefixRegionSplitPolicy:可以保證相同前綴的RowKey存放在同一個Region中,可以通過hbase.regionserver.region.split.policy屬性來指定分割策略。

6.磁盤合理規劃

  部署HBase集群時,磁盤和內存的規劃是有計算公式的。隨意分配可能造成集群資源利用率不高導致存在浪費的情況。公式如下:

# 通過磁盤維度的Region數和Java Heap維度的Region數來推導 
Disk Size/(RegionSize*ReplicationFactor)=Java Heap*HeapFractionForMemstore/(MemstoreSize/2)

  公式中對應的hbase-site.xml文件中的屬性中,見下表:

KeyProperty
Disk Size磁盤容量大小,一般一臺服務器有多塊磁盤
RegionSizehbase.hregion.max.filesize默認10G,推薦范圍在10GB~30GB
ReplicationFactordfs.replication默認為3
Java Heap分配給HBase JVM的內存大小
HeapFractionForMemstorehbase.regionserver.global.memstore.lowerLimit默認為0.4
MemstoreSizehbase.hregion.memstore.flush.size默認為128M

  在實際使用中,MemstoreSize空間打下只使用了一半(1/2)的容量。 舉個例子,一個RegionServer的副本數配置為3,RegionSize為10G,HBase的JVM內存分配45G,HBase的MemstoreSize為128M,那此時根據公式計算得出理想的磁盤容量為45G*1024*0.4*2*10G*1024*3/128M=8.5T左右磁盤空間。如果此時,分配一個節點中掛載10個可用盤,共27T。那將有兩倍的磁盤空間不匹配造成浪費。 為了提升磁盤匹配度,可以將RegionSize值提升至30G,磁盤空間計算得出25.5T,基本和27T磁盤容量匹配。

7.數據遷移

  對HBase集群做跨集群數據遷移時,可以使用Distcp方案來進行遷移。該方案需要依賴MapReduce任務來完成,所以在執行遷移命令之前確保新集群的ResourceManager、NodeManager進程已啟動。同時,為了查看遷移進度,推薦開啟proxyserver進程和historyserver進程,開啟這2個進程可以方便在ResourceManager業務查看MapReduce任務進行的進度。 遷移的步驟并不復雜,在新集群中執行distcp命令即可。具體操作命令如下所示:

# 在新集群的NameNode節點執行命令
[hadoop@nna ~]$ hadoop distcp -Dmapreduce.job.queue.name=queue_0001_01 -update -skipcrccheck -m 100 hdfs://old_hbase:9000/hbase/data/tabname /hbase/data/tabname

  為了遷移方便,可以將上述命令封裝成一個Shell腳本。具體實現如下所示:

復制代碼
#! /bin/bash
for i in `cat /home/hadoop/hbase/tbl`
do
echo $i
hadoop distcp -Dmapreduce.job.queue.name=queue_0001_01 -update -skipcrccheck -m 100 hdfs://old_hbase:9000/hbase/data/$i /hbase/data/$i
done
hbase hbck -repairHoles
復制代碼

  將待遷移的表名記錄在/home/hadoop/hbase/tbl文件中,一行代表一個表。內容如下所示:

復制代碼
hadoop@nna ~]$ vi /home/hadoop/hbase/tbl# 表名列表
tbl1
tbl2
tbl3
tbl4
復制代碼

  最后,在循環迭代遷移完成后,執行HBase命令“hbase hbck -repairHoles”來修復HBase表的元數據,如表名、表結構等內容,會從新注冊到新集群的Zookeeper中。

8.總結

  HBase集群中如果RegionServer上的Region數量很大,可以適當調整“hbase.hregion.max.filesize”屬性值的大小,來減少Region分割的次數。在執行HBase跨集群數據遷移時,使用Distcp方案來進行,需要保證HBase集群中的表是靜態數據,換言之,需要停止業務表的寫入。如果在執行HBase表中數據遷移時,表持續有數據寫入,導致遷移異常,拋出某些文件找不到。

9.結束語

  這篇博客就和大家分享到這里,如果大家在研究學習的過程當中有什么問題,可以加群進行討論或發送郵件給我,我會盡我所能為您解答,與君共勉。

聯系方式:?
郵箱:smartloli.org@gmail.com?
Twitter:https://twitter.com/smartloli?
QQ群(Hadoop - 交流社區1):424769183?
溫馨提示:請大家加群的時候寫上加群理由(姓名+公司/學校),方便管理員審核,謝謝!?

熱愛生活,享受編程,與君共勉!



本文轉自哥不是小蘿莉博客園博客,原文鏈接:http://www.cnblogs.com/smartloli/,如需轉載請自行聯系原作者

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/279743.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/279743.shtml
英文地址,請注明出處:http://en.pswp.cn/news/279743.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

windows os x_如何立即在OS X上獲取Windows樣式的窗口捕捉

windows os xApple’s recent announcement that the upcoming OS X release (El Capitan or 10.11) will finally, at long last, come with the ability to snap windows to your screen edges. A feature Windows users have enjoyed since 2009. 蘋果公司最近宣布即將發布的…

Install Odoo 11 on CentOS 7

2019獨角獸企業重金招聘Python工程師標準>>> Odoo is the most popular all-in-one business software in the world. It offers a range of business applications including CRM, website, e-Commerce, billing, accounting, manufacturing, warehouse, project m…

創建maven項目,配置maven地址

2019獨角獸企業重金招聘Python工程師標準>>> 在eclipse中,新建maven項目next第二步,選擇webapp輸入id及包名,完成新建給項目build path,添加1.8版本jdk和tomcat項目右鍵屬性 project Facets,切換成web項目&…

如何在Excel中隱藏單元格,行和列

There may be times when you want to hide information in certain cells or hide entire rows or columns in an Excel worksheet. Maybe you have some extra data you reference in other cells that does not need to be visible. 有時您可能想在某些單元格中隱藏信息或在…

金三銀四,跳槽為敬

不是不想跳,是如今的市場水冷,挪不開腳。 三月有“黃金”。 過去很多年,這個被譽為市場黃金期的階段,最熱鬧的旗幟屬于房地產,其次是人才市場。跳槽二字,充滿誘惑。對每一個想要改變的人而言,…

yum搭建本地倉庫、國內源、下載rpm包、源碼安裝

yum搭建本地倉庫[rootlocalhost ~]# mount /dev/cdrom /mnt/mount: /dev/sr0 寫保護,將以只讀方式掛載cp -r /etc/yum.repos.d /etc/yum.repos.d.bak[rootlocalhost ~]# cp -r /etc/yum.repos.d/ /etc/yum.repos.d.ori/ //復制rm -f /etc/yum.repos.d/*[rootlocalh…

如何在Word文檔中添加頁眉或頁腳

Headers and footers are useful for adding things such as page numbers, dates, file names, and disclaimers to documents. Word allows you to add headers and footers with built-in, ready-made layouts or add your own custom headers and footers. 頁眉和頁腳對于在…

python基礎知識-8-三元和一行代碼(推導式)

python其他知識目錄 1、三元運算(三目運算) 三元運算符就是在賦值變量的時候,可以直接加判斷,然后賦值格式:[on_true] if [expression] else [on_false]res 值1 if 條件 else 值2 其他語言類似結構:判段的…

雙11成交多少和我無關,但這個魔性MV真的讓我笑噴!

今年天貓雙11,印象最深的就是“祝你雙11快樂”這句話!它讓大家感覺到雙11不再只是一個購物節,而是一個能引起廣泛共鳴、讓大家有快樂情感的真正節日。以往的傳統節日,都有一個標志性的符號,正如腦海中的每年春晚&#…

ios beta 下載_如何回滾到iOS 10(如果您使用的是iOS 11 Beta)

ios beta 下載So you’ve installed the iOS 11 beta and, well, you don’t love it. No problem, because you can roll right back to iOS 10. 因此,您已經安裝了iOS 11 Beta ,但是,您不喜歡它。 沒問題,因為您可以直接回滾到i…

JmsTemplate sendAndReceive 設置超時

通過調用sendAndReceive方法,實現發送消息之后可以同步接收返回信息。 Message replyMsg this.jmsQueueTemplate.sendAndReceive(new MessageCreator(){Overridepublic Message createMessage(Session sn) throws JMSException {TextMessage txtMsg sn.createText…

亞信科技數據庫AntDB通過金融分布式事務數據庫標準測試

近日,南京, 中國信息通信研究院云計算與大數據研究所(以下簡稱“中國信通院云大所”)組織專家對亞信科技(股票代碼:01675.HK)的數據庫產品AISWare AntDB(以下簡稱“AntDB”),進行了金融分布式事務數據庫標準測試,所有功能順利通過測試。該測試的通過充分彰顯了亞信科技AntDB是一…

安裝sql2012 需要安裝net3.5 沒有的話 安裝不成功

Error while enabling Windows feature : NetFx3, Error Code : -2146498298 在 Windows 8 或 Windows Server 2012 中安裝 .NET Framework 3.5 時出現錯誤代碼:0x800F0906 winx 管理員權限 打開cmd命令提示符處,運行下面的命令: Dism /onl…

instagram發布工具_如何在不發布照片的情況下保存已編輯的Instagram照片

instagram發布工具Unfortunately, there’s no built-in method for saving your edited Instagram photos without posting them first. However, with this neat trick, you can add Instagram filters to your photos and save them locally to your phone without actually…

Verify the Developer App certificate for your account is trusted on your device.

1、報錯內容 Could not launch “CH5203” Verify the Developer App certificate for your account is trusted on your device. Open Settings on 測試 and navigate to General -> Device Management, then select your Developer App certificate to trust it. 2、解決方…

HTTP2和HTTPS來不來了解一下?

一、前言 只有光頭才能變強 HTTP博文回顧: PC端:HTTP就是這么簡單PC端:HTTP面試題都在這里微信公眾號端:HTTP就是這么簡單微信公眾號端:HTTP面試題都在這里本文力求簡單講清每個知識點,希望大家看完能有所收…

apple默認備份位置_如何將Apple Maps默認設置為步行路線

apple默認備份位置The default mode of transportation in Apple Maps is set to driving, but with a simple tweak, you can adjust your Apple Maps experience to default to the mode you use most. Apple Maps中的默認交通方式設置為行車,但是通過簡單的調整&…

php 面向對象

1類的創建 class創建類 class Person{} 2.對象的創建 使用new關鍵字 class Person{} $p1new Person 3.成員的添加 添加成員需要 三個修飾符 public 公開的 定義公共的屬性和方法,類的外部,類的內部,子類都可以使用 protected 受保護的 定義…

apache 404\403錯誤頁面跳轉

1、全局下使用404跳轉 在httpd.conf下配置跳轉 1vim /usr/local/httpd/conf/httpd.conf 123456<Directory "/usr/local/httpd-2.4.25/htdocs"> AllowOverride None Require all granted ErrorDocument 404 /aa.jpg #配置跳轉頁面&#xff0c;注意aa文件必須在…

JS實現千分位

方法一&#xff1a;正則實現 function format (num) { var reg/\d{1,3}(?(\d{3})$)/g; return (num ).replace(reg, $&,); } 解釋&#xff1a; 1、正則表達式 \d{1,3}(?(\d{3})$) 表示前面有1~3個數字&#xff0c;后面的至少由一組3個數字結尾 2、?表示正向引用&…