• 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查出
    
  • 相关阅读:
    【Android开发学习笔记】【高级】【随笔】插件化——初探
    【Android测试】【第十三节】Uiautomator——如何组织好你的测试代码(项目实战)
    【Android测试】【第十二节】Uiautomator——API详解
    【Android测试】【第十一节】Uiautomator——简介
    【Android测试】【第十节】MonkeyRunner—— 录制回放
    【Android测试】【第九节】MonkeyRunner—— 初识
    poj 1475 推箱子
    leetcode Ch3-DFS & Backtracking I
    Windows Socket和Linux Socket编程的区别 ZZ
    Linux网络编程入门 (转载)
  • 原文地址:https://www.cnblogs.com/xiao-bu/p/14429576.html
Copyright © 2020-2023  润新知