初识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的概念