初識Hbase

HBase中的一張表java

  1. schema-less 每一列沒有類型。只須要告知column family,不關心每一列的名字和類型
  2. 每個cell能存儲多個版本,默認只保留最近的3個版本,每次建立,修改,刪除都會變動版本號
  3. rowkey 每一行都不同,真個table的全部row都是惟一的
  4. 在HBase中的原生數據都是以byte的形式存儲的
  5. cell :經過[ rowkey, column family,column qualifier]定位,例如:
Put p =new Put(Bytes.toByte("TheRealMT"));
p.add(Bytes.toByte("info"))
p.add(Bytes.toByte("name"))
p.add(Bytes.toByte("Mark Twain"))
複製代碼

在這裏 rowdy是 TheRealMT,column family是 info,column qualifier是name,cell中真正存值是 Mark Twainapi

  1. table建立好以後,每次修改column family必須先下線當前的額表
  2. column qualifier能被當作數據,HBase自己至關因而一個多維的map
  3. hbase總沒有多對多和一對多這種映射,更多的是非結構化數據
  4. hbase單行操做是原子的

schema設計通常須要考慮如下幾個問題:bash

  • table該有幾個column family?
  • 數據應該去哪一個column family?
  • 每一個column family該有幾個column?
  • 每一個column該叫什麼名字?
  • 什麼樣的信息該放入cells?
  • 每一個cells裏面改存儲幾個版本?
  • rowkey的結構是什麼,它自己該包含什麼信息?

如何理解HBase中的key-value結構?

寬表和高表的概念

wide table: 包含多個列的table;
tall table: 包含多行的table;less

tall table 相對來講性能會好一點ide

rowkey設計須要考慮的一些因素

在內存中,數據存在的時候就已是排好序的,當存儲到HFile的時候也是排好序的,HBase中獲取數據的惟一方式就是rowkey性能

  1. 基於IO的考慮,好比時間做爲rowkey,若是要獲取前幾秒的數據,那麼掃描一小塊數據就能獲得想要的結果,可是要寫入數據的時候,頗有可能一直是寫在了table的最後面,負載不均勻
  2. 寫優化。好比時間來講,讀是很快,可是以寫來消耗的。要優化寫,即均勻分佈,首先能夠經過 hash,這樣每次查找的時候,必須知道rowkey生成的元素,同時確保生成的rowkey能經過肯定的方式計算獲得;其次能夠經過添加隨機元素(salt)的方式生成rowkey,好比根據機器的多少,生成隨機數,並與之取模再得出rowkey的前綴,而後拼上時間
  3. 讀優化。好比時間放在前面的狀況
  4. 拼接順序和決定放什麼元素在裏頭都很重要

好比 名字+時間戳 的組合優化

Olivia1
    Olivia2
    Olivia5
    Olivia7
    Olivia9
    TheFakeMT2
    TheFakeMT3
    TheFakeMT4
    TheFakeMT5
    TheFakeMT6
    TheRealMT1
    TheRealMT2
    TheRealMT5
    TheRealMT8
複製代碼

時間戳+名字 的組合加密

1Olivia
1TheRealMT
2Olivia
2TheFakeMT
2TheRealMT
3TheFakeMT
4TheFakeMT
5Olivia
5TheFakeMT
5TheRealMT
6TheFakeMT
7Olivia
8TheRealMT
9Olivia
複製代碼

若是要知道一段時間以內某個名字的行,(時間戳+名字)的方式須要遍歷整個表,而(名字+時間戳)則不須要spa

使用MD5加密rowkey的好處:長度是一致的,再也不須要單獨的分隔符。可是時沒法獲取原來的rowkey元素
把信息放在rowkey的好處:能夠以常量的時間獲取數據設計

java訪問的通常方式

java api鏈接HBase,通常使用HTablePool,而後根據pool再拿到具體的表。單個的建立表的方式花銷太大

附錄

本文來自<HBase In Action>一書。推薦。能夠基本瞭解HBase的概念

相關文章
相關標籤/搜索