hbase存儲的數據類型
1. hbase採用了什麼樣的數據結構
HBase採用了類似Google Bigtable的數據模型,即一個稀疏的、分布式的、持久化的多維映射表,每個表都由行鍵、列族、列限定符和時間戳組成。
在底層實現上,HBase使用了基於Hadoop的分布式文件系統HDFS來存儲數據,並且使用了一搏皮搜種稱為LSM-Tree(Log-Structured Merge-Tree)的數據結構來管理數據。LSM-Tree是一種支持高寫入吞吐量的數據結構,它把數據分成多個層,每層採用不同的策略來管理數據,包括內存中的緩存、寫入磁碟的SSTable、和合並SSTable的操作。通過這種方式,HBase能夠支持高並發、高吞吐量的數據寫入,同時保證數據的一致性和可靠性。
另外,HBase還採用了Bloom Filter、MemStore和Compaction等技術來提高數據查詢效率和存儲效率。Bloom Filter是一種快速的數據過濾技術,可以幫助HBase快速地過濾掉無效的查詢請求,提高查詢效率。MemStore是一種緩存機制,可以幫助基歷HBase加速數據寫入,提高數據握中寫入效率。Compaction則是一種數據壓縮和合並技術,可以幫助HBase節省存儲空間,提高存儲效率。
綜上所述,HBase採用了LSM-Tree、Bloom Filter、MemStore和Compaction等多種數據結構和技術,以實現高並發、高吞吐量的分布式存儲和查詢功能。
2. HBase是什麼呢,都有哪些特點呢
Hbase是一種Nosql資料庫,這意味著它不像傳統的RDBMS資料庫那樣支持SQL作為查詢語言。Hbase是一種分布式存儲的資料庫,技術上來講,它更像是分布式存儲而不是分布式資料庫,它缺少很多RDBMS系統的特性,比如列類型,輔助索引,觸發器,和高級查詢語言等待
那Hbase有什麼特性呢?如下:
強讀寫一致,但是不是「最終一致性」的數據存儲,這使得它非常適合高速的計算聚合
自動分片,通過Region分散在集群中,當行數增長的時候,Region也會自動的切分和再分配
自動的故障轉移
Hadoop/HDFS集成,和HDFS開箱即用,不用太麻煩的銜接
豐富的「簡潔,高效」API,Thrift/REST API,Java API
塊緩存,布隆過濾器,可以高效的列查詢優化
操作管理,Hbase提供了內置的web界面來操作,還可以監控JMX指標
首先資料庫量要足夠多,如果有十億及百億行數據,那麼Hbase是一個很好的選項,如果只有幾百萬行甚至不到的數據量,RDBMS是一個很好的選擇。因為數據量小的話,真正能工作的機器量少,剩餘的機器都處於空閑的狀態
其次,如果你不需要輔助索引,靜態類型的列,事務等特性,一個已經用RDBMS的系統想要切換到Hbase,則需要重新設計系統。
最後,保證硬體資源足夠,每個HDFS集群在少於5個節點的時候,都不能表現的很好。因為HDFS默認的復制數量是3,再加上一個NameNode。
存儲業務數據:車輛GPS信息,司機點位信息,用戶操作信息,設備訪問信息。。。
存儲日誌數據:架構監控數據(登錄日誌,中間件訪問日誌,推送日誌,簡訊郵件發送記錄。。。),業務操作日誌信息
存儲業務附件:UDFS系統存儲圖像,視頻,文檔等附件信息
什麼時候用Hbase?
Hbase不適合解決所有的問題:
Hbase在單機環境也能運行,但是請在開發環境的時候使用。
內部應用
不過在公司使用的時候,一般不使用原生的Hbase API,使用原生的API會導致訪問不可監控,影響系統穩定性,以致於版本升級的不可控。
HFile
HFile是Hbase在HDFS中存儲數據的格式,它包含多層的索引,這樣在Hbase檢索數據的時候就不用完全的載入整個文件。索引的大小(keys的大小,數據量的大小)影響block的大小,在大數據集的情況下,block的大小設置為每個RegionServer 1GB也是常見的。
探討資料庫的數據存儲方式,其實就是探討數據如何在磁碟上進行有效的組織。因為我們通常以如何高效讀取和消費數據為目的,而不是數據存儲本身。
Hfile生成方式
起初,HFile中並沒有任何Block,數據還存在於MemStore中。
Flush發生時,創建HFile Writer,第一個空的Data Block出現,初始化後的Data Block中為Header部分預留了空間,Header部分用來存放一個Data Block的元數據信息。
而後,位於MemStore中的KeyValues被一個個append到位於內存中的第一個Data Block中:
註:如果配置了Data Block Encoding,則會在Append KeyValue的時候進行同步編碼,編碼後的數據不再是單純的KeyValue模式。Data Block Encoding是HBase為了降低KeyValue結構性膨脹而提供的內部編碼機制。
3. hbase的核心數據結構是什麼
hbase的核心數據結構為LSM樹。
LSM樹分為內存部分和磁碟部分。
內存部分是一個維護有序數據集合的數據結構。一般來講,內存數據結構可以選擇平衡二叉樹、紅黑樹、跳躍表(SkipList)等維護有序集的數據結構,由於考慮並發性能,HBase選擇了表現更優秀的跳躍表。
磁碟部渣扒分是由一個個獨立的文件組成敗梁困,每一個文件又是由一個個數據塊組成。對於數據存儲在磁碟上的資料庫系統來說,磁碟尋道以及數據讀取都是非常耗時的操作(簡稱IO耗時)。為了避免不必要的IO耗時,可以在磁碟中存儲一些額外的二進制數據,這些數據用來判斷對於給定的key是否有可能存儲在這個數據塊中,這個數據結構稱為布隆過濾器(察念BloomFilter)。
LSM樹介紹:
LSM樹是一種磁碟數據的索引結構。LSM樹的索引對寫入請求更友好。因為無論是何種寫入請求,LSM樹都會將寫入操作處理為一次順序寫,而HDFS擅長的正是順序寫(且HDFS不支持隨機寫)。
一個LSM樹的索引內存部分是一個ConcurrentSkipListMap,Key是rowkey、column family、qualifier、type以及timestamp, Value是位元組數組。隨著數據不斷寫入MemStore,一旦內存超過閾值會將數據flush到磁碟,生產HFile;多個小HFile文件會compact成一個大HFile。
4. HBase int類型欄位存儲亂碼
用MR往HBase里寫Int類型遇到了亂碼問題,總結一下。
直接往HBase表裡寫int,通過shell查詢
可以看到是一堆位元組數組,hbase存儲所有數據都是用過Byte數組的形式,但是褲亮裡面除了String以外,其他類型通早緩過shell查詢,無法正常顯示的,但是String類型的數據,shell則可以正常顯示,這里我插入的是int自然無法正常顯示。
這是在idea上寫的查詢hbase的方法,分別用Bytes.toInt和Byts.toString嘗試讀取hbase上的數據。
這是一部分結果,可以看到通過Bytes.toInt讀取的int類型Byte數組,是可以正確顯示,而通過Bytes.toString方式嘗陸純模試讀取則亂碼。
看到這里其實大概已經了解了,但是我遇到了一點小問題,所以繼續測試。
新建一張表,通過shell,往裡面插入兩個int類型的數據,但是通過shell查詢,查詢結果並非Byte數組,難道HBase將他們轉換成了String?
通過idea上方法測試,可以看到Bytes.toString方法將結果轉化正確,而Bytes.toInt則錯誤。所以可以認為通過shell可以讀取到的數據類型,只有String。通過shell插入的int類型只不過是與int類型值相同的String類型。
5. hbase列式資料庫四維坐標是什麼
實際上,HBase是一個列族資料庫,而不是真正的列式資料庫。
因為允許存放非結構化數據,所以HBase的數據類型只有簡單的字元串類型,如果需要細分類型,需要用戶自己處理。
HBase的四維模型中每個元素:
(1)行鍵(Row Key):最大長度為64KB的任意字元串。與關系型資料庫一樣,行鍵是行的唯一標志。
(2)列族(Column Family):這是理解列族資料庫的關鍵概念。將數據行中的欄位按照某種要求分成數個小組,每個小組包含若干個欄位,每個小組就是列族。列族需要預先定義,並且不能隨意修改。每行具有相同的列族,但不要求每個列族都存儲數據。
(3)列限定符(Qualifier):每個列族包含多個欄位,限定符用於區分不同的欄位。列限定符不需要預先定義,因此每行可以有不同數量的列限定符,也可以認為列限定符就是欄位。
(4)單元(Cell):存儲數據的最小單元。單元中存儲的是未經解釋的字元串,需要通過行鍵、列族、列限定符、時間戳進行定位。
(5)版本(Version):這是HBase與其他資料庫的不同之處。版本是一個64位整型數,可以由系統自動生成,也可以由用戶自定義。引入版本後,存儲在單元中的值不再只有一個,可以通過不同的時間戳(Timestamp)在同一單元中存入多個版本。
6. HBase數據結構是什麼
RowKey
與nosql資料庫們一樣,RowKey是用來檢索記錄的主鍵。訪問HBASE table中的行,只有三種方式:
通過單個RowKey訪問(get)
通過RowKey的range(正則)(like)
全表掃描(scan)
RowKey行鍵 (RowKey)可以是任意字元串(最大長度是64KB,實際應用中長度一般為 10-100bytes),在HBASE內部,RowKey保存為位元組數組。存儲時,數據按照RowKey的字典序(byte order)排序存儲。設計RowKey時,要充分排序存儲這個特性,將經常一起讀取的行存儲放到一起。(位置相關性)Table:表,所有的表都是命名空間的成員,即表必屬於某個命名空間,如果沒有指定,則在default默認的命名空間中。
RegionServer group:一個命名空間包含了默認的RegionServer Group。
Permission:許可權,命名空間能夠讓我們來定義訪問控制列表ACL(Access Control List)。例如,創建表,讀取表,刪除,更新等等操作。
Quota:限額,可以強制一個命名空間可包含的region的數量。
Column Family
列族:HBASE表中的每個列,都歸屬於某個列族。列族是表的schema的一部 分(而列不是),必須在使用表之前定義。列名都以列族作為前綴。例如 courses:history,courses:math都屬於courses 這個列族。
Cell
由{rowkey, column Family:columu, version} 唯一確定的單元。cell中的數據是沒有類型的,全部是位元組碼形式存貯。
關鍵字:無類型、位元組碼
Time Stamp
HBASE 中通過rowkey和columns確定的為一個存貯單元稱為cell。每個 cell都保存 著同一份數據的多個版本。版本通過時間戳來索引。時間戳的類型是 64位整型。時間戳可以由HBASE(在數據寫入時自動 )賦值,此時時間戳是精確到毫秒 的當前系統時間。時間戳也可以由客戶顯式賦值。如果應用程序要避免數據版 本沖突,就必須自己生成具有唯一性的時間戳。每個 cell中,不同版本的數據按照時間倒序排序,即最新的數據排在最前面。
為了避免數據存在過多版本造成的的管理 (包括存貯和索引)負擔,HBASE提供 了兩種數據版本回收方式。一是保存數據的最後n個版本,二是保存最近一段 時間內的版本(比如最近七天)。用戶可以針對每個列族進行設置。
命名空間
命名空間的結構:
7. hbase與關系型資料庫的存儲方式有哪些不同
HBase與傳統關系資料庫的區別主要體現在以下幾個方面:1.數據類型。關系資料庫採用關系模型,具有豐富的數據類型和儲存方式。HBase則採用了更加簡單的數據模型,它把數據儲存為未經解釋的字元串,用戶可以把不同格式的結構化數據和非結構化數據都序列化成字元串保存到HBase中,用戶需要自己編寫程序把字元串解析成不同的數據類型。 2.數據操作。關系資料庫中包含了豐富的操作,如插入、刪除、更新、查詢等,其中會涉及復雜的多表連接,通常是藉助多個表之間的主外鍵關聯來實現的。HBase操作則不存在復雜的表與表之間的關系,只有簡單的插入、查詢、刪除、清空等,因為HBase在設計上就避免了復雜的表與表之。
列存儲不同於傳統的關系型資料庫,其數據在表中是按行存儲的,列方式所帶來的重要好處之一就是,由於查詢中的選擇規則是通過列來定義的,因此整個資料庫是自動索引化的。
按列存儲每個欄位的數據聚集存儲,在查詢只需要少數幾個欄位的時候,能大大減少讀取的數據量,一個欄位的數據聚集存儲,那就更容易為這種聚集存儲設計更好的壓縮/解壓演算法。
傳統的(Oracle)行存儲和(Hbase)列存儲的區別。
主要體現在以下幾個方面:1.數據類型。關系資料庫採用關系模型,具有豐富的數據類型和儲存方式。HBase則採用了更加簡單的數據模型,它把數據儲存為未經解釋的字元串,用戶可以把不同格式的結構化數據和非結構化數據都序列化成字元串保存到HBase中,用戶需要自己編寫程序把字元串解析成不同的數據類型。 2.數據操作。關系資料庫中包含了豐富的操作,如插入、刪除、更新、查詢等,其中會涉及復雜的多表連接,通常是藉助多個表之間的主外鍵關聯來實現的。HBase操作則不存在復雜的表與表之間的關系,只有簡單的插入、查詢、刪除、清空等,因為HBase在設計上就避免了復雜的表與表之間的關系,通常只採用單表的主鍵查詢。
8. hbase資料庫存儲的特點有哪些
特點:(1)大:一個表可以有數十億行,上百萬列;
(2)無模式:每行都有一個可排序的主鍵和任意多的列,列可以根據需要動態的增加,同一張表中不同的行可以有截然不同的列;
(3)面向列:面向列(族)的存儲和許可權控制,列(族)獨立檢索;?
(4)稀疏:空(null)列並不佔用存儲空間,表可以設計的非常稀疏;
(5)數據多版本:每個單元中的數據可以有多個版本,默認情況下版本號自動分配,是單元格插入時的時間戳;
(6)數據類型單一:Hbase中的數據都是字元串,沒有類型。
9. Hbase知識點總結
hbase概念:
非結構化的分布式的面向列存儲非關系型的開源的資料庫,根據谷歌的三大論文之一的bigtable
高寬厚表
作用:
為了解決大規模數據集合多重數據種類帶來的挑戰,尤其是大數據應用難題。
能幹什麼:
存儲大量結果集數據,低延遲的隨機查詢。
sql:
結構化查詢語言
nosql:
非關系型資料庫,列存儲和文檔存儲(查詢低延遲),hbase是nosql的一個種類,其特點是列式存儲。
灶如敏非關系型資料庫--列存儲(hbase)
非關系型資料庫--文檔存儲(MongoDB)
非關系型資料庫隱枝--內存式存儲(redis)
非關系型資料庫--圖形模型(graph)
hive和hbase區別?
Hive的定位是數據倉庫,雖然也有增刪改查,但其刪改查對應的是整張表而不是單行數據,查詢的延遲較高。其本質是更加方便的使用mr的威力來進行離線分析的一個數據分析工具。
HBase的定位是hadoop的資料庫,電腦培訓發現是一個典型的Nosql,所以HBase是用來在大量數據中進行低延遲的隨機查詢的。
hbase運行方式:
standalonedistrubited
單節點和偽分布式橡棗?
單節點:單獨的進程運行在同一台機器上
hbase應用場景:
存儲海量數據低延遲查詢數據
hbase表由多行組成
hbase行一行在hbase中由行健和一個或多個列的值組成,按行健字母順序排序的存儲。
10. HBASE 1.0
前身:BigTable
網頁搜索:
google分布式存儲系統BigTable依賴GFS
Hbase(bigtable的開源實現): 高可靠、高性能、面向列、可伸縮
存儲結構化和半結構化的數據
優點:
水平可擴展性特別好:
依賴:
文件存儲系統:HDFS
海量數據處理:MapRece
協同管理服務:Zookeeper
滿足了:大數據量的實時計算
數據類型:
RDBMS:關系數據模型、多種數據類型
Hbase:
數據操作:
存儲模式:
索引:
數據維護:
可伸縮性:
縱向擴展:
水平擴展:
Hbase的訪問介面:
拆局 JAVA API
shell
thrift Gateway
restful Gateway
SQL介面:pig編寫類sql hive用hivesql訪問Hbase
Hbase的數據類型:
列限定符
每個值都是未解釋的bytes
一個行可以有一個行鍵和多列
表由列族組成
Hbase數據模型:
列族支持動態擴展、保留舊版本(HDFS只能追加數據)
基礎元素:
行鍵 : rowkey
列族
列限定敗燃符
單元格 (時間戳概念、對應數據版本)
坐標概念:
四維定位:行鍵、列族、列限定符、時間戳
稀疏表旅枯讓
HBASE:面向列的存儲:高數據壓縮率、分析便捷
RDBMS :面向行存儲,事務性操作(記錄完整)、不便於分析(需要全表掃描)
4.3 HBASE 的實現原理
4.3.1 庫函數 、master伺服器、region伺服器
Master伺服器:
分區信息進行維護和管理
維護region伺服器列表
確認當前工作的region伺服器
負責對region進行分配和負載平衡
對表的增刪改查
region伺服器:
客戶端不依賴於Master獲取位置信息
用戶數據的存儲和管理
Region伺服器--10-1000個region -----Store是一個列族----每個列族就是一個Hfile----所有region公用1個Hlog
寫數據流程:Region伺服器---寫緩存Memstore---寫日誌(Hlog)
讀數據流程:Region伺服器-讀緩存Memstore(最新數據)----StoreFile
緩存刷新:周期性將緩存內容刷寫到Storefile 清空緩存---Hlog寫入標記
每次刷寫會生成新的StoreFile 每個Store包含多個StoreFile
每個Region伺服器都有一個自己的Hlog,將啟動檢查確認緩存刷新是否有新的內容需要刷寫,發現則刷寫新的storefile,完成後刪除Hlog,開始對外提供服務
Storefile的合並,storefile 的數量達到閾值後,會進行合並。當Storefile超過大小閾值則會觸發Region的分裂
4.4 Hlog的工作原理
Zookeeper負責監聽region伺服器,由master處理故障,通過故障伺服器的Hlog恢復,按region切分Hlog,將region和對應的Hlog分配到新的region伺服器上
一個HBASE表會被劃分成多個Region(1G-2G 取決於伺服器性能)
同一個region不會被拆分到不同伺服器上
Region的尋找:
Meta表:regionID 伺服器ID 存儲元數據
Root表:只有一個region
三級定址:
zookeeper文件---root表-多個meta表--多個用戶數據表
客戶端會有Hbase三層定址的緩存,調用訪問Hbase的介面,緩存失效後,再次定址
zookeeper決定master伺服器,確保只有一個master
4.5 Hbase的應用方案
性能優化:
1)時間靠近存放----將時間戳引入行鍵,使用Long.max-時間戳進行排序
2)提升讀寫性能,創建表時設置HcloumnDescriptor.setMemory=true,會將表放入內存的緩存中
3)節省存儲·空間----設置最大版本數、保存最新版的數據,將最大版本參數設置為1
4)timetolive參數,會將過期數據自動清空
檢測Hbase性能:
Maste-status(web瀏覽器查詢)
ganglia
OpenTSDB
Armbari
sql 查詢HBASE
1)hive整合hbase
2)Phoenix
Hbase 二級索引 (輔助索引)
默認只支持對rowkey進行索引
Hbase行訪問:
1)單行鍵訪問
2)確定起點和終點訪問區間數據
3)全表掃描
二級索引樣例:
Hindex Hbase+redis Solr+ Hbase
二級索引的機制:
Hbase Coprocessor
endpoint ---存儲過程
observer----觸發器
通過Observer監測數據插入動作,同步寫入索引表,完成對表和列的索引
Hbase 主表 索引表
4.6 HBASE的shell命令
三種部署模式:單機 偽分布式 分布式
HDFS
創建表
create table, F1, F2, F3
list table
每次只能為1行的1列添加數據
put table R1,R1:C1 ,「1,2,3」
scan table R1,{column='R1:C1'}
get table
刪除表:
disable table +drop table
4.7 JAVA API +HBASE