zoukankan      html  css  js  c++  java
  • 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查出
    
  • 相关阅读:
    Codeforces Round #344 (Div. 2) C. Report 其他
    Codeforces Round #344 (Div. 2) B. Print Check 水题
    Codeforces Round #344 (Div. 2) A. Interview 水题
    8VC Venture Cup 2016
    CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂 中二版
    CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂
    CDOJ 1279 班委选举 每周一题 div2 暴力
    每周算法讲堂 快速幂
    8VC Venture Cup 2016
    Educational Codeforces Round 9 F. Magic Matrix 最小生成树
  • 原文地址:https://www.cnblogs.com/xiao-bu/p/14429576.html
Copyright © 2011-2022 走看看