溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

HBase面試題有哪些

發(fā)布時(shí)間:2021-12-08 14:31:04 來源:億速云 閱讀:148 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“HBase面試題有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“HBase面試題有哪些”吧!

1. HBase是什么?HBase的特點(diǎn)是什么?

  1. Hbase一個(gè)分布式的基于列式存儲(chǔ)的數(shù)據(jù)庫,基于Hadoop的 hdfs 存儲(chǔ),zookeeper 進(jìn)行管理。

  2. Hbase適合存儲(chǔ)半結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù),對(duì)于數(shù)據(jù)結(jié)構(gòu)字段不夠確定或者雜亂無章很難按一個(gè)概念去抽取的數(shù)據(jù)。

  3. Hbase 為 null 的記錄不會(huì)被存儲(chǔ)。

  4. 基于的表包含 rowkey,時(shí)間戳,和列族。新寫入數(shù)據(jù)時(shí),時(shí)間戳更新, 同時(shí)可以查詢到以前的版本。

  5. hbase 是主從架構(gòu)。hmaster 作為主節(jié)點(diǎn),hregionserver 作為從節(jié)點(diǎn)。

  6. 大:一個(gè)表可以有數(shù)十億行,上百萬列;

  7. 無模式:每行都有一個(gè)可排序的主鍵和任意多的列,列可以根據(jù)需要?jiǎng)討B(tài)的增加,同一
    張表中不同的行可以有截然不同的列;

  8. 面向列:面向列(族)的存儲(chǔ)和權(quán)限控制,列(族)獨(dú)立檢索;

  9. 稀疏:空(null)列并不占用存儲(chǔ)空間,表可以設(shè)計(jì)的非常稀疏;

  10. 數(shù)據(jù)多版本:每個(gè)單元中的數(shù)據(jù)可以有多個(gè)版本,默認(rèn)情況下版本號(hào)自動(dòng)分配,是單元
    格插入時(shí)的時(shí)間戳;

  11. 數(shù)據(jù)類型單一:Hbase 中的數(shù)據(jù)都是字符串,沒有類型。
     

2. HBase如何導(dǎo)入數(shù)據(jù)?

  1. 通過HBase API進(jìn)行批量寫入數(shù)據(jù);

  2. 使用Sqoop工具批量導(dǎo)數(shù)到HBase集群;

  3. 使用MapReduce批量導(dǎo)入;

  4. HBase BulkLoad的方式。

  5. HBase 通過Hive 關(guān)聯(lián)導(dǎo)入數(shù)據(jù)

HBase API 跟 MapReduce寫入方式在面對(duì)大數(shù)據(jù)量寫入的時(shí)候效率會(huì)很低下,因?yàn)樗鼈兌际峭ㄟ^請(qǐng)求regionserver將數(shù)據(jù)寫入,這期間數(shù)據(jù)會(huì)先寫入memstore,memstore達(dá)到閾值后會(huì)刷寫到磁盤生成hfile文件,hfile文件過多時(shí)會(huì)發(fā)生compaction,如果region大小過大時(shí)也會(huì)發(fā)生split。這些因素都會(huì)影響hbase數(shù)據(jù)寫入的效率,因此在面臨大數(shù)據(jù)寫入時(shí),這兩種方式是不合適的。

而bulkload正好解決了這個(gè)問題,bulkload 工具是將數(shù)據(jù)直接寫入到hfile文件中,寫入完畢后,通知hbase去加載這些hfile文件,因此可以避免上述耗時(shí)的因素,大大增加了數(shù)據(jù)寫入的效率。下面就來講述下如何利用bulkloan加載數(shù)據(jù)。

HBase面試題有哪些

4. Hbase 和 hive 有什么區(qū)別?hive 與 hbase 的底層存儲(chǔ)是什么?hive 是產(chǎn)生的原因是什么?habase 是為了彌補(bǔ) hadoop 的什么缺陷?

共同點(diǎn)

  1. hbase與hive都是架構(gòu)在hadoop之上的。都是用hadoop作為底層存儲(chǔ)。

區(qū)別

  1. Hive是建立在Hadoop之上為了減少M(fèi)apReduce jobs編寫工作的批處理系統(tǒng),HBase是為了支持彌補(bǔ)Hadoop對(duì)實(shí)時(shí)操作的缺陷的項(xiàng)目 。

  2. 想象你在操作RMDB數(shù)據(jù)庫,如果是全表掃描,就用Hive+Hadoop,如果是索引訪問,就用HBase+Hadoop;

  3. Hive query就是MapReduce jobs可以從5分鐘到數(shù)小時(shí)不止,HBase是非常高效的,肯定比Hive高效的多;

  4. Hive本身不存儲(chǔ)和計(jì)算數(shù)據(jù),它完全依賴于 HDFS 和 MapReduce,Hive中的表純邏輯;

  5. hive借用hadoop的MapReduce來完成一些hive中的命令的執(zhí)行;

  6. hbase是物理表,不是邏輯表,提供一個(gè)超大的內(nèi)存hash表,搜索引擎通過它來存儲(chǔ)索引,方便查詢操作;

  7. hbase是列存儲(chǔ);

  8. hdfs 作為底層存儲(chǔ),hdfs 是存放文件的系統(tǒng),而 Hbase 負(fù)責(zé)組織文件;

  9. hive 需要用到 hdfs 存儲(chǔ)文件,需要用到 MapReduce 計(jì)算框架。

5. 解釋下 hbase 實(shí)時(shí)查詢的原理

實(shí)時(shí)查詢,可以認(rèn)為是從內(nèi)存中查詢,一般響應(yīng)時(shí)間在 1 秒內(nèi)。HBase 的機(jī)制是數(shù)據(jù)先寫入到內(nèi)存中,當(dāng)數(shù)據(jù)量達(dá)到一定的量(如 128M),再寫入磁盤中, 在內(nèi)存中,是不進(jìn)行數(shù)據(jù)的更新或合并操作的,只增加數(shù)據(jù),這使得用戶的寫操作只要進(jìn)入內(nèi)存中就可以立即返回,保證了 HBase I/O 的高性能

6. 描述 Hbase 的 rowKey 的設(shè)計(jì)原則

聯(lián)系 region 和 rowkey 關(guān)系說明,設(shè)計(jì)可參考以下三個(gè)原則.

     1. rowkey 長(zhǎng)度原則
rowkey 是一個(gè)二進(jìn)制碼流,可以是任意字符串,最大長(zhǎng)度 64kb,實(shí)際應(yīng)用中一般為 10-100bytes,以 byte[] 形式保存,一般設(shè)計(jì)成定長(zhǎng)。建議越短越好,不要超過 16 個(gè)字節(jié), 原因如下:

數(shù)據(jù)的持久化文件 HFile 中是按照 KeyValue 存儲(chǔ)的,如果 rowkey 過長(zhǎng)會(huì)極大影響 HFile 的存儲(chǔ)效率 MemStore 將緩存部分?jǐn)?shù)據(jù)到內(nèi)存,如果 rowkey 字段過長(zhǎng),內(nèi)存的有效利用率就會(huì)降低,系統(tǒng)不能緩存更多的數(shù)據(jù),這樣會(huì)降低檢索效率

     2. rowkey 散列原則
如果 rowkey 按照時(shí)間戳的方式遞增,不要將時(shí)間放在二進(jìn)制碼的前面,建議將 rowkey 的高位作為散列字段,由程序隨機(jī)生成,低位放時(shí)間字段,這樣將提高數(shù)據(jù)均衡分布在每個(gè) RegionServer,以實(shí)現(xiàn)負(fù)載均衡的幾率。如果沒有散列字段,首字段直接是時(shí)間信息,所有的數(shù)據(jù)都會(huì)集中在一個(gè) RegionServer 上,這樣在數(shù)據(jù)檢索的時(shí)候負(fù)載會(huì)集中在個(gè)別的 RegionServer 上,造成熱點(diǎn)問題,會(huì)降低查詢效率。

     3. rowkey 唯一原則
必須在設(shè)計(jì)上保證其唯一性,rowkey 是按照字典順序排序存儲(chǔ)的,因此, 設(shè)計(jì) rowkey 的時(shí)候,要充分利用這個(gè)排序的特點(diǎn),將經(jīng)常讀取的數(shù)據(jù)存儲(chǔ)到一塊,將最近可能會(huì)被訪問的數(shù)據(jù)放到一塊。

7. 描述 Hbase 中 scan 和 get 的功能以及實(shí)現(xiàn)的異同

  1. 按指定RowKey 獲取唯 一 一 條 記 錄 , get 方法( org.apache.hadoop.hbase.client.Get ) Get的方法處理分兩種 : 設(shè)置了ClosestRowBefore和沒有設(shè)置的 rowlock 主要是用來保證行的事務(wù)性,即每個(gè)get 是以一個(gè) row 來標(biāo)記的.一個(gè) row 中可以有很多 family 和 column。

  2. 按指定的條件獲取一批記錄,scan 方法(org.apache.Hadoop.hbase.client.Scan)實(shí)現(xiàn)條件查詢功能使用的就是 scan 方式

  3. 1. scan 可以通過 setCaching 與 setBatch 方法提高速度(以空間換時(shí)間);
    2. scan 可以通過 setStartRow 與 setEndRow 來限定范圍([start,end]start? 是閉區(qū)間,end 是開區(qū)間)。范圍越小,性能越高;
    3. scan 可以通過 setFilter 方法添加過濾器,這也是分頁、多條件查詢的基礎(chǔ)。 3.全表掃描,即直接掃描整張表中所有行記錄。


8. 請(qǐng)?jiān)敿?xì)描述 Hbase 中一個(gè) Cell 的結(jié)構(gòu)

HBase 中通過 row 和 columns 確定的為一個(gè)存貯單元稱為 cell。Cell:由{row key, CF,Columns, version}是唯一確定的單元cell 中的數(shù)據(jù)是沒有類型的,全部是字節(jié)碼形式存貯。

9. 簡(jiǎn)述 HBASE 中 compact 用途是什么,什么時(shí)候觸發(fā),分為哪兩種,有什么區(qū)別,有哪些相關(guān)配置參數(shù)?

在 hbase 中每當(dāng)有 memstore 數(shù)據(jù) flush 到磁盤之后,就形成一個(gè) storefile, 當(dāng) storeFile 的數(shù)量達(dá)到一定程度后,就需要將 storefile 文件來進(jìn)行 compaction 操作。Compact 的作用:

  1. 合并文件

  2. 清除過期,多余版本的數(shù)據(jù)

  3. 提高讀寫數(shù)據(jù)的效率

10. HBase 中實(shí)現(xiàn)了兩種 compaction 的方式 : minor and major這兩種compaction 方式的區(qū)別是:

  1. Minor 操作只用來做部分文件的合并操作以及包括 minVersion=0 并且設(shè)置 TTL 的過期版本清理,不做任何刪除數(shù)據(jù)、多版本數(shù)據(jù)的清理工作;

  2. Major 操作是對(duì) Region 下的 HStore 下的所有 StoreFile 執(zhí)行合并操作, 最終的結(jié)果是整理合并出一個(gè)文件。

  3. Minor and Major 合并規(guī)則

11. 簡(jiǎn)述 Hbase filter 的實(shí)現(xiàn)原理是什么?結(jié)合實(shí)際項(xiàng)目經(jīng)驗(yàn),寫出幾個(gè)使用filter 的場(chǎng)景。

HBase 為篩選數(shù)據(jù)提供了一組過濾器,通過這個(gè)過濾器可以在 HBase 中的數(shù)據(jù)的多個(gè)維度(行,列,數(shù)據(jù)版本)上進(jìn)行對(duì)數(shù)據(jù)的篩選操作,也就是說過濾器最終能夠篩選的數(shù)據(jù)能夠細(xì)化到具體的一個(gè)存儲(chǔ)單元格上(由行鍵, 列名,時(shí)間戳定位)。

RowFilter、PrefixFilter。hbase 的 filter 是通過 scan 設(shè)置的,所以是基于 scan 的查詢結(jié)果進(jìn)行過濾. 過濾器的類型很多,但是可以分為兩大類——比較過濾器,專用過濾器。過濾器的作用是在服務(wù)端判斷數(shù)據(jù)是否滿足條件,然后只將滿足條件的數(shù)據(jù)返回給客戶端;如在進(jìn)行訂單開發(fā)的時(shí)候,我們使用 rowkeyfilter 過濾出某個(gè)用戶的所有訂單。

12. Hbase 內(nèi)部是什么機(jī)制?

在 HBase 中無論是增加新行還是修改已有的行,其內(nèi)部流程都是相同的。HBase 接到命令后存下變化信息,或者寫入失敗拋出異常。默認(rèn)情況下,執(zhí)行寫入時(shí)會(huì)寫到兩個(gè)地方:預(yù)寫式日志(write-ahead log,也稱 HLog)和 MemStore。HBase 的默認(rèn)方式是把寫入動(dòng)作記錄在這兩個(gè)地方,以保證數(shù)據(jù)持久化。只有當(dāng)這兩個(gè)地方的變化信息都寫入并確認(rèn)后,才認(rèn)為寫動(dòng)作完成。

MemStore 是內(nèi)存里的寫入緩沖區(qū),HBase 中數(shù)據(jù)在永久寫入硬盤之前在這里累積。當(dāng)MemStore 填滿后,其中的數(shù)據(jù)會(huì)刷寫到硬盤,生成一個(gè)HFile。HFile 是HBase 使用的底層存儲(chǔ)格式。HFile 對(duì)應(yīng)于列族,一個(gè)列族可以有多個(gè) HFile,但一個(gè) HFile 不能存儲(chǔ)多個(gè)列族的數(shù)據(jù)。在集群的每個(gè)節(jié)點(diǎn)上,每個(gè)列族有一個(gè)MemStore。大型分布式系統(tǒng)中硬件故障很常見,HBase 也不例外。

設(shè)想一下,如果MemStore 還沒有刷寫,服務(wù)器就崩潰了,內(nèi)存中沒有寫入硬盤的數(shù)據(jù)就會(huì)丟失。HBase 的應(yīng)對(duì)辦法是在寫動(dòng)作完成之前先寫入 WAL。HBase 集群中每臺(tái)服務(wù)器維護(hù)一個(gè) WAL 來記錄發(fā)生的變化。WAL 是底層文件系統(tǒng)上的一個(gè)文件。直到WAL 新記錄成功寫入后,寫動(dòng)作才被認(rèn)為成功完成。這可以保證 HBase 和支撐它的文件系統(tǒng)滿足持久性。

大多數(shù)情況下,HBase 使用Hadoop分布式文件系統(tǒng)(HDFS)來作為底層文件系統(tǒng)。如果 HBase 服務(wù)器宕機(jī),沒有從 MemStore 里刷寫到 HFile 的數(shù)據(jù)將可以通過回放 WAL 來恢復(fù)。你不需要手工執(zhí)行。Hbase 的內(nèi)部機(jī)制中有恢復(fù)流程部分來處理。每臺(tái) HBase 服務(wù)器有一個(gè) WAL,這臺(tái)服務(wù)器上的所有表(和它們的列族)共享這個(gè) WAL。你可能想到,寫入時(shí)跳過 WAL 應(yīng)該會(huì)提升寫性能。但我們不建議禁用 WAL, 除非你愿意在出問題時(shí)丟失數(shù)據(jù)。如果你想測(cè)試一下,如下代碼可以禁用 WAL: 注意:不寫入 WAL 會(huì)在 RegionServer 故障時(shí)增加丟失數(shù)據(jù)的風(fēng)險(xiǎn)。關(guān)閉 WAL, 出現(xiàn)故障時(shí) HBase 可能無法恢復(fù)數(shù)據(jù),沒有刷寫到硬盤的所有寫入數(shù)據(jù)都會(huì)丟失。

13. HBase 宕機(jī)如何處理?

宕機(jī)分為 HMaster 宕機(jī)和 HRegisoner 宕機(jī).

如果是 HRegisoner 宕機(jī),HMaster 會(huì)將其所管理的 region 重新分布到其他活動(dòng)的 RegionServer 上,由于數(shù)據(jù)和日志都持久在 HDFS 中,該操作不會(huì)導(dǎo)致數(shù)據(jù)丟失,所以數(shù)據(jù)的一致性和安全性是有保障的。

如果是 HMaster 宕機(jī), HMaster 沒有單點(diǎn)問題, HBase 中可以啟動(dòng)多個(gè)HMaster,通過 Zookeeper 的 Master Election 機(jī)制保證總有一個(gè) Master 運(yùn)行。即ZooKeeper 會(huì)保證總會(huì)有一個(gè) HMaster 在對(duì)外提供服務(wù)。

14. HRegionServer宕機(jī)如何處理?

  1. ZooKeeper 會(huì)監(jiān)控 HRegionServer 的上下線情況,當(dāng) ZK 發(fā)現(xiàn)某個(gè) HRegionServer 宕機(jī)之后會(huì)通知 HMaster 進(jìn)行失效備援;

  2. HRegionServer 會(huì)停止對(duì)外提供服務(wù),就是它所負(fù)責(zé)的 region 暫時(shí)停止對(duì)外提供服務(wù)

  3. HMaster 會(huì)將該 HRegionServer 所負(fù)責(zé)的 region 轉(zhuǎn)移到其他 HRegionServer 上,并且會(huì)對(duì) HRegionServer 上存在 memstore 中還未持久化到磁盤中的數(shù)據(jù)進(jìn)行恢復(fù);

  4. 這個(gè)恢復(fù)的工作是由 WAL重播 來完成,這個(gè)過程如下:

1. wal實(shí)際上就是一個(gè)文件,存在/hbase/WAL/對(duì)應(yīng)RegionServer路徑下
2. 宕機(jī)發(fā)生時(shí),讀取該RegionServer所對(duì)應(yīng)的路徑下的wal文件,然后根據(jù)不同的region切分成不同的臨時(shí)文件recover.edits
3. 當(dāng)region被分配到新的RegionServer中,RegionServer讀取region時(shí)會(huì)進(jìn)行是否存在recover.edits,如果有則進(jìn)行恢復(fù)

15. hbase寫數(shù)據(jù) 和 讀數(shù)據(jù)過程獲取region存儲(chǔ)位置信息

寫數(shù)據(jù)和讀數(shù)據(jù)一般都會(huì)獲取hbase的region的位置信息。大概步驟為:

  1. 從zookeeper中獲取.ROOT.表的位置信息,在zookeeper的存儲(chǔ)位置為/hbase/root-region-server;

  2. 根據(jù).ROOT.表中信息,獲取.META.表的位置信息;

  3. META.表中存儲(chǔ)的數(shù)據(jù)為每一個(gè)region存儲(chǔ)位置;

向hbase表中插入數(shù)據(jù)

hbase中緩存分為兩層:Memstore 和 BlockCache

  1. 首先寫入到 WAL文件 中,目的是為了數(shù)據(jù)不丟失;

  2. 再把數(shù)據(jù)插入到 Memstore緩存中,當(dāng) Memstore達(dá)到設(shè)置大小閾值時(shí),會(huì)進(jìn)行flush進(jìn)程;

  3. flush過程中,需要獲取每一個(gè)region存儲(chǔ)的位置。

從hbase中讀取數(shù)據(jù)

BlockCache 主要提供給讀使用。讀請(qǐng)求先到 Memtore中查數(shù)據(jù),查不到就到 BlockCache 中查,再查不到就會(huì)到磁盤上讀,并把讀的結(jié)果放入 BlockCache 。

BlockCache 采用的算法為 LRU(最近最少使用算法),因此當(dāng) BlockCache 達(dá)到上限后,會(huì)啟動(dòng)淘汰機(jī)制,淘汰掉最老的一批數(shù)據(jù)。

一個(gè) RegionServer 上有一個(gè) BlockCache 和N個(gè) Memstore,它們的大小之和不能大于等于 heapsize * 0.8,否則 hbase 不能啟動(dòng)。默認(rèn) BlockCache 為 0.2,而 Memstore 為 0.4。對(duì)于注重讀響應(yīng)時(shí)間的系統(tǒng),應(yīng)該將 BlockCache 設(shè)大些,比如設(shè)置BlockCache =0.4,Memstore=0.39。這會(huì)加大緩存命中率。

15. HBase優(yōu)化方法

優(yōu)化手段主要有以下四個(gè)方面

1. 減少調(diào)整

減少調(diào)整這個(gè)如何理解呢?HBase中有幾個(gè)內(nèi)容會(huì)動(dòng)態(tài)調(diào)整,如region(分區(qū))、HFile,所以通過一些方法來減少這些會(huì)帶來I/O開銷的調(diào)整

Region
如果沒有預(yù)建分區(qū)的話,那么隨著region中條數(shù)的增加,region會(huì)進(jìn)行分裂,這將增加I/O開銷,所以解決方法就是根據(jù)你的RowKey設(shè)計(jì)來進(jìn)行預(yù)建分區(qū),減少region的動(dòng)態(tài)分裂。

HFile
HFile是數(shù)據(jù)底層存儲(chǔ)文件,在每個(gè)memstore進(jìn)行刷新時(shí)會(huì)生成一個(gè)HFile,當(dāng)HFile增加到一定程度時(shí),會(huì)將屬于一個(gè)region的HFile進(jìn)行合并,這個(gè)步驟會(huì)帶來開銷但不可避免,但是合并后HFile大小如果大于設(shè)定的值,那么HFile會(huì)重新分裂。為了減少這樣的無謂的I/O開銷,建議估計(jì)項(xiàng)目數(shù)據(jù)量大小,給HFile設(shè)定一個(gè)合適的值

2. 減少啟停

數(shù)據(jù)庫事務(wù)機(jī)制就是為了更好地實(shí)現(xiàn)批量寫入,較少數(shù)據(jù)庫的開啟關(guān)閉帶來的開銷,那么HBase中也存在頻繁開啟關(guān)閉帶來的問題。

     1. 關(guān)閉Compaction,在閑時(shí)進(jìn)行手動(dòng)Compaction

因?yàn)镠Base中存在Minor Compaction和Major Compaction,也就是對(duì)HFile進(jìn)行合并,所謂合并就是I/O讀寫,大量的HFile進(jìn)行肯定會(huì)帶來I/O開銷,甚至是I/O風(fēng)暴,所以為了避免這種不受控制的意外發(fā)生,建議關(guān)閉自動(dòng)Compaction,在閑時(shí)進(jìn)行compaction

     2. 批量數(shù)據(jù)寫入時(shí)采用BulkLoad

如果通過HBase-Shell或者JavaAPI的put來實(shí)現(xiàn)大量數(shù)據(jù)的寫入,那么性能差是肯定并且還可能帶來一些意想不到的問題,所以當(dāng)需要寫入大量離線數(shù)據(jù)時(shí)建議使用BulkLoad

3. 減少數(shù)據(jù)量

雖然我們是在進(jìn)行大數(shù)據(jù)開發(fā),但是如果可以通過某些方式在保證數(shù)據(jù)準(zhǔn)確性同時(shí)減少數(shù)據(jù)量,何樂而不為呢?

     1. 開啟過濾,提高查詢速度
開啟BloomFilter,BloomFilter是列族級(jí)別的過濾,在生成一個(gè)StoreFile同時(shí)會(huì)生成一個(gè)MetaBlock,用于查詢時(shí)過濾數(shù)據(jù)

     2. 使用壓縮:一般推薦使用Snappy和LZO壓縮

4. 合理設(shè)計(jì)

在一張HBase表格中RowKeyColumnFamily的設(shè)計(jì)是非常重要,好的設(shè)計(jì)能夠提高性能和保證數(shù)據(jù)的準(zhǔn)確性

  1. RowKey設(shè)計(jì):應(yīng)該具備以下幾個(gè)屬性

  • 散列性:散列性能夠保證相同相似的rowkey聚合,相異的rowkey分散,有利于查詢

  • 簡(jiǎn)短性:rowkey作為key的一部分存儲(chǔ)在HFile中,如果為了可讀性將rowKey設(shè)計(jì)得過長(zhǎng),那么將會(huì)增加存儲(chǔ)壓力

  • 唯一性:rowKey必須具備明顯的區(qū)別性

  • 業(yè)務(wù)性:舉些例子

假如我的查詢條件比較多,而且不是針對(duì)列的條件,那么rowKey的設(shè)計(jì)就應(yīng)該支持多條件查詢
如果我的查詢要求是最近插入的數(shù)據(jù)優(yōu)先,那么rowKey則可以采用叫上Long.Max-時(shí)間戳的方式,這樣rowKey就是遞減排列
     2. 列族的設(shè)計(jì)

      列族的設(shè)計(jì)需要看應(yīng)用場(chǎng)景

      多列族設(shè)計(jì)的優(yōu)劣

優(yōu)勢(shì):
HBase中數(shù)據(jù)時(shí)按列進(jìn)行存儲(chǔ)的,那么查詢某一列族的某一列時(shí)就不需要全盤掃描,只需要掃描某一列族,減少了讀I/O;
其實(shí)多列族設(shè)計(jì)對(duì)減少的作用不是很明顯,適用于讀多寫少的場(chǎng)景。

劣勢(shì):
降低了寫的I/O性能。原因如下:數(shù)據(jù)寫到store以后是先緩存在memstore中,同一個(gè)region中存在多個(gè)列族則存在多個(gè)store,每個(gè)store都一個(gè)memstore,當(dāng)其實(shí)memstore進(jìn)行flush時(shí),屬于同一個(gè)region的store中的memstore都會(huì)進(jìn)行flush,增加I/O開銷。

16. 為什么不建議在 HBase 中使用過多的列族

在 Hbase 的表中,每個(gè)列族對(duì)應(yīng) Region 中的一個(gè)Store,Region的大小達(dá)到閾值時(shí)會(huì)分裂,因此如果表中有多個(gè)列族,則可能出現(xiàn)以下現(xiàn)象:

  1. 一個(gè)Region中有多個(gè)Store,如果每個(gè)CF的數(shù)據(jù)量分布不均勻時(shí),比如CF1為100萬,CF2為1萬,則Region分裂時(shí)導(dǎo)致CF2在每個(gè)Region中的數(shù)據(jù)量太少,查詢CF2時(shí)會(huì)橫跨多個(gè)Region導(dǎo)致效率降低。

  2. 如果每個(gè)CF的數(shù)據(jù)分布均勻,比如CF1有50萬,CF2有50萬,CF3有50萬,則Region分裂時(shí)導(dǎo)致每個(gè)CF在Region的數(shù)據(jù)量偏少,查詢某個(gè)CF時(shí)會(huì)導(dǎo)致橫跨多個(gè)Region的概率增大

  3. 多個(gè)CF代表有多個(gè)Store,也就是說有多個(gè)MemStore(2MB),也就導(dǎo)致內(nèi)存的消耗量增大,使用效率下降。

  4. Region 中的 緩存刷新 和 壓縮 是基本操作,即一個(gè)CF出現(xiàn)緩存刷新或壓縮操作,其它CF也會(huì)同時(shí)做一樣的操作,當(dāng)列族太多時(shí)就會(huì)導(dǎo)致IO頻繁的問題。

17. 為什么有HDFS還要用HBase?

  • 延遲: Mapreduce編程框架延遲較高,無法滿足大規(guī)模數(shù)據(jù)實(shí)時(shí)處理應(yīng)用的需求

  • 訪問: HDFS面向批量訪問而不是隨機(jī)訪問

為什么用HBase而不用傳統(tǒng)關(guān)系型數(shù)據(jù)庫? / 關(guān)系型數(shù)據(jù)庫和HBase有什么區(qū)別?

  • 數(shù)據(jù)類型: 傳統(tǒng)關(guān)系型數(shù)據(jù)庫有豐富的數(shù)據(jù)類型,HBase把數(shù)據(jù)存儲(chǔ)為未經(jīng)解釋的字符串

  • 數(shù)據(jù)操作: 關(guān)系數(shù)據(jù)庫包含了豐富的操作,可涉及復(fù)雜的多表連接,而HBase只有簡(jiǎn)單的插入查詢刪除清空等,不涉及表與表的連接

  • 存儲(chǔ)模式: 關(guān)系數(shù)據(jù)庫基于行存儲(chǔ),HBase基于列存儲(chǔ)

  • 數(shù)據(jù)索引: 關(guān)系數(shù)據(jù)庫可構(gòu)建復(fù)雜的多個(gè)索引以提高檢索效率;HBase只有一個(gè)索引:行鍵(RowKey),經(jīng)過巧妙地設(shè)計(jì),通過rowkey索引或掃描,不會(huì)使系統(tǒng)慢下來

  • 數(shù)據(jù)維護(hù): 關(guān)系數(shù)據(jù)庫更新會(huì)覆蓋原值,HBase則是生成一個(gè)新的版本,舊數(shù)據(jù)依然保留

  • 可伸縮性: 關(guān)系數(shù)據(jù)庫很難實(shí)現(xiàn)橫向擴(kuò)展,而HBase能夠容易地通過在集群中增加或減少硬件實(shí)現(xiàn)性能地伸縮

18.理解

  • 一個(gè)HBase表, 由多個(gè)Region組成,這些Region可以不在一個(gè)Region Server上

  • 根據(jù)RowKey切分Region,某個(gè)或某個(gè)連續(xù)范圍內(nèi)的RowKey會(huì)被切分到一個(gè)Region

  • 一個(gè)Store 對(duì)應(yīng) 一個(gè)列族的數(shù)據(jù),但一個(gè)列族由于Region的切分,可能對(duì)應(yīng)多個(gè)store

  • 尋址過程客戶端只需要詢問Zookeeper服務(wù)器,不需要連接Master服務(wù)器

到此,相信大家對(duì)“HBase面試題有哪些”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI