版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、大數(shù)據(jù)技術(shù)基礎培訓1HBase 技術(shù)介紹Hbase介紹Hbase是什么?Hadoop數(shù)據(jù)庫?Key-Value存儲?面向列族的數(shù)據(jù)庫?可以隨機訪問的存儲和檢索數(shù)據(jù)的平臺起源Google發(fā)表Google文件系統(tǒng)(GFS)、MapReduce、BigTableLucene - Nutch - Hadoop - HbaseHbase版本發(fā)展2007.4 第一個版本(HBASE-287 Mike Cafarella)2010.10 0.89(Facebook的生產(chǎn)版本)2012.1 0.92(Adds 安全,協(xié)處理器,HFile V2,分布式log-Splitting)2012.5 0.94(Perf
2、ormance Release),目前是主流版本。2013.10 0.96(支持hadoop 2.0、JDK7,添加 protobuf,Table Snapshot,PrefixTreeCompression等等)Transwarp版本 基于0.94.11Hbase應用場景互聯(lián)網(wǎng)搜索(爬蟲收集網(wǎng)頁到BigTable)抓取增量數(shù)據(jù)OpenTSDB計數(shù)器內(nèi)容服務URL短鏈接信息交換FaceBook短信系統(tǒng)56Hbase數(shù)據(jù)模型7Hbase數(shù)據(jù)模型8Hbase數(shù)據(jù)模型9Hbase數(shù)據(jù)模型10Hbase數(shù)據(jù)模型11Hbase數(shù)據(jù)模型12Hbase數(shù)據(jù)模型Hbase數(shù)據(jù)模型數(shù)據(jù)可以通過column fa
3、mily進行分割一個表由多個region組成每一個region都有指定的start key 和 end key每一個region底層是存儲在HDFS上的一個或多個文件組成(HFile)13Hbase數(shù)據(jù)模型14Hbase數(shù)據(jù)模型所有值都會存儲完整的坐標值,包括Row Key、Column Family、 Column Qualifier and Timestamp每一個Cell(column)都是一行不同version是均是一行Null值不占用空間,因為不會被存儲15HBase架構(gòu)1617關(guān)系數(shù)據(jù)庫中的B+樹關(guān)系數(shù)據(jù)庫中常用B+樹組織數(shù)據(jù)如上圖所示,內(nèi)部節(jié)點已經(jīng)存滿,再插入一個新記錄時,需要在
4、B+樹中插入一個新的內(nèi)部節(jié)點,再鏈到B+樹中這里的問題是新的內(nèi)部節(jié)點在磁盤上可能存放在很遠的地方,在順序掃描數(shù)據(jù)時,不得不seek磁盤Log-Structured Merge-Treesinsert/update寫入log后,再寫入內(nèi)存(memory store)memory store寫滿后,flush到磁盤上后臺進程/線程對磁盤上多個文件進行合并,組成排序后的B+樹,同時處理刪除、更新、TTL等查詢時先查內(nèi)存中的數(shù)據(jù),再查磁盤18Seek vs TransferComplexity:B+ tree operates at the disk seek rate, resulting in l
5、og(N) seeks per access.LSM-trees, sorts and merges files while operating at transfer rates, and takes log(updates) operationsGiven these numbers: 10 MB/second transfer bandwidth 10 milliseconds disk seek time 100 bytes per entry (10 billion entries) 10 KB per page (1 billion pages)When updating 1% o
6、f entries (100,000,000), it takes: 1,000 days with random B-tree updates 100 days with batched B-tree updates 1 day with sort and merge1920Seek Versus Sort and Merge in NumbersFor our large-scale scenarios, computation is dominated by disk transfers. Although CPU, RAM, and disk size double every 182
7、4 months, seek time remains nearly constant at around a 5% increase in speed per year.As discussed at the beginning of this chapter, there are two different database paradigms: one is seek and the other is transfer. Seek is typically found in RDBMSes and is caused by the B-tree or B+ tree structures
8、 used to store the data. It operates at the disk seek rate, resulting in log(N) seeks per access.Transfer, on the other hand, as used by LSM-trees, sorts and merges files while operating at transfer rates, and takes log(updates) operations. This results in the following comparison given these values
9、: 10 MB/second transfer bandwidth 10 milliseconds disk seek time 100 bytes per entry (10 billion entries) 10 KB per page (1 billion pages)When updating 1% of entries (100,000,000), it takes: 1,000 days with random B-tree updates 100 days with batched B-tree updates 1 day with sort and mergeWe can sa
10、fely conclude that, at scale seek, is inefficient compared to transfer.Hbase架構(gòu)21HMaster處理表的創(chuàng)建、刪除、修改等操作分配region到region server上負載均衡各個region server上的region維護集群狀態(tài)通過zookeeper監(jiān)控狀態(tài)、協(xié)調(diào)操作不提供數(shù)據(jù)服務Region Server處理region所有的讀寫操作直接與client進行數(shù)據(jù)通信控制region的分割對region進行compact操作在運行中可以動態(tài)添加、刪除22HBase 組件交互HMasterRegionServe
11、rRegion1Region4RegionServerRegion3Region5RegionServerRegion2Region6ClientMetadata ops (create table, )Read/WriteRegion assignment and load balancingMasterSlavesHbase架構(gòu)region定位 .META.:記錄了用戶表的Region信息,.META.可以有多個regoin -ROOT-:記錄了.META.表的Region信息,-ROOT-只有一個regionZookeeper中記錄了-ROOT-表的location最新版本已經(jīng)沒有-RO
12、OT-23Hbase架構(gòu)數(shù)據(jù)流24Hbase架構(gòu)讀取定位對應的region所在的region serverBlockCacheHFileMemStore25Hbase架構(gòu)插入定位對應的region所在的region server將Put、Delete等操作寫入預寫日志W(wǎng)AL預寫日志寫完后將數(shù)據(jù)寫入MemStore當MemStore中的數(shù)據(jù)達到一定閾值時,將數(shù)據(jù)以Hfile的形式保存到HDFS中不會阻塞其他讀寫操作多個Column Family?26Hbase架構(gòu)插入定位對應的region所在的region server將Put、Delete等操作寫入預寫日志W(wǎng)AL預寫日志寫完后將數(shù)據(jù)寫入Mem
13、Store當MemStore中的數(shù)據(jù)達到一定閾值時,將數(shù)據(jù)以Hfile的形式保存到HDFS中不會阻塞其他讀寫操作多個Column Family?27Hbase CompactionCompaction是將HFile合并的機制Minor Compaction將多個小文件合并成一個文件Major Compaction將所有文件合并成一個文件處理delete marker,真正刪除文件刪除多余的版本數(shù)據(jù)默認每個region一天觸發(fā)一次28Hbase Splitting當region的數(shù)據(jù)過大時,就會觸發(fā)splitting操作使用middle key分割成兩個相鄰的region可以手動觸發(fā)Splitt
14、ing的速度很快只是創(chuàng)建現(xiàn)有Hfile的引用文件,并未直接將文件分割開只有當觸發(fā)過compaction時才真正重寫數(shù)據(jù)思考題:何時刪除父region的數(shù)據(jù)?29Auto shardingHBase MemStore性能相關(guān)參數(shù)hbase.hregion.memstore.flush.size 134217728(128M)base.regionserver.global.memstore.lowerLimit 0.35當MemsStore所占內(nèi)存超過該比例強制flush hbase.regionserver.global.memstore.upperLimit 0.4阻塞插入操作hbase.h
15、region.memstore.block.multiplier 2當一個region的MemStore的大小達到flush閾值的2倍時,該region的寫操作被阻塞31Hbase數(shù)據(jù)localityRegionServer與Datanode部署在同一臺服務器上新插入的數(shù)據(jù)優(yōu)先在本地磁盤(HDFS保證)動態(tài)locality讀本地文件(HDFS short circuit)Hbase表結(jié)構(gòu)設計33Hbase表結(jié)構(gòu)設計使用row key 查詢的時候可以獲得最佳的查詢性能選定時間(timestamp)范圍,在有些時候能夠略過一些文件指定column family 能夠有效的減少被掃描的數(shù)據(jù)指定col
16、umn qualifier可以減少網(wǎng)絡傳輸,但不會減少硬盤IO大部分情況下,使用filter對值進行過濾的查詢都是全表掃描雖然全表,但是網(wǎng)絡傳輸會降低34Hbase表結(jié)構(gòu)設計查詢性能好的關(guān)鍵?RDBMS為什么快?Column的索引合理的query planHbase沒有怎么辦?充分利用row key 和 column的排序反規(guī)范化、復制反規(guī)范化 替代Join操作復制 為讀優(yōu)化3536Hbase表結(jié)構(gòu)設計順序RowKey: CF: CQ: TS: Val 最新的Region會成為寫入熱點:寫入性能非常糟糕!相反,我們可以這么做:加鹽值在前面加一些離散值相當于分桶,不同的桶在不同的region上K
17、ey field換位把移到rowkey的中間或者后面隨機Key在rowkey中去除Salting 在rowkey加前綴來使數(shù)據(jù)分散 使用常見的值或者數(shù)字作為前綴 使用求模的方式來使數(shù)據(jù)分散 使常用的的數(shù)據(jù)緊跟在后面,已方便查找或者用mapreduce處理0_rowkey1, 1_rowkey2, 2_rowkey30_rowkey4, 1_rowkey5, 2_rowkey6數(shù)據(jù)會先按前綴排序0_rowkey10_rowkey41_rowkey21_rowkey5 Hashing vs. Sequential Keys使用哈希值可以獲得最好的分散性Uses hashes for best sp
18、read 使用MD5來對用戶ID進行運算Key = MD5(customerID) 對于customerID的區(qū)間進行掃描會有反作用 使用sequential keys可以獲得一些本地性 可以充分利用block caches 可能會過度使用單臺服務器,通過salting或者split region來保證region在一個較小的狀態(tài)順序RowKey: CF: CQ: TS: Val 最新的Region會成為寫入熱點:寫入性能非常糟糕!相反,我們可以這么做:加鹽值在前面加一些離散值相當于分桶,不同的桶在不同的region上Key field換位把移到rowkey的中間或者后面隨機Key在rowke
19、y中去除Salting Prefix row keys to gain spread Use well known or numbered prefixes Use modulo to spread across servers Enforce common data stay close to each other for subsequent scanning or MapReduce processing0_rowkey1, 1_rowkey2, 2_rowkey30_rowkey4, 1_rowkey5, 2_rowkey6Sorted by prefix first0_rowkey1
20、0_rowkey41_rowkey21_rowkey5 Hashing vs. Sequential KeysUses hashes for best spread Use for example MD5 to be able to recreate key Key = MD5(customerID) Counter productive for range scans Use sequential keys for locality Makes use of block caches May tax one server overly, may be avoided by salting o
21、r splitting regions while keeping them smallHbase表列族高級配置數(shù)據(jù)塊大小非HDFS Block,默認65536(64K)數(shù)據(jù)塊小,索引大隨機查找性能、順序掃面性能數(shù)據(jù)塊緩存是否把數(shù)據(jù)放進內(nèi)存,對于只進行順序掃描或很少使用的表可以關(guān)閉內(nèi)存表LRU緩存的優(yōu)先級高布隆過濾器(Bloom Filter)ROW,ROWCOL生存時間(TTL)壓縮Block Encoding (PREFIX、DIFF、FAST DIFF)單元時間版本Hbase表結(jié)構(gòu)設計實例熟悉的數(shù)據(jù)建模工具E-R圖Hbase表結(jié)構(gòu)設計實例演唱會Hbase表結(jié)構(gòu)設計實例傳統(tǒng)數(shù)據(jù)庫就從規(guī)范化
22、數(shù)據(jù)模型開始實體 表格屬性 列關(guān)聯(lián) 外鍵多對多關(guān)聯(lián) 聯(lián)接表Hbase表結(jié)構(gòu)設計實例這些都有了是不是就夠了?如果數(shù)據(jù)是GB級別的?如果是TB級別的?Hbase表結(jié)構(gòu)設計實例在Hbase中 E-R圖怎么映射?實體 表?不一定 ! !屬性 ?HBase表結(jié)構(gòu)設計實例屬性的順序沒有關(guān)系有些屬性具有辨識性主鍵 ? 樂隊HBase表結(jié)構(gòu)設計實例不存在唯一鍵? 聯(lián)合主鍵問題?順序?長度?拼接方式?固定長度分隔符其它序列化(Avro等)HBase表結(jié)構(gòu)設計實例增加屬性類型不是必要Hbase沒有類型(暫時)可以幫助思考排序問題HBase表結(jié)構(gòu)設計實例還沒討論關(guān)聯(lián)!HBase沒有外鍵不支持JOIN沒有索引不支持事
23、務(只支持行級事務)Hbase表結(jié)構(gòu)設計實例如何處理Join?自己處理(應用程序)反規(guī)范化( Denormalizing )將兩個邏輯實體用一個物理實體來展現(xiàn)Hbase表結(jié)構(gòu)設計實例試試常規(guī)的反規(guī)范化嘗試將信息整合到Band中有點難以接受,從Show入手也是一樣,換個方式Hbase表結(jié)構(gòu)設計實例試試整合進聯(lián)接表似乎能夠用了Hbase表結(jié)構(gòu)設計實例在HBase中列和傳統(tǒng)數(shù)據(jù)庫不同列可以動態(tài)增加的新插入的數(shù)據(jù)不需要是一個指定的類型甚至它不需要是一個列!Hbase表結(jié)構(gòu)設計實例現(xiàn)在試試 把show放入bandHbase不限制你怎么做只需要你的應用知道如何處理Hbase表結(jié)構(gòu)設計實例等等, show也
24、是一個實體,應該有它的屬性將nested entity再細分一下有辨識性的的屬性可以作為Column Qualifier其他屬性則可以組合在value中Hbase表結(jié)構(gòu)設計實例剛才將show放入了band可以放入其它信息么?比如樂隊成員?qualifier starts with:s + show_ida + album_idm + nameHbase表結(jié)構(gòu)設計一些建議宗旨為讀做優(yōu)化根據(jù)數(shù)據(jù)訪問方式來決定key的類型利用column family分割數(shù)據(jù)將數(shù)據(jù)組合在一起(替代join)盡量只是用一個讀操作完成一個請求(至少要做到盡可能少)避免熱點順序的rowkey可以使用bulkload來進行
25、插入預分配region60Hbase表結(jié)構(gòu)設計實例上網(wǎng)日志URL短鏈接微博粉絲關(guān)系私信的全文檢索其它?HBase ShellHBase Shell is 在(J)Ruby的IRB的基礎上加上了HBase的命令。任何你可以在IRB里做的事情都可在在HBase Shell中做。你可以這樣來運行HBase Shell: $ ./bin/hbase shell輸入 help 就會返回Shell的命令列表和選項。可以看看在Help文檔尾部的關(guān)于如何輸入變量和選項。創(chuàng)建一個名為 test 的表,這個表只有一個 列族 為 cf。 hbase(main):003:0 create test, cf可以列出所有
26、的表來檢查創(chuàng)建情況。 hbase(main):003:0 list插入 hbase(main):004:0 put test, row1, cf:a, value1Scan這個表 hbase(main):007:0 scan testGet一行 hbase(main):008:0 get test, row1刪除表 hbase(main):012:0 disable test 0 row(s) in 1.0930 seconds hbase(main):013:0 drop test 0 row(s) in 0.0770 seconds HBase APIpublic void createT
27、able(HTableDescriptor desc) 創(chuàng)建表api,通過HBaseAdmin對象來操作的,HBaseAdmin提供了createTable這個方法。HTableDescriptor 代表的是表的schemapublic void addFamily(final HColumnDescriptor family) 增加family通過 addFamily方法。HBaseAdmin hAdmin = new HBaseAdmin(hbaseConfig);HTableDescriptor t = new HTableDescriptor(tableName);HColumnDes
28、criptor cf1 = new HColumnDescriptor(f1);cf1.setBlocksize(65536);cf1.setMaxVersions(1);cf1.setBloomFilterType(BloomType.ROW);cf1.setCompressionType(Algorithm.SNAPPY);cf1.setDataBlockEncoding(DataBlockEncoding.PREFIX);cf1.setTimeToLive(36000);cf1.setInMemory(false);t.addFamily(cf1); hAdmin.createTable
29、(t);HBase APIHTable通過put方法來插入數(shù)據(jù)。可以傳遞單個批Put對象 public void put(final Put put) throws IOExceptionList put對象批量插入 public void put(final List puts) throws IOExceptionHbase 插入HTable table = new HTable(hbaseConfig, tableName);table.setAutoFlush(autoFlush);/設置是否自動flushList lp = new ArrayList(); int count = 1
30、0000; byte buffer = new byte1024; Random r = new Random();for (int i = 1; i = count; +i) Put p = new Put(String.format(“row%09d”,i).getBytes(); r.nextBytes(buffer); p.add(“f1.getBytes(), null, buffer); p.add(“f2.getBytes(), null, buffer); p.setWriteToWAL(wal); /設置是否寫入WAL lp.add(p); if(i%1000=0) tabl
31、e.put(lp); lp.clear(); HBase API刪除表也是通過HBaseAdmin來操作,刪除表之前首先要disable表。這是一個比較耗時的操作,所以不建議頻繁刪除表。Example:HBaseAdmin hAdmin = new HBaseAdmin(hbaseConfig);if (hAdmin.tableExists(tableName) hAdmin.disableTable(tableName);/Disable 表,不再提供讀寫 hAdmin.deleteTable(tableName);/刪除數(shù)據(jù)文件HBase APIHBase的查詢通過掃描和過濾來得到相關(guān)記錄
32、返回的記錄是排好序的設計一個好的行鍵來匹配訪問模式掃描器緩存的值決定了客戶端對HBase的RPC調(diào)用在掃描整張表后返回的行數(shù)緩存一次RPC獲取的行數(shù)Scan.setCaching(int)配置hbase.client.scanner.cachingHBase API單條查詢是通過rowkey在table中查詢某一行的數(shù)據(jù)。HTable提供了get方法來完成單條查詢。 public Result get(final Get get)批量查詢是通過制定一段rowkey的范圍來查詢。HTable提供了個getScanner方法來完成批量查詢。public ResultScanner getScann
33、er(final Scan scan)Scan s = new Scan();s.setMaxVersions(3);ResultScanner ss = table.getScanner(s);for(Result r:ss) System.out.println(new String(r.getRow(); for(KeyValue kv:r.raw() System.out.println(new String(kv.getColumn(); Hbase Filter過濾器是在HBase服務器端上執(zhí)行判斷操作過濾器可以應用到行鍵(RowFilter),列限定符(QualifierFilt
34、er)或者數(shù)據(jù)值(ValueFilter)過濾器允許對數(shù)據(jù)分頁處理(PageFilter),限制掃描器返回行數(shù)FilterList可以組合使用多個FilterHbase Filter 接口說明重置filter狀態(tài) reset()在過濾器中構(gòu)建邏輯來提早停止一次掃描: boolean filterAllRemaining()基于行鍵執(zhí)行過濾 boolean filterRowKey(byte buffer, int offset ,int length)如果該行沒有在上一步被過濾掉,接著調(diào)用這個方法處理當前行的每個keyvalue對象 ReturnCode filterKeyValue(KeyV
35、alue v)變換KeyValue (eg:KeyOnlyFilter) transform(KeyValue v)過濾掉keyvalue后,調(diào)用: (eg:DependentColumnFilter) void filterRow(List kvs)最后是否選擇過濾掉某些行:(eg:SingleColumnValueFilter) boolean filterRow()Hbase Filter接口說明ReturnCodeINCLUDE 包含這個CellINCLUDE_AND_NEXT_COL 包含這個Cell并跳過老版本SKIP 跳過這個cellNEXT_COL 跳轉(zhuǎn)到下一個columnNE
36、XT_ROW 跳轉(zhuǎn)到下一行SEEK_NEXT_USING_HINT Seek到下一個Hint值KeyValue getNextKeyHint(KeyValue currentKeyValue) 根據(jù)現(xiàn)在的KeyValue構(gòu)造下一個可能的KeyValueHbase FuzzyRowFilter用例Rowkey 樣式userId_actionId_timestamp(action比如登錄、修改密碼等)可以快速獲取到用戶的登錄操作等如果需要分析用戶最近的登錄狀況,怎么辦?全表掃描 + RowFilter?冗余存儲?(修改?)注意:Rowkey 需要定長FuzzyRowFilter rowFilter
37、 = new FuzzyRowFilter( Arrays.asList( new Pair( Bytes.toBytesBinary(x00 x00 x00 x00_login_), new byte 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0);Hbase 其它快速跳轉(zhuǎn)FilterMultiRowRangeFilterFusionRowFilter類似FuzzyRowFilter,但支持rangeList ranges = new ArrayList();ranges.add(new RowKeyRange(Bytes.toBytes(131), Bytes.toByt
38、es;ranges.add(new RowKeyRange(Bytes.toBytes(132), Bytes.toBytes;Filter filter = new MultiRowRangeFilter(ranges);List ranges = new ArrayList();ranges.add(new BytesRange(0 , 2, new byte1,0, new byte1,9);ranges.add(new BytesRange(4 , 1, new byte1, new byte1);FusionRowFilter filter = new FusionRowFilter(ranges);HBase輔助索引本地索引(region級別)針對region中的數(shù)據(jù)進行輔助索引適用場景:userId+time,查詢某用戶符合某種條件的數(shù)據(jù)/jira/browse/HBASE-8980全局索引查詢限制條件少創(chuàng)建索引表可以在插入同時創(chuàng)建索引表能夠通過MapReduce重建索引表還未發(fā)布,請耐心等待74RowKeyColumn qualifiervaluefilterValueOrignal
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 動畫版權(quán)保護戰(zhàn)略規(guī)劃協(xié)議3篇
- 合同違約責任合同蓋章3篇
- 守校合同守則3篇
- 勞動合同分公司談判技巧3篇
- 合同續(xù)約的注意事項3篇
- 物流公司租賃合同范例
- 發(fā)包方終止合同合作關(guān)系3篇
- 物業(yè)包租合同范例
- 渠道中介合同范例
- 工程項目業(yè)務員合同范例
- T∕CAAA 005-2018 青貯飼料 全株玉米
- s鐵路預應力混凝土連續(xù)梁(鋼構(gòu))懸臂澆筑施工技術(shù)指南
- 撥叉831006設計說明書
- 程序語言課程設計任意兩個高次多項式的加法和乘法運算
- WLANAP日常操作維護規(guī)范
- GE公司燃氣輪機組支持軸承結(jié)構(gòu)及性能分析
- 石油鉆井八大系統(tǒng)ppt課件
- 北師大版二年級數(shù)學上冊期末考試復習計劃
- 人教PEP版六年級英語上冊《Unit4_B_Let’s_learn教學設計》
- 農(nóng)村供水工程設計技術(shù)要點
- 收貨回執(zhí)單1頁
評論
0/150
提交評論