Hbase(Hadoop Database)是一种高可靠性,高性能,面向列,可伸缩的分布式存储系统。 
 
 
 
 
  
 
 

   行键:每行都有唯一的行键,行键没有数据类型,它内部被认为是一个字节数组。 
 
 
 

   列簇:数据在行中被组织成列簇,每行有相同的列簇,但是在行之间,相同的列簇   不需要有相同的列修饰符。在引擎中,HBase将列簇存储在它自己           的数据文件中,所以,它们需要事先被定义,此外,改变列簇并不容易。 
 
 
 

   列修饰符:列簇定义真实的列,被称之为列修饰符,你可以认为列修饰符就是列本身。 
 
 
 

   版本:每列都可以有一个可配置的版本数量,你可以通过列修饰符的制定版本获取数据。 
 
 
 
 
  
 
Hbase原理
 

  1. hbase的存储文件为HFile,每个HFile对应一个Family,结构为key-value 

 

  2. 表数据的存储形式为region,region中存储连续的row-key 

 

  3. 当region大于一定值后,从中间进行拆分成两个子region 

 

  4. 每一台region server包含多个region 

 

  5. memstore用于数据缓存的内存区 

 

  6. WAL为数据操作日志 

 

  7. memstore定期将数据依据WAL写入到HFile 

 
 
 
 

  8.               master          slave 

 

  hdfs        namenode     datanode 

 

  mr          JobTracker     TaskTracker 

 

  hbase     Master           RegionServer 

 
 
 
 

  9. 服务端出错,会将正确的值插入到库中;客户端出错,都不会提交,因此在catch里进行调用table.flushCommits 

 
Hbase的安装模式
 本地模式:
 
 参数文件
 配置参数
 参考值
hbase-env.sh 
 JAVA_HOME
/usr/java/jdk/
hbase-site.xml
hbase.rootdir
  file:///usr/local/cloud/hbase/data
 
 
 
 
 伪分布式模式:   
 
参数文件
配置参数
参考值
  .bash_profile
  HBASE_HOME
/usr/local/cloud/hbase
hbase-env.sh
JAVA_HOME
 /usr/java/jdk/
  
  HBASE_MANAGES_ZK
  true
hbase-site.xml
  hbase.rootdir
  hdfs://192.168.56.81:9000/hbase
  
  hbase.cluster.distributed
  true
  
  hbase.zookeeper.quorum
  192.168.56.31
  
  dfs.replication
  1
  regionservers
  
  localhost
 
 
 
 
全分布模式
 
 参数文件
 配置参数
参考值
 .bash_profile
 HBASE_HOME
/usr/local/cloud/hbase
hbase-env.sh
 JAVA_HOME
/usr/java/jdk/
  
HBASE_MANAGES_ZK
true
 hbase-site.xml
hbase.rootdir
hdfs://192.168.56.31:9000/hbase
  
 hbase.cluster.distributed
true
  
 hbase.zookeeper.quorum
192.168.56.31
  
dfs.replication
  2
  
  hbase.master.maxclockskew
  180000
regionservers
  
  192.168.56.33
  192.168.56.4
 
 
 
 
 
 
 
常用配置
 
 
 
 

  hbase.client.write.buffer 

 

  20971520 

 

  本地缓存大小(字节),当达到该大小量时,进行提交操作 

 
 
 
 

  hbase.regionserver.lease.period 

 

  180000 

 

  设置每一次scan的超时时间 

 
 
 
 
 常用命令
 创建table
 

  create 'testtable','cf1','cf2' 

 

  # 为列族cf1和cf2指定保存的版本数量 

 

  create 'testtable',{NAME=>'cf1',VERSIONS=>3},{NAME=>'cf2',VERSIONS=>3} 

 
 
 
 
 插入数据
 

  put 'testtable','r1','cf1:c1','v1' 

 

  put 'testtable','r1','cf1:c2','v2' 

 

  put 'testtable','r1','cf2:c3','v3' 

 

  put 'testtable','r1','cf2:c4','v4' 

 
 
 
 
 开启插入数据本地缓存  false开启 true关闭
 

  setAutoFlush(false) 

 

  isAutoflush() 

 

  flushCommits() 

 
 设置本地缓存大小(单位字节)
 

  setWriteBufferSize() 

 

  getWriteBufferSize() 

 
 
 
 
 判断数据是否存在,只返回布尔值
 

  boolean exists(Get get) 

 
 
 
 

   getRowOrBefore 

 

   当rowkey存在时,直接输出 

 

   当rowkey不存在时,输出前一个 

 

  Result res = table.getRowOrBefore("r3".getBytes(), "cf1".getBytes()); 

 
 查询数据
 

  scan 'testtable' 

 

  # 查看三个版本以内的数据 

 

  scan 'testtable',{VERSIONS=>3} 

 

  get 'testtable','r1' 

 
 
 
 
 
 删除数据 

 

  delete 'testtable','r1','cf2:c4' 

 
 
 
 

    
 删除表 

 

  disable 'testtable' 

 

  drop 'testtable' 

 
 
 
 
 设置返回的行数
 

  scan.setCaching(num) 

 
 设置返回行的列数
 

  scan.setBatch(num)