日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

0 HBase簡介

HBase是一個構建在HDFS之上,用于海量數據存儲分布式列存儲系統。

  • 表的每行都是按照RowKey的字典序排序存儲
  • 表的數據是按照RowKey區間進行分割存儲成多個region

所以HBase主要適用下面這兩種常見場景:

  • 適用于基于rowkey的單行數據快速隨機讀寫
  • 適合基于rowkey前綴的范圍掃描

1 為什么需要二級索引

HBase的一級索引就是rowkey,我們僅僅能通過rowkey進行檢索。假設我們相對Hbase里面列族的列列進行一些組合查詢,就只能全表掃描了。表如果較大的話,代價是不可接受的,所以要提出二級索引的方案。

二級索引的思想:簡單理解就是,根據列族的列的值,查出rowkey,再按照rowkey就能很快從hbase查詢出數據,我們需要構建出根據列族的列的值,很快查出rowkey的方案。

2 常見的二級索引方案

  1. MapReduce方案;
  2. Coprocessor方案;
  3. elasticsearch+hbase方案;
  4. Solr+hbase方案;

2.1 MapReduce方案

IndexBuilder:利用MR的方式構建Index 長處:并發批量構建Index 缺點:不能實時構建Index

舉例: 原表:

row  1      f1:name  zhangsan
row  2      f1:name  lisi
row  3      f1:name  wangwu

索引表:

row     zhangsan    f1:id   1
row     lisi        f1:id   2
row     wangwu      f1:id   3

這種方式的思想是再構建一張hbase表,列族的列這里的name作為索引表的rowkey,根據rowkey查詢出數據hbase是很快的,拿到id后,也就拿到了原表的rowkey了,因為源表的rowkey就是id,每次查詢一共需要查詢兩張表。

2.2 Coprocessor方案

有關協處理器的講解,Hbase官方文檔是最好的,這里大體說一下它的作用與使用方法。

  1. Coprocessor提供了一種機制可以讓開發者直接在RegionServer上運行自定義代碼來管理數據。 通常我們使用get或者scan來從Hbase中獲取數據,使用Filter過濾掉不需要的部分,最后在獲得的數據上執行業務邏輯。但是當數據量非常大的時候,這樣的方式就會在網絡層面上遇到瓶頸。客戶端也需要強大的計算能力和足夠大的內存來處理這么多的數據,客戶端的壓力就會大大增加。但是如果使用Coprocessor,就可以將業務代碼封裝,并在RegionServer上運行,也就是數據在哪里,我們就在哪里跑代碼,這樣就節省了很大的數據傳輸的網絡開銷。
  2. Coprocessor有兩種:Observer和Endpoint EndPoint主要是做一些計算用的,比如計算一些平均值或者求和等等。而Observer的作用類似于傳統關系型數據庫的觸發器,在一些特定的操作之前或者之后觸發。學習過Spring的朋友肯定對AOP不陌生,想象一下AOP是怎么回事,就會很好的理解Observer了。Observer Coprocessor在一個特定的事件發生前或發生后觸發。在事件發生前觸發的Coprocessor需要重寫以pre作為前綴的方法,比如prePut。在事件發生后觸發的Coprocessor使用方法以post作為前綴,比如postPut。 Observer Coprocessor的使用場景如下: 2.1. 安全性:在執行Get或Put操作前,通過preGet或prePut方法檢查是否允許該操作; 2.2. 引用完整性約束:HBase并不直接支持關系型數據庫中的引用完整性約束概念,即通常所說的外鍵。但是我們可以使用Coprocessor增強這種約束。比如根據業務需要,我們每次寫入user表的同時也要向user_daily_attendance表中插入一條相應的記錄,此時我們可以實現一個Coprocessor,在prePut方法中添加相應的代碼實現這種業務需求。 2.3. 二級索引:可以使用Coprocessor來維持一個二級索引。正是我們需要的

索引設計思想

關鍵部分來了,既然Hbase并沒有提供二級索引,那如何實現呢?先看下面這張圖

 

我們的需求是找出滿足cf1:col2=c22這條記錄的cf1:col1的值,實現方法如圖,首先根據cf1:col2=c22查找到該記錄的行鍵,然后再通過行健找到對應的cf1:col1的值。其中第二步是很容易實現的,因為Hbase的行鍵是有索引的,那關鍵就是第一步,如何通過cf1:col2的值找到它對應的行鍵。很容易想到建立cf1:col2的映射關系,即將它們提取出來單獨放在一張索引表中,原表的值作為索引表的行鍵,原表的行鍵作為索引表的值,這就是Hbase的倒排索引的思想。

雖然官方一直也沒提供內置的支持二級索引的工具, 不過業界也有些比較知名的基于Coprocessor的開源方案:

  • 華為的hindex : 基于0.94版本,當年剛出來的時候比較火,但是版本較舊,看GitHub項目地址最近這幾年就沒更新過。
  • Apache Phoenix: 功能圍繞著SQL on hbase,支持和兼容多個hbase版本, 二級索引只是其中一塊功能。 二級索引的創建和管理直接有SQL語法支持,使用起來很簡便, 該項目目前社區活躍度和版本更新迭代情況都比較好。

ApachePhoenix在目前開源的方案中,是一個比較優的選擇。主打SQL on HBase , 基于SQL能完成HBase的CRUD操作,支持JDBC協議。 Apache Phoenix在Hadoop生態里面位置:

 

Phoenix二級索引特點:

  • Covered Indexes(覆蓋索引) :把關注的數據字段也附在索引表上,只需要通過索引表就能返回所要查詢的數據(列), 所以索引的列必須包含所需查詢的列(SELECT的列和WHRER的列)。
  • Functional indexes(函數索引): 索引不局限于列,支持任意的表達式來創建索引。
  • Global indexes(全局索引):適用于讀多寫少場景。通過維護全局索引表,所有的更新和寫操作都會引起索引的更新,寫入性能受到影響。 在讀數據時,Phoenix SQL會基于索引字段,執行快速查詢。
  • Local indexes(本地索引):適用于寫多讀少場景。 在數據寫入時,索引數據和表數據都會存儲在本地。在數據讀取時, 由于無法預先確定region的位置,所以在讀取數據時需要檢查每個region(以找到索引數據),會帶來一定性能(網絡)開銷。

其他的在網上也很多自己基于Coprocessor實現二級索引的文章,大體都是遵循類似的思路:構建一份“索引”的映射關系,存儲在另一張hbase表或者其他DB里面。

方案優缺點:

  • 優點: 基于Coprocessor的方案,從開發設計的角度看, 把很多對二級索引管理的細節都封裝在的Coprocessor具體實現類里面, 這些細節對外面讀寫的人是無感知的,簡化了數據訪問者的使用。
  • 缺點: 但是Coprocessor的方案入侵性比較強, 增加了在Regionserver內部需要運行和維護二級索引關系表的代碼邏輯等,對Regionserver的性能會有一定影響。

2.3 elasticsearch+hbase方案

比如說你現在有一行數據

id name age ….30 個字段

但是你現在搜索,只需要根據 id name age 三個字段來搜索

如果你傻乎乎的往 es 里寫入一行數據所有的字段,就會導致說 70% 的數據是不用來搜索的,結果硬是占據了 es 機器上的 filesystem cache 的空間,單挑數據的數據量越大,就會導致 filesystem cahce 能緩存的數據就越少

僅僅只是寫入 es 中要用來檢索的少數幾個字段就可以了,比如說,就寫入 es id name age 三個字段就可以了,然后你可以把其他的字段數據存在 MySQL 里面,我們一般是建議用 es + hbase 的這么一個架構。

hbase 的特點是適用于海量數據的在線存儲,就是對 hbase 可以寫入海量數據,不要做復雜的搜索,就是做很簡單的一些根據 id 或者范圍進行查詢的這么一個操作就可以了

從 es 中根據 name 和 age 去搜索,拿到的結果可能就 20 個 doc id,然后根據 doc id 到 hbase 里去查詢每個 doc id 對應的完整的數據,給查出來,再返回給前端。

 

你最好是寫入 es 的數據小于等于,或者是略微大于 es 的 filesystem cache 的內存容量

然后你從 es 檢索可能就花費 20ms,然后再根據 es 返回的 id 去 hbase 里查詢,查 20 條數據,可能也就耗費個 30ms,可能你原來那么玩兒,1T 數據都放 es,會每次查詢都是 5 ~ 10 秒,現在可能性能就會很高,每次查詢就是 50ms。

四個字總結的話,我覺得就是“各司其職”,HBase 就用來存儲,ES 就用來做索引,況且目前的實際情況跟文章中說的也很像,要查詢的字段就幾個,而其他的字段又很大又沒用,沒必要都丟到 ES 中,浪費查詢效率

2.4 Solr+hbase方案

Solr是一個獨立的企業級搜索應用server,它對并提供相似干Web-service的API接口。用戶能夠通過http請求,向搜索引擎server提交一定格式的XML文件,生成索引。也能夠通過Http Get操作提出查找請求,并得到XML格式的返回結果。

Solr是一個高性能。採用JAVA5開發。基干Lucene的全文搜索server。同一時候對其進行了擴展。提供了比Lucene更為豐富的查詢語言,同一時候實現了可配置、可擴展并對查詢性能進行了優化,而且提供了一個完好的功能節理界面。是一款非常優秀的全文搜索引擎。

HBase無可置疑擁有其優勢,但其本身僅僅對rowkey支持毫秒級的高速檢索,對于多字段的組合查詢卻無能為力。基于Solr的HBase多條件查詢原理非常easy。將HBase表中涉及條件過濾的字段和rowkey在Solr中建立索引,通過Solr的多條件查詢高速獲得符合過濾條件的rowkey值,拿到這些rowkey之后在HBASE中通過指定rowkey進行查詢。

 

網上其它還有根據Phoenix構建的,redis、mysql等都是可以嘗試的。

分享到:
標簽:HBase
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定