HBASE

hbase

1.hbase简介

1.1hbase定义

HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库

1.2HBase数据模型

  逻辑上,HBase的数据模型同关系型数据库很类似,数据存储在一张表中,有行有列。但从HBase的底层物理存储结构(K-V)来看,HBase更像是一个multi-dimensional map。

1.2.1hbase逻辑结构

hbase 逻辑上是一张大表,行上面有region划分 ,列上面有列族划分(column family)
每个region上面有多个行(row)组成 每个行(row)有一个RowKey和多个Column(列)组成
row :HBase中的每个列都由Column Family(列族)和Column Qualifier(列限定符)进行限定,
Cell :由{rowkey, column Family:column Qualifier, time Stamp} 唯一确定的单元。 在图中表示即 张三 为一个单元
Time Stamp :用于标识数据的不同版本(version),每条数据写入时,系统会自动为其加上该字段,其值为写入HBase的时间。

1.2.2HBase物理存储结构

1.2.3 HBase基本架构

     架构角色:
     1)Region Server
      Region Server为 Region的管理者,其实现类为HRegionServer,主要作用如下:
      对于数据的操作:get, put, delete;
      对于Region的操作:splitRegion、compactRegion。
     2)Master
      Master是所有Region Server的管理者,其实现类为HMaster,主要作用如下:
  对于表的操作:create, delete, alter
      对于RegionServer的操作:分配regions到每个RegionServer,监控每个RegionServer的状态,负载均衡和故障转移。
     3)Zookeeper
      HBase通过Zookeeper来做master的高可用、RegionServer的监控、元数据的入口以及集群配置的维护等工作。
     4)HDFS
      HDFS为Hbase提供最终的底层数据存储服务,同时为HBase提供高可用的支持。

2.hbase的安装部署

hbase是依赖zookeeper的 首先要安装zookeeper 这里就不多做介绍了  详见zookeeper 安装部署
1)下载hbase  并解压到指定目录  并重命名
  tar -zxvf hbase-2.0.5-bin.tar.gz -C /opt/module
  mv /opt/module/hbase-2.0.5 /opt/module/hbase
2) 配置环境变量
   sudo vim /etc/profile.d/my_env.sh
   #HBASE_HOME
    export HBASE_HOME=/opt/module/hbase
    export PATH=$PATH:$HBASE_HOME/bin
3)修改HBase对应的配置文件。  一共修改三个文件
   1.hbase-env.sh修改内容:
    export HBASE_MANAGES_ZK=false
   2.hbase-site.xml修改内容
    <configuration>
       <property>
          <name>hbase.rootdir</name>
          <value>hdfs://hadoop102:8020/hbase</value>
      </property>
      <property>
          <name>hbase.cluster.distributed</name>
          <value>true</value>
      </property>

      <property>
          <name>hbase.zookeeper.quorum</name>
          <value>hadoop102,hadoop103,hadoop104</value>
      </property>

      <property>
          <name>hbase.unsafe.stream.capability.enforce</name>
          <value>false</value>
      </property>
      
      <property>
          <name>hbase.wal.provider</name>
          <value>filesystem</value>
      </property>
  </configuration>
     3.regionservers:
      hadoop102
      hadoop103
      hadoop104

3.hbase的启动,关闭

start-hbase.sh
stop-hbase.sh
单点启动
hbase-daemon.sh start master
hbase-daemon.sh start regionserver
在哪个节点上启动   master就是那个节点

4.查看HBase页面

http://hadoop102:16010 

5.高可用

在HBase中HMaster负责监控HRegionServer的生命周期,均衡RegionServer的负载,如果HMaster挂掉了,
那么整个HBase集群将陷入不健康的状态,并且此时的工作状态并不会维持太久。所以HBase支持对HMaster的高可用配置。
1.关闭HBase集群(如果没有开启则跳过此步)
  stop-hbase.sh
2.在conf目录下创建backup-masters文件
  touch conf/backup-masters
3.在backup-masters文件中配置高可用HMaster节点
  echo hadoop103 > conf/backup-masters
4.将整个conf目录scp到其他节点
  scp -r conf/ hadoop103:/opt/module/hbase/
  scp -r conf/ hadoop104:/opt/module/hbase/
5.打开页面测试查看
  http://hadooo102:16010
  http://hadooo103:16010

6.HBase Shell操作

1.进入HBase客户端命令行
  hbase shell
2.查看帮助命令
   help
3.查看当前数据库中有哪些表
  list
4.表的操作
  1)创建表  所有数据都用引号引起来  指定表明  列族名
    create 'student','info'
  2)插入数据到表
    put 'student','1001','info:name','zhangsan'
    put 'student','1001','info:age','18'
    put 'student','1001','info:gender','male'
    put 'student','1002','info:name','lisi'
    put 'student','1002','info:gender','female'

   3)更新,修改指定字段的数据   (还是直接put就行)
    put 'student','1001','info:name','wamhwu'
    put 'student','1001','info:age','100'
   4)扫描查看表数据  scan 查看全部或者行 get  查看一行或者一个cell  get效率更高
    查看全部  scan 'student'
    查看指定行 从1001开始到最后  scan 'student',{STARTROW => '1001'}
    查看指定行 从1001开始到指定位置 左闭右开  scan 'student',{STARTROW => '1001', STOPROW  => '1003'}  即1001,1002两行
    查看指定行 从1001开始到1003    scan 'student',{STARTROW => '1001', STOPROW  => '1003!'}大于1003的最小数  
    查看指定行 从10001开始到1003之前的所有行  scan 'student',{STARTROW => '1001', STOPROW  => '1002|'}  大于1002的最大数但不超过1003
    查看全部信息  scan 'student', {RAW => true, VERSIONS => 10}

    查看指定cell get 'student','1001','info:name'
    查看指定行   get 'student','1001'
   5)查看表结构
     describe 'student'
   6)统计表数据行数(rowkey的个数)
     count 'student'
   7)删除数据
     删除某rowkey的全部数据:deleteall 'student','1001'
     删除某rowkey的某一列数据: delete 'student','1002','info:sex'
   8)清空表数据
     truncate 'student'
    清空表的操作顺序为先disable,然后再truncate。
   9)删除表
     首先需要先让该表为disable状态:disable 'student'
     然后才能drop这个表:drop 'student'
     如果直接drop表,会报错:ERROR: Table student is enabled. Disable it first.
   10)变更表信息
     将info列族中的数据存放3个版本将info列族中的数据存放3个版本
     alter 'student',{NAME=>'info',VERSIONS=>3}
     get 'student','1001',{COLUMN=>'info:name',VERSIONS=>3}
   11)namespace
      ※list_namespace
      default(创建表时未指定命名空间的话默认在default下)                                                                                             
      hbase(系统使用的,用来存放系统相关的元数据信息等,勿随便操作)
      ※创建namespace
      create_namespace "test"  or create_namespace "test",{"author"=>"xiaobu", "create_time"=>"2020-03-10 08:08:08"}
      ※查看namespace
      describe_namespace "test01"
      ※修改namespace的信息
      alter_namespace "test01", {METHOD => 'set', 'author' => 'xiaobu'}
      ※删除namespace
      drop_namespace "test01"   注意的是要删除的namespace必须是空的,其下没有表。

7.整合phoenix

1.上传并解压tar包  tar -zxvf apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz -C /opt/module/
2.复制server包并拷贝到各个节点的hbase/lib (自我理解:这里phoenix相当于hbase的一个客户端,用sql的方式操作hbase)
  cp /opt/module/phoenix/phoenix-5.0.0-HBase-2.0-server.jar /opt/module/hbase/lib/  然后分发到所有的hbase集群中,保证每个hbase机器上有server包
3.配置环境变量(这个比较特殊,解压完成之后没有lib目录或者其他目录存放相关的jar包,所以配置了类路径)
  export PHOENIX_HOME=/opt/module/phoenix
  export PHOENIX_CLASSPATH=$PHOENIX_HOME
  export PATH=$PATH:$PHOENIX_HOME/bin
4.启动hbase 
 start-hbase
5.phoenix架构  thin

6.Phoenix Shell操作
  1)创建schema  
    默认情况下,在phoenix中不能直接创建schema。需要将如下的参数添加到Hbase中conf目录下的hbase-site.xml 和 phoenix中bin目录下的 hbase-site.xml中,hbase-site.xml集群中的每台机器都要有这个文件。
 <property>
        <name>phoenix.schema.isNamespaceMappingEnabled</name>
        <value>true</value>
    </property>

 重启hbase客户端和phoenix客户端
 2)启动phoenix客户端的两种方式   thick and   thin
   thick client :sqlline.py hadoop102,hadoop103,hadoop104:2181
   thin client: 1) queryserver.py start 2) sqlline-thin.py Hadoop102:8765     有架构图可知,首先启动queryserver,然后在启动sqlline  
   两种方式都可以不用指定主机名以及端口号
   create schema bigdata;
   注意:在phoenix中,schema名,表名,字段名等会自动转换为大写,若要小写,使用双引号,如"student"。create schema if not exists “student”
 3)显示所有表
   !table 或者!tables
 4)创建表
直接指定单个列作为RowKey

CREATE TABLE IF NOT EXISTS student(
id VARCHAR primary key,
name VARCHAR,
addr VARCHAR);

指定多个列的联合作为RowKey

CREATE TABLE IF NOT EXISTS us_population (
State CHAR(2) NOT NULL,
City VARCHAR NOT NULL,
Population BIGINT
CONSTRAINT my_pk PRIMARY KEY (state, city));
 upsert into us_population values('NY','New York',8143197) ;
 upsert into us_population values('CA','Los Angeles',3844829) ;
  5)插入数据(比较特殊  insert 和upset的结合)
    upsert into student values('1001','zhangsan','beijing');    
  6)查询
    select * from student;
    select * from student where id='1001';
  7)删除记录
    delete from student where id='1001';
  8)删除表
    drop table student;
  9)退出命令行
    !quit
  7.表的映射
   1) Hbase中没有表,phoenix中创建表会同时在hbase中也创建表
   create 'emp','info'
   put 'emp','1001','info:name','zhangsan'
   put 'emp','1001','info:addr','beijing'
   2) Hbase中有表, 可以在phoenix中创建视图(只读)进行映射
   create view "emp"(
     id varchar primary key , 
     "info"."name" varchar ,
     "info"."addr" varchar
   )
   select * from "emp" ; 
   select id , "name","addr" from "emp" ;
   upsert into "emp" values('1002','lisi','shanghai');  Error: ERROR 505 (42000): Table is read only. (state=42000,code=505)
   drop view "emp";   
   删除view后,habse 中的表不会删除
   3) Hbase中有表, 可以在phoenix中创建表进行映射
   create table "emp"(
     id varchar primary key , 
     "info"."name" varchar ,
     "info"."addr" varchar
   )
   COLUMN_ENCODED_BYTES = NONE;

   select * from "emp" ; 
   select id , "name","addr" from "emp" ; 
   drop table "emp";  
    删除phoenix后,hbase中的表连带被删除
    8.表映射中数值类型的问题
      phoenix存,phoenix查.没有问题  phoenix 默认int hbase 默认long
      phoenix存,hbase查.有问题
      hbase存,hbase查,没有问题
      hbase存,phoenix查,有问题
  phoenix存,hbase查(phoenix存,phoenix查没有问题)
数字改成无符号类型的 UNSIGNED_INT
 create table test (
   id varchar primary key , 
   name varchar ,
   salary UNSIGNED_INT
 )
 COLUMN_ENCODED_BYTES = NONE;
upsert into test values('1001','zs',123456); 
hbase中数字默认编码解码LONG类型,所以用下列方式
scan "TEST1",{COLUMNS => ['0:SALARY:toInt']}

hbase存,hbase查  还要把之前phoenix存的删除
put 'TEST','1002','0:NAME','ls'
put 'TEST','1002','0:SALARY',Bytes.toBytes(456789)
scan "TEST1",{COLUMNS => ['0:SALARY:toLong']}

用hbaseAPI存入一个INT类型的值 ,即可在phoenix查出
posted @ 2021-02-22 13:01  triumph丶xs  阅读(387)  评论(0编辑  收藏  举报