HBASE

1. hbase特点

  • hbase是一种基于hdfs的NoSQL数据库,弥补了hdfs无法随机写的缺陷。

2. hbase的基本概念

  • 命名空间(namespace)
    hbase没有databse的概念,namespace类似database;
    hbase自带两个namespace:hbase和default,hbase用户存储hbase的内置表(metadata),default用于存储创建时未指定namespace的表
  • 列族(column family)
    一个或多个列的集合,底层存储时,相同列族的列会被存在同一个地方(hdfs的同一个文件夹);
    创建表时必须制定列族,之后可追加

  • 与关系型数据库的列类似,在hbase中,一个列属于且只属于一个列族;但每行数据同一个列族中的列可以不一样
  • Row Key
    类似关系型数据库的主键,可唯一定位出一行数据;存入hbase的数据会自动以字典序排列,查询时只能通过row key进行检索
    hbase只支持一列未做row_key,假设利用sqoop从mysql导入到hbase,需要将多个列作为row_key,可使用参数–hbase-row-key “column1,column2,…”。虽然可操作,但是hbase会以”_"将其拼接成一列。
  • Region
    hbase会按row key对存储的数据进行切片,一个切片即一个region,同一个region的数据会被存放在同一个region server上,当同一个region的数据量过大(默认256m),会将region切分成两个新的region

hbase不能有多个列族 hbase可以没有列族_数据

  • Store
    一个region由一个或多个store组成,table有几个列族就有几个store;一个store由一个memstore和0个或多个storefile组成
  • MemStore
    memStore是放在内存里的,保存修改数据;当memStore的大小达到了一个阈值(默认64),memStore会被flush到文件,形成快照。
  • StoreFile
    memStore内存中的数据写到文件后就是StoreFile,flush一个生成一个新的storeFile,storeFile底层以HFile的格式保存
  • HFile
    HFile是HBase中key-value数据的存储格式,是hadoop的二进制文件,一个storeFile对于一个HFile,而HFile存储于hdfs

    ==HBase可以实现秒级响应的随即写操作,其主要原因就是通过记录用户的操作记录,然后打上时间戳,在读的时候根据时间戳返回最新的数据(HBase的高效随即写其实是“假”的) ==

3. HBase基本架构

  • 角色:Master和Region Server
  • Region Server作用(DML)
    data get(select)、put(insert,update)、delete
    region:splitRegion、compactRegion
  • Master作用(DDL)
    Table:create、delete、alter
    RegionServer:分配region到RegionServer,监控每个RegionServer的状态

4. HBase语法

  • hbase shell 进入命令行
  • 当输入错误语法时,shell会一直换行,无法执行,此时可以通过在shell输入 >‘ 来退出当前编辑状态
  • help 查看帮助
  • 建命名空间
  1. creata_namespace ‘namespace_name’
  • 列出所有命名空间
  1. list_namespace
  • 删除命名空间
  1. drop_namespace ‘namespace_name’
    删除命名空间前必须先清空命名空间下的所有表

  • 建表
  1. create ‘tablename’ ,‘info’
    创建了一张名为tablename的表,该表有一个名为info的列族
  2. create ‘tablename’,‘info1’,‘info2’
    创建了一张名为tablename的表,该表有名为info1和info2的列族
  3. create ‘namespace_name:table_name’,‘info’
    将表建在名称为namespace的命名空间下
  • 查看表
  1. list
    列出所有命名空间下的所有表
  2. desc/describe ‘tablename’
    查看表结构
  • 删除表
  1. drop ‘tablename’
    drop前需要先disable表
    disable ‘tablename’
  • 更改表
  1. 更改version
    alter ‘tablename’ ,{NAME => ‘列族’,VERSIONS=>3}
    HBase允许对同一个row key的相同位置存放多个版本的数据,通过VERSIONS来控制保存的版本数量

  • 往表插入数据
  1. put ‘namespace:table_name’,‘row key’,'列族:列名‘,‘value’
    put ‘ns1:student’,‘1000’,‘info:name’,‘zhangsan’
  2. put ‘namespace:table_name’,‘row key’,'列族:列名‘,‘value’,timestamp
    该timestamp用于标记数据的“新旧”,在取数据时,会返回timestamp最新的数据
    put会按照对rowkey以字典序对数据进行排序
  • 查询
  1. scan ‘ns:table_name’
    输出整张表的内容
  2. scan ‘ns:table_name’,{STARTROW => ‘1001’,ENDROW => ‘1111’}
    查询rowkey在[1001,1111]内的所有内容
  3. scan ‘ns:table_name’,{RAW=TRUE,VERSIONS=10}
    指定历史修改的版本
  4. get ‘ns:table_name’,‘row key’
    必须指定row key,查询rowkey所有列族的内容
  5. get ‘ns:table_name’,‘row key’,‘列族’
  6. get ‘ns:table_name’,‘row key’,‘列族:column1’,‘列族:columns2’…
    指定列column1、column2
  • 删除
  1. deleteall ‘ns:table_name’,‘row key’
    删除整个rowkey为’row key’的值,删除条件至少指定到’row key’
  2. delete ‘ns:table_name’,‘row key’,‘列族‘
    delete在shell模式下,删除条件至少指定到’列族’,而在api中delete和deleteall一样
  3. truncate ‘ns:table_name’
    清空整张表的内容
    == 数据在hdfs中以/region/列族 的路径存储==

5. 常用命令

  • 计数
# 法1 hbase shell下
  count 'table_name'    #该方法效率慢
  #法2  linux shell下
  hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'table_name'   #效率远高于法1