您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關HBase核心知識點有哪些的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
一、HBase介紹
1、基本概念
HBase是一種Hadoop數據庫,經常被描述為一種稀疏的,分布式的,持久化的,多維有序映射,它基于行鍵、列鍵和時間戳建立索引,是一個可以隨機訪問的存儲和檢索數據的平臺。HBase不限制存儲的數據的種類,允許動態的、靈活的數據模型,不用SQL語言,也不強調數據之間的關系。HBase被設計成在一個服務器集群上運行,可以相應地橫向擴展。
2、HBase使用場景和成功案例
互聯網搜索問題:爬蟲收集網頁,存儲到BigTable里,MapReduce計算作業掃描全表生成搜索索引,從BigTable中查詢搜索結果,展示給用戶。
抓取增量數據:例如,抓取監控指標,抓取用戶交互數據,遙測技術,定向投放廣告等
內容服務
信息交互
3、HBase Shell命令行交互:
啟動Shell $ hbase shell
列出所有的表 hbase > list
創建名為mytable的表,含有一個列族hb hbase > create ' mytable' , 'hb'
在‘mytable’表的'first'行中的‘hb:data’列對應的數據單元中插入字節數組‘hello HBase’
hbase > put 'mytable' , 'first' , 'hb:data' , 'hello HBase'
讀取mytable表 ‘first’行的內容 hbase > get 'mytable' , 'first'
讀取mytable表所有的內容 hbase > scan ‘mytable'
二、入門
1、API
和數據操作有關的HBase API有5個,分別是 Get(讀),Put(寫),Delete(刪),Scan(掃描)和Increment(列值遞增)
2、操作表
首先要創建一個configuration對象
Configuration conf = HBaseConfiguration.create();
使用eclipse時的話還必須將配置文件添加進來。
conf.addResource(new Path("E:\\share\\hbase-site.xml"));
conf.addResource(new Path("E:\\share\\core-site.xml"));
conf.addResource(new Path("E:\\share\\hdfs-site.xml"));
使用連接池創建一張表。
HTablePool pool = new HTablePool(conf,1);
HTableInterface usersTable = pool.getTable("users");
3、寫操作
用來存儲數據的命令是put,往表里存儲數據,需要創建Put實例。并制定要加入的行
Put put = new Put(byte[] row) ;
Put的add方法用來添加數據,分別設定列族,限定符以及單元格的指
put.add(byte[] family , byte[] qualifier , byte[] value) ;
最后提交命令給表
usersTable.put(put);
usersTable.close();
修改數據,只需重新提交一次最新的數據即可。
HBase寫操作的工作機制:
HBase每次執行寫操作都會寫入兩個地方:預寫式日志(write-ahead log,也稱HLog)和MemStore(寫入緩沖區),以保證數據持久化,只有當這兩個地方的變化信息都寫入并確認后,才認為寫動作完成。MemStore是內存里的寫入緩沖區,HBase中數據在永久寫入硬盤之前在這里累積,當MemStore填滿后,其中的數據會刷寫到硬盤,生成一個HFile。
4、讀操作
創建一個Get命令實例,包含要查詢的行
Get get = new Get(byte[] row) ;
執行addColumn()或addFamily()可以設置限制條件。
將get實例提交到表會返回一個包含數據的Result實例,實例中包含行中所有列族的所有列。
Result r = usersTable.get(get) ;
可以對result實例檢索特定的值
byte[] b = r.getValue(byte[] family , byte[] qualifier) ;
工作機制:
BlockCache用來保存從HFile中讀入內存的頻繁訪問的數據,避免硬盤讀,每個列族都有自己的BlockCache。從HBase中讀出一行,首先會檢查MemStore等待修改的隊列,然后檢查BlockCache看包含該行的Block是否最近被訪問過,最后訪問硬盤上的對應HFile。
5、刪除操作
創建一個Delete實例,指定要刪除的行。
Delete delete = new Delete(byte[] row) ;
可以通過deleteFamily()和deleteColumn()方法指定刪除行的一部分。
6表掃描操作
Scan scan = new Scan() 可以指定起始行和結束行。
setStartRow() , setStopRow() , setFilter()方法可以用來限制返回的數據。
addColumn()和addFamily()方法還可以指定列和列族。
HBase模式的數據模型包括:
表:HBase用表來組織數據。
行:在表里,數據按行存儲,行由行鍵唯一標識。行鍵沒有數據類型,為字節數組byte[]。
列族:行里的數據按照列族分組,列族必須事先定義并且不輕易修改。表中每行擁有相同的列族。
列限定符:列族里的數據通過列限定符或列來定位,列限定符不必事先定義。
單元:存儲在單元里的數據稱為單元值,值是字節數組。單元由行鍵,列族或列限定符一起確定。
時間版本:單元值有時間版本,是一個long類型。
一個HBase數據坐標的例子:
HBase可以看做是一個鍵值數據庫。HBase的設計是面向半結構化數據的,數據記錄可能包含不一致的列,不確定大小等。
三、分布式的HBase、HDFS和MapReduce
1、分布式模式的HBase
HBase將表會切分成小的數據單位叫region,分配到多臺服務器。托管region的服務器叫做RegionServer。一般情況下,RgionServer和HDFS DataNode并列配置在同一物理硬件上,RegionServer本質上是HDFS客戶端,在上面存儲訪問數據,HMaster分配region給RegionServer,每個RegionServer托管多個region。
HBase中的兩個特殊的表,-ROOT-和.META.,用來查找各種表的region位置在哪。-ROOT-指向.META.表的region,.META.表指向托管待查找的region的RegionServer。
一次客戶端查找過程的3層分布式B+樹如下圖:
HBase頂層結構圖:
zookeeper負責跟蹤region服務器,保存root region的地址。
Client負責與zookeeper子集群以及HRegionServer聯系。
HMaster負責在啟動HBase時,把所有的region分配到每個HRegion Server上,也包括-ROOT-和.META.表。
HRegionServer負責打開region,并創建對應的HRegion實例。HRegion被打開后,它為每個表的HColumnFamily創建一個Store實例。每個Store實例包含一個或多個StoreFile實例,它們是實際數據存儲文件HFile的輕量級封裝。每個Store有其對應的一個MemStore,一個HRegionServer共享一個HLog實例。
一次基本的流程:
a、 客戶端通過zookeeper獲取含有-ROOT-的region服務器名。
b、 通過含有-ROOT-的region服務器查詢含有.META.表中對應的region服務器名。
c、 查詢.META.服務器獲取客戶端查詢的行鍵數據所在的region服務器名。
d、 通過行鍵數據所在的region服務器獲取數據。
HFile結構圖:
Trailer有指向其他塊的指針,Index塊記錄Data和Meta塊的偏移量,Data和Meta塊存儲數據。默認大小是64KB。每個塊包含一個Magic頭部和一定數量的序列化的KeyValue實例。
KeyValue格式:
該結構以兩個分別表示鍵長度和值長度的定長數字開始,鍵包含了行鍵,列族名和列限定符,時間戳等。
預寫日志WAL:
每次更新都會寫入日志,只有寫入成功才會通知客戶端操作成功,然后服務器可以按需自由地批量處理或聚合內存中的數據。
編輯流在memstore和WAL之間分流的過程:
處理過程:客戶端通過RPC調用將KeyValue對象實例發送到含有匹配region的HRegionServer。接著這些實例被發送到管理相應行的HRegion實例,數據被寫入到WAL,然后被放入到實際擁有記錄的存儲文件的MemStore中。當memstore中的數據達到一定的大小以后,數據會異步地連續寫入到文件系統中,WAL能保證這一過程的數據不會丟失。
2、HBase和MapReduce
從MapReduce應用訪問HBase有3種方式:
作業開始時可以用HBase作為數據源,作業結束時可以用HBase接收數據,任務過程中用HBase共享資源。
使用HBase作為數據源
階段map
protected void map(ImmutableBytesWritable rowkey,Result result,Context context){
};
從HBase表中讀取的作業以[rowkey:scan result]格式接收[k1,v1]鍵值對,對應的類型是ImmutableBytesWritable和Result。
創建實例掃描表中所有的行
Scan scan = new Scan();
scan.addColumn(…);
接下來在MapReduce中使用Scan實例。
TableMapReduceUtil.initTableMapperJob(tablename,scan,map.class,
輸出鍵的類型.class,輸出值的類型.class,job);
使用HBase接收數據
reduce階段
protected void reduce(
ImmutableBytesWritable rowkey,Iterable<put>values,Context context){
};
把reducer填入到作業配置中,
TableMapReduceUtil.initTableReducerJob(tablename,reduce.class,job);
3、HBase實現可靠性和可用性
HDFS作為底層存儲,為集群里的所有RegionServer提供單一命名空間,一個RegionServer讀寫數據可以為其它所有RegionServer讀寫。如果一個RegionServer出現故障,任何其他RegionServer都可以從底層文件系統讀取數據,基于保存在HDFS里的HFile開始提供服務。接管這個RegionServerz服務的region。
四、優化HBase
1、隨機讀密集型
優化方向:高效利用緩存和更好的索引
增加緩存使用的堆的百分比,通過參數 hfile.block.cache.size 配置。
減少MemStore占用的百分比,通過hbase.regionserver.global.memstore.lowerLimit和hbase.regionserver.global.memstore.upperLimit來調節。
使用更小的數據塊,使索引的粒度更細。
打開布隆過濾器,以減少為查找指定行的Key Value對象而讀取的HFile的數量。
設置激進緩存,可以提升隨機讀性能。
關閉沒有被用到隨機讀的列族,提升緩存命中率。
2、順序讀密集型
優化方向:減少使用緩存。
增大數據塊的大小,使每次硬盤尋道時間取出的數據更多。
設置較高的掃描器緩存值,以便在執行大規模順序讀時每次RPC請求掃描器可以取回更多行。 參數 hbase.client.scanner.caching 定義了在掃描器上調用next方法時取回的行的數量。
關閉數據塊的緩存,避免翻騰緩存的次數太多。通過Scan.setCacheBlocks(false)設置。
關閉表的緩存,以便在每次掃描時不再翻騰緩存。
3、寫密集型
優化方向:不要太頻繁刷寫,合并或者拆分。
調高底層存儲文件(HStoreFile)的最大大小,region越大意味著在寫的時候拆分越少。通過參數 hbase.hregion.max.filesize設置。
增大MemStore的大小,通過參數hbase.hregion.memstore.flush.size調節。刷寫到HDFS的數據越多,生產的HFile越大,會在寫的時候減少生成文件的數量,從而減少合并的次數。
在每臺RegionServer上增加分配給MemStore的堆比例。把upperLimit設為能夠容納每個region的MemStore乘以每個RegionServer上預期region的數量。
垃圾回收優化,在hbase-env.sh文件里設置,可以設置初始值為:-Xmx8g -Xms8g -Xmn128m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=70
打開MemStore-Local Allocation Buffer這個特性,有助于防止堆的碎片化。 通過參數hbase.hregion.memstore.mslab.enabled設置
4、混合型
優化方向:需要反復嘗試各種組合,然后運行測試,得到最佳結果。
影響性能的因素還包括:
壓縮:可以減少集群上的IO壓力
好的行鍵設計
在預期集群負載最小的時候手工處理大合并
優化RegionServer處理程序計數
感謝各位的閱讀!關于“HBase核心知識點有哪些”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。