HBase(二)

hadoop实时day20–Apache HBase


今日课程内容大纲
1、Apache HBase 内部原理
2、zk在hbase中作用
3、HBase读写数据流程
4、HBase 3个核心机制
	memstore flush机制
	storefile compact机制
	region  split机制
5、HBase java api操作
	hbase <--->spark、flink、java
	DDL:创建表  删除表 修改表(shell)
	DML:put get scan  delete 
	查询是重中之重。
6、HBase和mapreduce集成	
	如何使用mr程序读写hbase的数据

课程重点:all.

HBase 架构原理

image-20210325113847482

  • hbase中zk的作用

    • zk保存了meta表的位置信息

    • meta表中记录了表的元数据信息

    • 所有任何表的DML操作必须先访问zk.

    • 栗子

      #step1  客户端访问zk
      get /hbase/meta-region-server    #结果:meta在node-2上 
      
      #step2 去node-2上读取meta表数据
      scan 'hbase:meta'   #结果:  t_user 数据位于node-2
      
      #step3 客户端直接去node-2上 通过regionserver和表region进行交互
      

    image-20210325113333404

  • HBase 读写数据流程

    img

    • 写数据流程

    • img

      • 客户端访问zk 获取meta表位置信息。客户端进行cache(缓存),便于后续访问。

      • 客户端根据meta位置信息 到指定rs服务器上读取meta信息

      • 获取待写入数据位于region位置信息。

      • 客户端直接去对应regionserver上 进行数据写操作

      • 先写wal,在写memstore。两个都成功校验无误 客户端返回。

        至于内存中数据后续如何写入磁盘 属于hbase内部问题 客户端不关心的。
        
    • 读数据流程

      • 客户端访问zk 获取meta表位置信息。客户端进行cache,便于后续访问。

      • 客户端根据meta位置信息 到指定rs服务器上读取meta信息

      • 获取待待读取数据位于region位置信息。

      • 客户端直接去对应regionserver上 进行数据读操作

        • 先读memstore 再读storefile
        • 把结果进行合并 找出符合客户端需要的数据版本返回(主要是因为版本问题)。
        上述这种机制导致hbase在读数据反而比写数据。这正好好mysql等主流数据库相反。
        
        hbase写数据的时候比mysql快一个数量级。 在读数据的时候反而满了一个数量级。
        

        image-20210325113914798

        image-20210325114908801


HBase 3个核心机制
  • memstore flush机制

    • 背景

      因为客户端在写数据的时候都是直接把数据写入内存的。内存使用大写是有限制 无法支撑大表数据所有存储。意味着最终的数据还是需要落入磁盘变成文件。
      
    • 本质:memstore----->storeFile

    • 触发机制

      # RegionServer级别
      	hbase.regionserver.global.memstore.size=0.4  #可以堆内存40%
      	hbase.regionserver.global.memstore.size.lower.limit=0.95 #触发比例
      	
      	策略:当触发刷新阈值 
      	按照 Memstore 由大到小执行,先 Flush Memstore最大的Region,
      	再执行次大的,
      	直至总体Memstore 内存使用量低于阈值
      	
      	弊端:在regionserver级别flush 会阻塞整个regionserver服务 性能影响最大。
      	
      # region级别	
      	hbase.hregion.memstore.flush.size   #默认128M
      	注意:当大于 4*128M region会阻塞 速度写入过快 抛出异常。
      	
      # 时间触发机制
      	hbase.regionserver.optionalcacheflushinterval  默认1小时
      	
      # 手动触发机制
      	flush ‘tablename‘
      
  • StoreFile Compact 机制

    • 背景

      memstore flush,会把内存中数据刷新到磁盘上变成storefile文件。
      每刷写一次都是一个文件,造成后续小文件过多。
      
      弊端: 给namenode造成压力 元数据吃内存
      	  后续hbase查询数据也不方便
      	  
      减少 StoreFile数量,提升数据读取效率
      
    • 本质:把多个storefile文件最终合并成为一个文件。在合并中对待删除数据(墓碑标记)超时数据进行最终的物理删除

    • 具体来看

      • minor compaction 小合并

        挑选相邻的多个小文件 重写合并成为一个大文件。 此过程中 不会对数据进行任何删除操作。
        
      • major compaction 大合并

        保证最终一个列族store对应着一个storefile文件 合并中进行数据删除(墓碑标记、过期)
        
    • 触发机制

      #major 触发机制
      	hbase.hregion.majorcompaction  #大合并间隔7天
      	hbase.hregion.majorcompaction.jitter #0.5抖动比例
      	
      建议:大合并十分耗费资源和性能 会对hbase正常业务访问造成影响  在企业生产环境中 建议设置为0 关闭自己触发的机制
      解决:在业务低峰期 手动执行命令进行大合并
      	major_compact 
      	
      #minor 触发机制
      	hbase.hstore.compactionThreshold  #storeflie 超过3个
      
  • region spilt 机制

    • 背景

      hbase在管理表的时候 会把表拆分成不同region
      不同region可以存储在不同regionserver上 达到大表数据能够存储下和负载均衡问题。
      
      随着数据不断插入 region也会越来越大 涉及region如何拆分问题。
      
      建表的时候 默认是一个region。
      
    • 机制

      # 在hbase 0.94版本之前  ConstantSizeRegionSplitPolicy
      	hbase.hregion.max.filesize = 10G
      	如果某个region的数据达到10G 就会等分为2.
      	实际切割
      	
      # 在hbase 0.94版本之后  IncreasingToUpperBoundRegionSplitPolicy 	
      	Min (R^2 * “hbase.hregion.memstore.flush.size”,
      “hbase.hregion.max.filesize”)
      
      	R:region 个数
      	hbase.hregion.memstore.flush.size =128M
      	hbase.hregion.max.filesize = 10G
      	
      	动态
      
    • 注意事项

      • 在hbase region拆分过程中 需要regionserver参与拆分
      • 在region进行迁移 负载均衡的时候 需要master参与 涉及跨网络跨机器传递数据。
      • 企业中通常采用预分区技术 提前指定分区个数。再加上rowkey良好设计 保证数据尽量负载均衡。避免了数据跨机器迁移

HBase角色职责
  • HMaster

    • DDL操作
    • region故障恢复、负载均衡迁移
  • HRegionServer

    • DML操作
    • 3个核心机制:memstore flush、storefile compact、region split
  • zk集群

    • meta表位置信息

      /hbase/meta-region-server
      
    • master HA

    • hbase集群的信息

      • 主从角色当前在线的位置信息
      • 命名空间列表 表列表
    • 无zk无hbase.


HBase java API
  • 在实际开发中 对于hbase操作 几乎都是通过代码操作的。(java sacla)

  • java操作hbase的过程中 只需要指定zk集群的地址即可

  • HBase 通用基础API

     //创建hbase配置对象 用于指定集群信息
     Configuration conf = HBaseConfiguration.create();
     //设置zk集群信息
     conf.set("hbase.zookeeper.quorum","node-1:2181,node-2:2181,node-3:2181");
    
     //通过连接工厂类获取一个连接
     Connection connection = ConnectionFactory.createConnection(conf);
     //基于连接获取Admin对象  Table对象
     Admin admin = connection.getAdmin(); //DDL操作
     Table table = connection.getTable("表名"); //DML操作
    
  • 具体操作

    • DDL

      • 开发环境准备–判断一张表是否存在
      • 创建表
      • 修改表
    • DML

      • 插入数据 put

        myuser.put(put);
        myuser.put(List<Put> puts);
        
      • 查询数据

        • get 查询
        • scan 查询
      • 删除数据

        addColumn(final byte [] family, final byte [] qualifier)
        addColumn(byte [] family, byte [] qualifier, long timestamp)    
        addColumns(final byte [] family, final byte [] qualifier)
        addColumns(final byte [] family, final byte [] qualifier, final long timestamp)
            
        //
         //delete.addColumn(Bytes.toBytes("f1"),Bytes.toBytes("name"));  //不指定 删除最新版本
        //delete.addColumn(Bytes.toBytes("f1"),Bytes.toBytes("name"),2); //指定的话 删除指定的版本数据
        //delete.addColumns(Bytes.toBytes("f1"),Bytes.toBytes("name")); //不指定 删除的是全部版本数据
        delete.addColumns(Bytes.toBytes("f1"),Bytes.toBytes("name"),2);//指定版本 删除小于等于指定版本的数据   
        
        create 't_5', {NAME => 'f1', VERSIONS => 3}
        
        put 't_5','001','f1:name','allen1',1
        put 't_5','001','f1:name','allen2',2
        put 't_5','001','f1:name','allen3',3
        
        scan 't_5', {VERSIONS => 5}
        
      • filter 过滤器的使用

  • HBase中工具类

    • Bytes工具类

      • 因为hbase底层数据都是bytes[] 在编程中繁涉及其他数据类型和byte[]之间互相转换的问题。
      • hbase为此封装了一个工具类 专门用于bytes操作
      org.apache.hadoop.hbase.util.Bytes
      
    • CellUitil工具类

      • 在开发中涉及到从cell中提取列族 列 列值等属性信息 提取出来是bytes类型
      • hbase为此封装了一个工具来 专门用于提取cell属性信息。
      org.apache.hadoop.hbase.CellUtil
      
  • hbase filter过滤器

    • 客户端进行扫描的时候 如果添加过滤器 在哪里执行呢?

      过滤器在服务端执行  regionserver那里执行  把过滤之后的结果再返回客户端。
      
    • 如何使用过滤器呢?

      • Comparator 比较器 根据何种规则比较。

        BinaryComparator 按字典序顺序比较指定字节数组,采用 Bytes.compareTo(byte[])
        BinaryPrefixComparator 跟前面相同,只是比较左端的数据是否相同
        RegexStringComparator 提供一个正则的比较器,仅支持 EQUAL 和非 EQUAL
        SubstringComparator 判断提供的子串是否出现在value 中。 string.contains
        
      • 比较运算符

        LESS <
        LESS_OR_EQUAL <=
        EQUAL =
        NOT_EQUAL <>
        GREATER_OR_EQUAL >=
        GREATER >
        NO_OP 排除所有
        
    • 过滤器种类

      • RowFilter
      • FamilyFilter
      • QualifierFilter
      • ValueFilter
      • SingleColumnValueFilte
      • SingleColumnValueExcludeFilter
      • PrefixFilter

今日作业
  • HBase 架构组件 regionserver内部组件

  • HBase读写流程

    • zk到底承担什么职责
  • HBase 3个核心机制

    • flush
    • compact
    • split
  • java api操作

    配置对象
    
    连接 工厂
    
    admin
    
    Table
    
  • 预先课程

    • hbase和其他软件整合

      • mapreduce读写
      • hive整合
      • sqoop使用
    • 预分区

    • rowkey设计

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

章鱼哥TuNan&Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值