HBase学习 - 入门(1)

r囧r小猫 2022-03-19 09:58 396阅读 0赞

HBase Version 1.2.11 hbase官方英文文档

HBase Version 0.95 hbase中文文档

参考学习网址一:HBase教程

目录:

  1. HBase概述:HBase是Hadoop的生态系统,HBase是一个分布式,版本化,面向列的数据库,构建在 Apache Hadoop和 Apache ZooKeeper之上。
  2. HBase与HDFS
  3. HBase运行模式

    1. 第一种:独立式HBase
      运行环境:安装Java、安装HBase(使用自带的Zookeeper,不使用HDFS,而是使用本地文件系统)
    2. 第二种:独立于HDFS的HBase
      运行环境一:安装Java、安装Hadoop、安装HBase(使用自带的Zookeeper)
      运行环境二:安装Java、安装Hadoop、安装HBase(不使用自带的Zookeeper,就安装Zookeeper)
    3. 第三种:伪分布式HBase:
      运行环境一:安装Java、安装HBase(使用自带的Zookeeper)
      运行环境三:安装Java、安装HBase(不使用自带的Zookeeper,安装Zookeeper)
      运行环境二:安装Java、安装Hadoop、安装HBase(使用自带的Zookeeper)
      运行环境三:安装Java、安装Hadoop、安装HBase(不使用自带的Zookeeper,安装Zookeeper)
    4. 第四种:完全分布式:
      运行环境:安装Java、安装Hadoop、安装Zookeeper、安装HBase(不使用自带的Zookeeper,安装Zookeeper)
  4. 安装:hbase安装
  5. HBase配置
  6. HBase Shell

    1. 启动HBase Shell
    2. 测试:shell命令
  7. HBase数据模型
    简单来说,应用程序是以表的方式在HBase存储数据的。表是由行和列构成的,所有的列是从属于某一个列族的。行和列的交叉点称之为cell,cell是版本化的。cell的内容是不可分割的字节数组。
    表的行键也是一段字节数组,所以任何东西都可以保存进去,不论是字符串或者数字。HBase的表是按key排序的,排序方式之针对字节的。所有的表都必须要有主键-key.

    1. 概念视图
      HBase以表的形式存储数据,表由行和列组成。列划分为若干个列族,如下图所示:format_png

      1. RowKey:Hbase使用Rowkey来唯一的区分某一行的数据。如图中”rk001”
      2. 列族:Hbase通过列族划分数据的存储,列族下面可以包含任意多的列,实现灵活的数据存取。Hbase的列族不是越多越好,官方推荐的是列族最好小于或者等于3。我们使用的场景一般是1个列族。如图中的“CF1”列族,下面包含两个列:”Name”和”Alias”。
      3. 列名:一个列名是由它的列族前缀和修饰符(qualifier)连接而成。例如列CF1:Name是列族 CF1加冒号(:)加 修饰符 Name组成的。
      4. 时间戳:TimeStamp对Hbase来说至关重要,因为它是实现Hbase多版本的关键。在Hbase中使用不同的timestame来标识相同rowkey行对应的不通版本的数据。
      5. Cell:HBase 中通过 rowkey 和 columns 确定的为一个存储单元称为 cell。每个 cell 都保存着同一份 数据的多个版本。版本通过时间戳来索引。
    2. 物理视图
    3. 列族
      watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lpZ3VhbmdfODIw_size_16_color_FFFFFF_t_70
    4. Cells
      A {row, column, version} 元组就是一个HBase中的一个 cell。Cell的内容是不可分割的字节数组。
    5. 版本
      一个 {row, column, version} 元组是HBase中的一个单元(cell).但是有可能会有很多的单元的行和列是相同的,可以使用版本来区分不同的单元.
    6. 底层存储数据模型watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lpZ3VhbmdfODIw_size_16_color_FFFFFF_t_70 1

      1. 一个小实例:watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lpZ3VhbmdfODIw_size_16_color_FFFFFF_t_70 2
  8. HBase架构format_png 1

    1. hbase meta表

      1. hbase有两个关键表ROOT表与meta表。其实在hbase0.98之后,hbase就废弃了ROOT表,仅保留meta表(还有namespace表,该表只与hbase命名空间有关,这里不做介绍),并且该表不允许split。
      2. meta split
        在0.98后,meta被禁止进行split操作。要知道meta表的一条记录包含了一个region的位置、起始key,创建时间等信息。那万一region数量过大怎么办?查看了公司集群一共1091个region,meta表的大小如图所示:
        format_png 2
        假定集群有十万个region,meta表也就400多M。在生产环境下,hbase.hregion.max.filesize配置为10G,如果按照这个大小来看,meta可支持的region的数据是一个很可观的数量。
      3. meta位置
        meta表location info以非临时znode的方式注册到zk上,如下图,可知meta region位置为centos063机器。
        format_png 3
      4. meta表的结构
        meta表的rowkey组成为:表名,region startKey,创建时间.hash值。如果当前region为table的第一个region时(第一个region无start key)时,region startKey=null。
        watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lpZ3VhbmdfODIw_size_16_color_FFFFFF_t_70 3
      5. mete info
        meta表只有一个列簇info,并且包含四列:
        1、regioninfo :当前region的startKey与endKey,name等消息
        2、seqnumDuringOpen:
        3、server:region所在服务器及端口
        4、serverstartcode:服务开始的时候的timestamp
      6. 查找数据
        根据meta表查找key对应的region
      7. 插入数据
        当有一个key需要做put操作的时候,会先扫描meta表,找到对应region,然后进行插入操作。
        例如:有一个table具有三个region,每个region的startkey分别是 空,bar,foo,如下图:
        1 table,,1351700811858 2 table,bar,1351700819876 3 table,foo,1351700829874
        如果我们需要插入key ‘baz’ ,我们能找meta表中对应的rowkey为(table,bar,1351700819876)。
        这个查找完之后会缓存在客户端,下次查询的时候会根据缓存来直接去访问region。
    2. HMaster
      watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lpZ3VhbmdfODIw_size_16_color_FFFFFF_t_70 4
      HRegionServer故障转移的规则:不是从空闲的HRegionServer中选取(不用zookeeper进行选举),而是根据集群HRegionServer,从顺时针方向下一个中选取,也就不需要实时监控RegionServer,如下图
      watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lpZ3VhbmdfODIw_size_16_color_FFFFFF_t_70 5
      问题:
      watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lpZ3VhbmdfODIw_size_16_color_FFFFFF_t_70 6
      主备Master选举:
      watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lpZ3VhbmdfODIw_size_16_color_FFFFFF_t_70 7
      zookeeper在hbase中的集成:
      20190510112959876.png
    3. HRegionServer(区域服务器)

      1. 一个表可以按照行键(rowkey)分割为多个region,且region可以分布在不同的HRegionServer中。
      2. 每个表最初只有一个region,当记录数增加到超过某个阈值时,开始分裂为两个region。
      3. 物理上所有数据存放在HDFS,由RegionServer提供region的管理。
      4. 一个HRegionServer可以管理多个region实例和多个HLog。
      5. HRegionServer所代表是一台服务器,一般和NameNode在同一台。
        问题:为什么要在同一台?
        因为HBase的真是数据存储在hdfs上,如果在同一台的话,可以节省传输时间(也称为数据的本地化访问)
      6. region与regionServer的关系
        watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lpZ3VhbmdfODIw_size_16_color_FFFFFF_t_70 8
        类似于图书馆借书的思想。
        由hmaster负责,它只动口不动手,具体动手由zookeeper负责进行转移。
        如何转移?
        1.先看看表的信息存储方式
        watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lpZ3VhbmdfODIw_size_16_color_FFFFFF_t_70 9
        2.在看看如何转移
        watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lpZ3VhbmdfODIw_size_16_color_FFFFFF_t_70 10
    4. HRegion(地区)

      1. 一个HRegion至少有一个Store(即表只有一个列族的情况)。
        watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lpZ3VhbmdfODIw_size_16_color_FFFFFF_t_70 11
        watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lpZ3VhbmdfODIw_size_16_color_FFFFFF_t_70 12
    5. Store(商店)

      1. 在一个HRegion中,一个store代表一个列族的内容。
      2. Store的内容可以存储在不同的HRegionServer中。
        问题:HBase可以有多个列族,但是只建议使用一个列族?
        原因就是,store对应一个列族,但是一个表的多个列族对应的多个store可以放在不同的HRegionServer中,所以如果用户跨列族访问,将有可能读取一行数据的时候需要访问多台HRegionServer。
      3. 一个Store包含MemStore和HFile。
      4. MemStore:内存存储
        当用户put一条数据的时候,该数据会被先放到memstore中,当值达到一定的大小的时候,会flush成一个StoreFile文件。
        如:我们向hbase中put多条数据的时候(在一张新表当中),你的hdfs上将没有任何的内容。
      5. HFile:意思和storeFile代表的是同一个东西。

        1. 当storefile文件的数量增加到一定阈值后,系统会进行合并,在合并过程中会进行版本合并和删除工作,形成更大的storefile。
        2. 当storefile大小超过一定阈值后,会把当前的region分割为两个,并由HMaster分配到相应的region服务器,实现负载均衡。
        3. 客户端检索数据时,现在memstore找,找不到再找storefile。
        4. HFile的产生:

          1. memStore的大小达到指定值的时候会生成一个HFile。
          2. 用户手动执行flush操作。
          3. 用户执行stop-hbase.sh。
          4. memstore挂掉,从Hlog恢复数据的时候,也会产生一个新的Hfile。
      6. 问题:目前这种架构有一个问题:如果用户写入到memstore之后,还没有flush的时候,断电了怎么办?
        所以引入了一个新的概念:HLOG(WALS)预写式日志
        当用户在写入数据的时候,需要同时写入到memstore和Hlog都成功的时候,用户才能够看到操作成功。一般情况下Hlog的写入速度高于Hfile。在整个架构中,如果HBase一切正常工作的话,Hlog将不会提供提供读取的作用。
        Hlog存在意义:当memstore挂掉的时候,有数据丢失的话,将会从Hlog中拿取数据出来,写入成一个Hfile。
      7. HLog:灾难备份,预写式日志,记录所有更新操作,操作先记录进日志,数据才会写入
    6. Zookeeper在HBase担任的职能
      watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lpZ3VhbmdfODIw_size_16_color_FFFFFF_t_70 13
  9. 建表的时候如何分配region? — 3种

    1. 一般情况下,我们在建表之后,会默认生成一个region,当数据达到一定之后,HRegionServer会将region在分成两个region。【动态分配】
    2. 但是有时候我们已经知道了HRegionServer的数量时,可以采用固定的region分区:
      不管数据怎么增加,region的数量都不会进行改变。
  1. create 'emloyee','01', {NUMREGIONS => 3 ,SPLITALGO => 'HexStringSplit'}
  2. 每一个region会包含startkeyendkey
  3. 第一个regionstartkey为空
  4. 最后一个regionendKey为空
  5. 每一个regionendkey是不包含在当前region
  6. 3. 当确定rowkey的范围时,可以采用以下的方式
  7. create 'emloyee','e1',SPLITS => ['10','20','30','40']
  8. 会创建出5region
  1. 客户端client
    watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lpZ3VhbmdfODIw_size_16_color_FFFFFF_t_70 14
  2. HBase的容错性
    watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lpZ3VhbmdfODIw_size_16_color_FFFFFF_t_70 15
    配置HMaster主备:
    watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lpZ3VhbmdfODIw_size_16_color_FFFFFF_t_70 16
  3. Java操作hbase:Java操作hbase

发表评论

表情:
评论列表 (有 0 条评论,396人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Hbase入门

    Hbase是一个开源的非关系型数据库(nosql),他参考了谷歌的bigtable建模,实现语言java 是apache软件基金会的hadoop项目的一部分,运行在hdfs