HBase

hbase

第一部分 初始 HBase

第1节 HBase简介

1.1 HBase是什么

HBase基于Google的BigTable论文而来,是一个分布式海量列式非关系型数据库系统,可以提供超大规模数据集的实时随机读写

接下来通过一个场景,初步认识HBase列式存储

如下是Mysql存储机制,空值字段会浪费存储空间

idnameagesalaryjob
1 小明 23   学生
2 小红   10w 律师
         

如果是列式存储可以这样

rowkey :1 name:小明

rowkey :1 age:23

rowkey :1 job:学生

rowkey :2 name:小红

rowkey :2 salary:10w

rowkey :2 job:律师

列式存储的优点
  1. 减少存储空间占用

  2. 支持好多列

1.2 HBase的特点

  • 海量存储:底层基于hdfs存储海量数据

  • 列式存储: HBase表的数据是基于列族进行存储的,一个列族包含若干列

  • 极易扩展:底层依赖HDFS,当磁盘不足时,增加dataNode节点就可以

  • 高并发:支持高并发读写请求

  • 稀疏:列的灵活性,在列族中,可以指定任意多的列,空不占空间

  • 数据的多版本:HBase表中数据有多个版本,默认通过版本号区分,值为插入时的时间戳

  • 数据类型单元:以字节数组存储

 

第2节 HBase数据模型

以表(有列有行)形式存储

2.1 逻辑架构

  • 列族,建表时指定,存储时写入文件以列族为整体存储

  • 每个列族下包含多个列

  • rowkey 主键唯一标识 按字典顺序排序

  • region 横向切分表的一部分,大了可以再切

  • store 保存一个列族,有几个列族就有几个store

 

2.2 物理存储

storeFile 以列族为整体存储,store中有写其他属性

timestamp 版本号 写入的时间戳

type put写 delete 删除

 

关键字
概念描述
命名空间 类似于关系型数据库的database概念,每个命名空间下有多个表。HBase两个⾃带的命名空间,分别是hbase和default,hbase中存放的是HBase内置的表,default表是⽤户默认使⽤的命名空间。⼀个表可以⾃由选择是否有命名空间,如果创建表的时候加上了命名空间后,这个表名字以:作为区分!
Table 类似于关系型数据库的表概念。不同的是,HBase定义表时只需要声明列族即可,数据属性,⽐如超时时间(TTL),压缩算法(COMPRESSION)等,都在列族的定义中定义,不需要声明具体的列。
Row(⼀⾏逻辑数据) HBase表中的每⾏数据都由⼀个RowKey和多个Column(列)组成。⼀个⾏包含了多个列,这些列通过列族来分类,⾏中的数据所属列族只能从该表所定义的列族中选取,不能定义这个表中不存在的列族,否则报错NoSuchColumnFamilyException。
RowKey(每⾏数据主键) Rowkey由⽤户指定的⼀串不重复的字符串定义,是⼀⾏的唯⼀标识!数据是按照RowKey的字典顺序存储的,并且查询数据时只能根据RowKey进⾏检索,所以RowKey的设计⼗分重要。如果使⽤了之前已经定义的RowKey,那么会将之前的数据更新掉!
ColumnFamily(列族) 列族是多个列的集合。⼀个列族可以动态地灵活定义多个列。表的相关属性⼤部分都定义在列族上,同⼀个表⾥的不同列族可以有完全不同的属性配置,但是同⼀个列族内的所有列都会有相同的属性。列族存在的意义是HBase会把相同列族的列尽量放在同⼀台机器上,所以说,如果想让某⼏个列被放到⼀起,你就给他们定义相同的列族。
ColumnQualifier(列) Hbase中的列是可以随意定义的,⼀个⾏中的列不限名字、不限数量,只限定列族。因此列必须依赖于列族存在!列的名称前必须带着其所属的列族!例如info:name,info:age
TimeStamp(时间戳--》版本) ⽤于标识数据的不同版本(version)。时间戳默认由系统指定,也可以由⽤户显式指定。在读取单元格的数据时,版本号可以省略,如果不指定,Hbase默认会获取最后⼀个版本的数据返回!
Cell ⼀个列中可以存储多个版本的数据。⽽每个版本就称为⼀个单元格(Cell)。
Region(表的分区) Region由⼀个表的若⼲⾏组成!在Region中⾏的排序按照⾏键(rowkey)字典排序。Region不能跨RegionSever,且当数据量⼤的时候,HBase会拆分Region。

第3节 HBase整体架构

zookeeper
  • 实现HMaster高可用

  • 保存HBase的元数据信息,是所有HBase表的寻址入口(存储的地址信息,元数据表在哪个regionServer上)

  • 监控HMaster和HRegionServer

HMaster
  • 为HRegionServer分配Region

  • 维护整个集群的负载均衡

  • 管理和维护元数据信息

  • 发现失效的Region,将region移动到正常的HRegionServer上

HRegionServer
  • 管理Region

  • 接受客户端读写请求

  • 切换运行中变大的Region

Region
  • 每个HRegion由多个store组成

store
  • 每个store保存一个列族(columns family),有几个列族就有几个store

  • 由一个metaStore和多个storeFile组成,metaStore是store在内存中的内容,写到文件后就是storeFile,StoreFile底层是以HFile的格式保存

 

 

第4节 HBase集群安装部署

  1. 下载安装包

  2. 规划安装目录

    /opt/lagou/servers/

     

  3. 上传安装包

    rz

     

  4. 解压到安装目录

    tar -zxvf hbase-1.3.1-bin.tar.gz -C /opt/lagou/servers

     

  5. 修改配置文件

    • 把hadoop的hdfs-site.xml core-site.xml拷贝到hbase的conf目录

    ln -s /opt/lagou/servers/hadoop-2.9.2/etc/hadoop/core-site.xml /opt/lagou/servers/hbase-1.3.1/conf/core-site.xml
    ln -s /opt/lagou/servers/hadoop-2.9.2/etc/hadoop/hdfs-site.xml /opt/lagou/servers/hbase-1.3.1/conf/hdfs-site.xml
    • 修改hbase conf下的配置文件

      • hbase-env.sh

        #添加java环境变量
        export JAVA_HOME=/opt/lagou/servers/jdk1.8.0_231/
        #指定使⽤外部的zk集群
        export HBASE_MANAGES_ZK=false
      • hbase-site.xml

      <configuration> 
      <!-- 指定hbase在HDFS上存储的路径 -->
      <property>
      <name>hbase.rootdir</name>
      <value>hdfs://lxl20:9000/hbase</value>
      </property>
      <!-- 指定hbase是分布式的 -->
      <property>
      <name>hbase.cluster.distributed</name>
      <value>true</value>
      </property>
      <!-- 指定zk的地址,多个⽤“,”分割 -->
      <property>
      <name>hbase.zookeeper.quorum</name> <value>lxl20:2181,lxl21:2181,lxl22:2181</value>
      </property>
      </configuration>

       

  6.  

 

原文地址:https://www.cnblogs.com/jiaozi-li/p/14213811.html