小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Hbase關(guān)鍵的幾個(gè)點(diǎn)

 xujin3 2017-10-09

薦書進(jìn)行時(shí)



一. 什么時(shí)候需要HBase


1. 半結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù)


對于數(shù)據(jù)結(jié)構(gòu)字段不夠確定或雜亂無章很難按一個(gè)概念去進(jìn)行抽取的數(shù)據(jù)適合用HBase。當(dāng)業(yè)務(wù)發(fā)展需要增加存儲比如一個(gè)用戶的email,phone,address信息時(shí)RDBMS需要停機(jī)維護(hù),而HBase支持動(dòng)態(tài)增加.


2. 記錄非常稀疏


RDBMS的行有多少列是固定的,為null的列浪費(fèi)了存儲空間。而如上文提到的,HBase為null的Column不會被存儲,這樣既節(jié)省了空間又提高了讀性能。


3. 多版本數(shù)據(jù)


根據(jù)Row key和Column key定位到的Value可以有任意數(shù)量的版本值,因此對于需要存儲變動(dòng)歷史記錄的數(shù)據(jù),用HBase就非常方便了。對于某一值,業(yè)務(wù)上一般只需要最新的值,但有時(shí)可能需要查詢到歷史值。


4. 超大數(shù)據(jù)量


當(dāng)數(shù)據(jù)量越來越大,RDBMS數(shù)據(jù)庫撐不住了,就出現(xiàn)了讀寫分離策略,通過一個(gè)Master專門負(fù)責(zé)寫操作,多個(gè)Slave負(fù)責(zé)讀操作,服務(wù)器成本倍增。隨著壓力增加,Master撐不住了,這時(shí)就要分庫了,把關(guān)聯(lián)不大的數(shù)據(jù)分開部署,一些join查詢不能用了,需要借助中間層。隨著數(shù)據(jù)量的進(jìn)一步增加,一個(gè)表的記錄越來越大,查詢就變得很慢,于是又得搞分表,比如按ID取模分成多個(gè)表以減少單個(gè)表的記錄數(shù)。經(jīng)歷過這些事的人都知道過程是多么的折騰。采用HBase就簡單了,只需要加機(jī)器即可,HBase會自動(dòng)水平切分?jǐn)U展,跟Hadoop的無縫集成保障了其數(shù)據(jù)可靠性(HDFS)和海量數(shù)據(jù)分析的高性能(MapReduce)。


二. HTable一些基本概念


1. Row key


行主鍵, HBase不支持條件查詢和Order by等查詢,讀取記錄只能按Row key(及其range)或全表掃描,因此Row key需要根據(jù)業(yè)務(wù)來設(shè)計(jì)以利用其存儲排序特性(Table按Row key字典序排序如1,10,100,11,2)提高性能。


2. Column Family(列族)


在表創(chuàng)建時(shí)聲明,每個(gè)Column Family為一個(gè)存儲單元。


3. Column(列)


HBase的每個(gè)列都屬于一個(gè)列族,以列族名為前綴,如列article:title和article:content屬于article列族,author:name和author:nickname屬于author列族。


Column不用創(chuàng)建表時(shí)定義即可以動(dòng)態(tài)新增,同一Column Family的Columns會群聚在一個(gè)存儲單元上,并依Column key排序,因此設(shè)計(jì)時(shí)應(yīng)將具有相同I/O特性的Column設(shè)計(jì)在一個(gè)Column Family上以提高性能。


4. Timestamp


HBase通過row和column確定一份數(shù)據(jù),這份數(shù)據(jù)的值可能有多個(gè)版本,不同版本的值按照時(shí)間倒序排序,即最新的數(shù)據(jù)排在最前面,查詢時(shí)默認(rèn)返回最新版本。Timestamp默認(rèn)為系統(tǒng)當(dāng)前時(shí)間(精確到毫秒),也可以在寫入數(shù)據(jù)時(shí)指定該值。


5. Value


每個(gè)值通過4個(gè)鍵唯一索引,tableName+RowKey+ColumnKey+Timestamp=>value


6. 存儲類型


  • TableName 是字符串

  • RowKey 和 ColumnName 是二進(jìn)制值(Java 類型 byte[])

  • Timestamp 是一個(gè) 64 位整數(shù)(Java 類型 long)

  • value 是一個(gè)字節(jié)數(shù)組(Java類型 byte[])。


將HTable的存儲結(jié)構(gòu)理解為


即HTable按Row key自動(dòng)排序,每個(gè)Row包含任意數(shù)量個(gè)Columns,Columns之間按Column key自動(dòng)排序,每個(gè)Column包含任意數(shù)量個(gè)Values。理解該存儲結(jié)構(gòu)將有助于查詢結(jié)果的迭代。


三. 模式設(shè)計(jì)應(yīng)遵循的原則


1. 列族的數(shù)量以及列族的勢


列族的數(shù)量越少越好,牽扯到了hbase的flushing;同一個(gè)表中不同列族所存儲的記錄數(shù)量的差別也需要考慮(列族的勢),會造成記錄數(shù)量少的列族的數(shù)據(jù)分散在多個(gè)region上,影響查詢效率。


2. 行鍵的設(shè)計(jì)


避免使用時(shí)序或者單調(diào)(遞增/遞減)行鍵,否則會導(dǎo)致連續(xù)到來的數(shù)據(jù)會被分配到統(tǒng)一region中。


3. 盡量最小化行鍵和列族的大小


避免hbase的索引過大,加重系統(tǒng)存儲的負(fù)擔(dān)


4. 版本的數(shù)量


HColumnDescriptor設(shè)置版本的數(shù)量,避免設(shè)置過大,版本保留過多。


作者:颯然Hang,架構(gòu)師/后端工程師,working@中華萬年歷

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多