人工智能底層構(gòu)架,認(rèn)識(shí)HBase數(shù)據(jù)模型

      網(wǎng)友投稿 828 2022-05-28

      人工智能作為當(dāng)前最熱門的技術(shù),其根本上離不開大數(shù)據(jù)的支持。如果把人工智能比喻成一個(gè)神經(jīng)網(wǎng)絡(luò),那么數(shù)據(jù)則是在這個(gè)神經(jīng)網(wǎng)絡(luò)中用來(lái)傳遞信息的化學(xué)物質(zhì),沒(méi)有信息傳遞的神經(jīng)網(wǎng)絡(luò)顯然不名一文,因此大數(shù)據(jù)扮演著人工智能基石的角色。

      Hadoop生態(tài)系統(tǒng)的HDFS和MapReduce分別為大數(shù)據(jù)提供了存儲(chǔ)和分析處理能力,但是對(duì)在線實(shí)時(shí)的數(shù)據(jù)存取則無(wú)能為力,而HBase作為Apache頂級(jí)項(xiàng)目,彌補(bǔ)了Hadoop的這一缺陷,滿足了在線實(shí)時(shí)系統(tǒng)低延時(shí)的需求。目前HBase在各大互聯(lián)網(wǎng)公司幾乎都有應(yīng)用,前景廣闊。

      HBase的數(shù)據(jù)模型與傳統(tǒng)數(shù)據(jù)庫(kù)相比更加靈活,使用之前無(wú)須預(yù)先定義一個(gè)所謂的表模式(Schema),同一個(gè)表中不同行數(shù)據(jù)可以包含不同的列,而且HBase對(duì)列的數(shù)量并沒(méi)有限制。

      當(dāng)然如果一行包括太多的列,就會(huì)對(duì)性能產(chǎn)生負(fù)面影響。HBase很適合存儲(chǔ)不確定列、不確定大小的半結(jié)構(gòu)化數(shù)據(jù)。

      邏輯模型

      HBase是一個(gè)鍵值(key-value)型數(shù)據(jù)庫(kù)。HBase數(shù)據(jù)行可以類比成一個(gè)多重映射(map),通過(guò)多重的鍵(key)一層層遞進(jìn)可以定位一個(gè)值(value)。因?yàn)镠Base數(shù)據(jù)行列值可以是空白的(這些空白列是不占用存儲(chǔ)空間的),所以HBase存儲(chǔ)的數(shù)據(jù)是稀疏的。

      下面解釋一下與HBase邏輯模型相關(guān)的名詞。

      (1)表(table):類似于關(guān)系型數(shù)據(jù)庫(kù)中的表,即數(shù)據(jù)行的集合。表名用字符串表示,一個(gè)表可以包含一個(gè)或者多個(gè)分區(qū)(region)。

      (2)行鍵(row key):用來(lái)標(biāo)識(shí)表中唯一的一行數(shù)據(jù),以字節(jié)數(shù)組形式存儲(chǔ),類似于關(guān)系型數(shù)據(jù)庫(kù)中表的主鍵(不同的是從底層存儲(chǔ)來(lái)說(shuō),行鍵其實(shí)并不能唯一標(biāo)識(shí)一行數(shù)據(jù),因?yàn)镠Base數(shù)據(jù)行可以有多個(gè)版本。

      但是,一般在不指定版本或者數(shù)據(jù)時(shí)間戳的情況下,用行鍵可以獲取到當(dāng)前最新生效的這行數(shù)據(jù),因此從用戶視圖來(lái)說(shuō),默認(rèn)情況下行鍵能夠標(biāo)識(shí)唯一一行數(shù)據(jù)),同時(shí)行鍵也是HBase表中最直接最高效的索引,表中數(shù)據(jù)按行鍵的字典序排序。

      人工智能的底層構(gòu)架,認(rèn)識(shí)HBase數(shù)據(jù)模型

      (3)列族(column family):HBase是一個(gè)列式存儲(chǔ)數(shù)據(jù)庫(kù),所謂列式就是根據(jù)列族存儲(chǔ),每個(gè)列族一個(gè)存儲(chǔ)倉(cāng)庫(kù)(Store),每個(gè)Store有多個(gè)存儲(chǔ)文件(StoreFile)用來(lái)存儲(chǔ)實(shí)際數(shù)據(jù)。

      (4)列限定符(column qualifier):每個(gè)列族可以有任意個(gè)列限定符用來(lái)標(biāo)識(shí)不同的列,這個(gè)列也類似于關(guān)系型數(shù)據(jù)庫(kù)表的一列,與關(guān)系型數(shù)據(jù)庫(kù)不同的是列無(wú)須在表創(chuàng)建時(shí)指定,可以在需要使用時(shí)動(dòng)態(tài)加入。

      (5)單元格(cell):?jiǎn)卧裼尚墟I、列族、列限定符、時(shí)間戳、類型(Put、Delete等用來(lái)標(biāo)識(shí)數(shù)據(jù)是有效還是刪除狀態(tài))唯一決定,是HBase數(shù)據(jù)的存儲(chǔ)單元,以字節(jié)碼的形式存儲(chǔ)。

      (6)版本(version):HBase數(shù)據(jù)寫入后是不會(huì)被修改的,數(shù)據(jù)的Put等操作在寫入預(yù)寫入日志(Write-Ahead-Log,WAL)(類似于Oracle Redo Log)后,會(huì)先寫入內(nèi)存?zhèn)}庫(kù)(MemStore),同時(shí)在內(nèi)存中按行鍵排序,等到合適的時(shí)候會(huì)將MemStore中的數(shù)據(jù)刷新到磁盤的StoreFile文件。

      因?yàn)閿?shù)據(jù)已經(jīng)排序,所以只需順序?qū)懭氪疟P,這樣的順序?qū)懭雽?duì)磁盤來(lái)說(shuō)效率很高。由于數(shù)據(jù)不會(huì)被修改,因此帶來(lái)的問(wèn)題就是數(shù)據(jù)會(huì)有多個(gè)版本,這些數(shù)據(jù)都會(huì)有一個(gè)時(shí)間戳用來(lái)標(biāo)識(shí)數(shù)據(jù)的寫入時(shí)間。

      (7)分區(qū)(region):當(dāng)傳統(tǒng)數(shù)據(jù)庫(kù)表的數(shù)據(jù)量過(guò)大時(shí),我們通常會(huì)考慮對(duì)表做分庫(kù)分表。例如,淘寶的訂單系統(tǒng)可以按買家ID與按賣家ID分別分庫(kù)分表。同樣HBase中分區(qū)也是一個(gè)類似的概念,分區(qū)是集群中高可用、動(dòng)態(tài)擴(kuò)展、負(fù)載均衡的最小單元,一個(gè)表可以分為任意個(gè)分區(qū)并且均衡分布在集群中的每臺(tái)機(jī)器上,分區(qū)按行鍵分片,可以在創(chuàng)建表的時(shí)候預(yù)先分片,也可以在之后需要的時(shí)候調(diào)用HBase shell命令行或者API動(dòng)態(tài)分片。

      接下來(lái)以用戶行為管理系統(tǒng)為例,假設(shè)現(xiàn)在需要用HBase來(lái)存儲(chǔ)電商系統(tǒng)的用戶行為數(shù)據(jù),表s_behavior用來(lái)存儲(chǔ)這些行為數(shù)據(jù),兩個(gè)列族pc和ph分別存儲(chǔ)電腦端與手機(jī)端的行為數(shù)據(jù),列v用來(lái)存儲(chǔ)用戶瀏覽記錄,列o用來(lái)存儲(chǔ)用戶的下單記錄,圖1-1描述了這個(gè)表的HBase邏輯視圖。

      圖1-1 HBase邏輯視圖

      HBase按行鍵的字典序存儲(chǔ)數(shù)據(jù)行,其數(shù)據(jù)存儲(chǔ)層級(jí)可以用如下的一個(gè)Java中的Map結(jié)構(gòu)類比:

      Map?>>

      如下代碼可以用來(lái)定位到某個(gè)鍵值對(duì)(或者說(shuō)單元格):

      代碼清單3-1的JSON字符串同樣近似地描述了這個(gè)多維的Map。

      代碼清單3-1 HBase邏輯視圖類比JSON

      物理模型

      HBase是一個(gè)列式存儲(chǔ)數(shù)據(jù)庫(kù),數(shù)據(jù)按列族聚簇存儲(chǔ)在存儲(chǔ)文件(StoreFile)中,空白的列單元格不會(huì)被存儲(chǔ),圖1-2描述了HBase表的物理存儲(chǔ)模型。

      (1)HBase中表按照行鍵的范圍被劃分為不同的分區(qū)(Region),各個(gè)分區(qū)由分區(qū)服務(wù)器負(fù)責(zé)管理并提供數(shù)據(jù)讀寫服務(wù),HBase主節(jié)點(diǎn)進(jìn)程(HMaster)負(fù)責(zé)分區(qū)的分配以及在集群中的遷移。

      (2)一個(gè)分區(qū)同時(shí)有且僅由一個(gè)分區(qū)服務(wù)器提供服務(wù)。當(dāng)分區(qū)增長(zhǎng)到配置的大小后,如果開啟了自動(dòng)拆分(也可以手動(dòng)拆分或者建表時(shí)預(yù)先拆分),則分區(qū)服務(wù)器會(huì)負(fù)責(zé)將這個(gè)分區(qū)拆分成兩個(gè)。

      每個(gè)分區(qū)都有一個(gè)唯一的分區(qū)名,格式是“ <表名,startrowkey,創(chuàng)建時(shí)間> ”。一個(gè)分區(qū)下的每個(gè)列族都會(huì)有一個(gè)存儲(chǔ)倉(cāng)庫(kù)(Store),因此一個(gè)表有幾個(gè)列族,那么每個(gè)分區(qū)就會(huì)有幾個(gè)存儲(chǔ)倉(cāng)庫(kù)。

      (3)每個(gè)Store(存儲(chǔ)倉(cāng)庫(kù))有且僅有一個(gè)MemStore(內(nèi)存?zhèn)}庫(kù)),但是可以有多個(gè)存儲(chǔ)文件。當(dāng)分區(qū)服務(wù)器處理寫入請(qǐng)求時(shí),數(shù)據(jù)的變更操作在寫入WAL后,會(huì)先寫入MemStore,同時(shí)在內(nèi)存中按行鍵排序。

      當(dāng)MemStore到達(dá)配置的大小或者集群中所有MemStore使用的總內(nèi)存達(dá)到配置的閾值百分比時(shí),MemStore會(huì)刷新為一個(gè)StoreFile(存儲(chǔ)文件)到磁盤,存儲(chǔ)文件只會(huì)順序?qū)懭耄恢С中薷摹?/p>

      (4)數(shù)據(jù)塊(block)是HBase中數(shù)據(jù)讀取的最小單元,StoreFile由數(shù)據(jù)塊組成,可以在建表時(shí)按列族指定表數(shù)據(jù)的數(shù)據(jù)塊大小。如果開啟了HBase的數(shù)據(jù)壓縮功能,數(shù)據(jù)在寫入StoreFile之前會(huì)按數(shù)據(jù)塊進(jìn)行壓縮,讀取時(shí)同樣對(duì)數(shù)據(jù)塊解壓后再放入緩存。理想情況下,每次讀取數(shù)據(jù)的大小都是指定的數(shù)據(jù)塊大小的倍數(shù),這樣可以避免一些無(wú)效的IO,效率最高。

      圖1-2 HBase物理視圖

      圖1-3描述了上面提到的表和分區(qū)等各模塊分別由HBase的哪些進(jìn)程負(fù)責(zé)管理。

      圖1-3 HBase模塊交互圖

      (1)HMaster:負(fù)責(zé)監(jiān)控集群中所有的分區(qū)服務(wù)器進(jìn)程,負(fù)責(zé)所有元數(shù)據(jù)的更新(如分區(qū)由哪個(gè)分區(qū)服務(wù)器提供服務(wù))。

      (2)HMaster同時(shí)負(fù)責(zé)分區(qū)在分區(qū)服務(wù)器中的負(fù)載均衡,在一個(gè)分布式集群中,HMaster進(jìn)程通常與Hadoop的NameNode運(yùn)行在同一個(gè)節(jié)點(diǎn),每個(gè)集群會(huì)部署至少兩個(gè)HMaster節(jié)點(diǎn),一個(gè)作為活躍節(jié)點(diǎn)提供服務(wù),另一個(gè)作為備用節(jié)點(diǎn)提供快速的災(zāi)備切換,保證集群的高可用。

      (3)HRegionServer:管理其負(fù)責(zé)的分區(qū),處理分區(qū)的讀寫請(qǐng)求、分區(qū)增大的拆分(split)以及分區(qū)的壓縮(compact)。HBase客戶端根據(jù)元數(shù)據(jù)(客戶端從HMaster獲取到元數(shù)據(jù)后會(huì)緩存在本地,當(dāng)分區(qū)操作拋出特定異常后會(huì)從HMaster刷新緩存)定位到操作數(shù)據(jù)對(duì)應(yīng)的分區(qū)所在分區(qū)服務(wù)器之后,HBase客戶端對(duì)數(shù)據(jù)的讀寫就直接與分區(qū)服務(wù)器交互,因此對(duì)分區(qū)的讀寫不會(huì)對(duì)HMaster造成壓力。

      HRegionServer進(jìn)程通常與Hadoop的DataNode運(yùn)行在同一個(gè)節(jié)點(diǎn),這樣對(duì)數(shù)據(jù)的讀取可以盡量做到本地讀取,減少網(wǎng)絡(luò)請(qǐng)求。

      (4)WAL:默認(rèn)情況下一個(gè)分區(qū)服務(wù)器僅有一個(gè)WAL。HBase客戶端數(shù)據(jù)請(qǐng)求操作會(huì)先寫入WAL文件再寫入內(nèi)存?zhèn)}庫(kù)MemStore,這樣當(dāng)分區(qū)服務(wù)器宕機(jī)重啟的時(shí)候,可以用WAL來(lái)恢復(fù)分區(qū)服務(wù)器的狀態(tài)(如MemStore中更新的數(shù)據(jù)沒(méi)有刷新到StoreFile持久化,則分區(qū)服務(wù)器啟動(dòng)時(shí)需要通過(guò)WAL重做(replay)數(shù)據(jù)更新來(lái)恢復(fù))。

      如果數(shù)據(jù)操作寫入WAL失敗,則這個(gè)更新數(shù)據(jù)的請(qǐng)求也會(huì)失敗。由于一個(gè)分區(qū)服務(wù)器只有一個(gè)WAL,對(duì)WAL的寫入必須是順序?qū)懭耄@里可能導(dǎo)致性能瓶頸,HBase1.0引入了mutiWAL的支持,mutiWAL允許分區(qū)服務(wù)器并發(fā)地寫入多個(gè)WAL,這個(gè)并發(fā)來(lái)自于對(duì)WAL更新按分區(qū)分組,也就是說(shuō)不同分區(qū)可以支持并發(fā)寫多個(gè)WAL,因此mutiWAL無(wú)法提升對(duì)單個(gè)分區(qū)的高并發(fā)更新的性能。

      (5)Store:每個(gè)分區(qū)的每個(gè)列族對(duì)應(yīng)一個(gè)存儲(chǔ)倉(cāng)庫(kù),一個(gè)存儲(chǔ)倉(cāng)庫(kù)包含一個(gè)MemStore和多個(gè)存儲(chǔ)文件。當(dāng)MemStore的大小達(dá)到了配置的閾值后,MemStore會(huì)刷新為一個(gè)存儲(chǔ)文件,存儲(chǔ)文件順序?qū)懭耄恢С中薷模訦File的形式存儲(chǔ)在Hadoop的DataNode中。

      (6)MemStore:MemStore位于分區(qū)服務(wù)器的堆內(nèi)存,數(shù)據(jù)在寫入MemStore的時(shí)候即會(huì)按行鍵排序,這樣刷新到存儲(chǔ)文件的時(shí)候可以直接順序?qū)懭耄岣邔懶阅堋M瑫r(shí),MemStore作為一個(gè)內(nèi)存級(jí)緩存,能夠提供對(duì)新寫入數(shù)據(jù)的快速訪問(wèn)(新插入數(shù)據(jù)總是比老數(shù)據(jù)使用頻繁)。

      《HBase入門與實(shí)踐》

      彭旭?著

      本書以精練的語(yǔ)言介紹HBase的基礎(chǔ)知識(shí),讓初學(xué)者能夠快速上手使用HBase,對(duì)HBase的核心思想(如數(shù)據(jù)讀取、數(shù)據(jù)備份等)和HBase架構(gòu)(如LSM樹、WAL)有深入的分析,讓有經(jīng)驗(yàn)的HBase開發(fā)人員也能夠循序漸進(jìn)地深入理解HBase源碼,以便更好地去調(diào)試和解決線上遇到的各種問(wèn)題。本書更加專注HBase在線實(shí)時(shí)系統(tǒng)的調(diào)優(yōu),讓HBase集群響應(yīng)延遲更低,能夠更好地為在線實(shí)時(shí)系統(tǒng)服務(wù)。

      本文轉(zhuǎn)載自異步社區(qū)。

      hbase 軟件開發(fā) 大數(shù)據(jù)

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:突破Java面試(23-6) - Redis主從架構(gòu)如何實(shí)現(xiàn)高可用
      下一篇:RocketMQ 集群平滑運(yùn)維
      相關(guān)文章
      亚洲A丁香五香天堂网| 亚洲最大免费视频网| 亚洲午夜在线一区| 亚洲国产综合专区在线电影 | 亚洲XX00视频| 精品国产日韩亚洲一区91| 亚洲色丰满少妇高潮18p| 456亚洲人成在线播放网站| 亚洲人成伊人成综合网久久| 久久亚洲sm情趣捆绑调教| 中文字幕在线观看亚洲| 亚洲美女精品视频| 亚洲毛片基地日韩毛片基地| 亚洲欧洲尹人香蕉综合| 亚洲av日韩av综合| 亚洲国产精品一区二区三区在线观看| 亚洲人成在久久综合网站| 亚洲中文字幕无码久久2020| 亚洲综合精品第一页| 亚洲国产一区二区三区在线观看| 亚洲а∨精品天堂在线| 相泽南亚洲一区二区在线播放| 国产亚洲福利精品一区二区| 亚洲第一网站男人都懂| 在线日韩日本国产亚洲| 亚洲精品少妇30p| 亚洲激情中文字幕| 亚洲欧洲日韩国产| 亚洲粉嫩美白在线| 亚洲老熟女五十路老熟女bbw | 亚洲人成色77777在线观看| 亚洲丁香婷婷综合久久| 亚洲AV无码乱码在线观看性色扶| 亚洲A丁香五香天堂网| 亚洲人成网站在线播放vr| 亚洲AV日韩AV天堂一区二区三区| 精品无码一区二区三区亚洲桃色 | 亚洲午夜激情视频| 久久91亚洲人成电影网站| 亚洲尹人九九大色香蕉网站| 亚洲国产高清美女在线观看 |