hbase客户端读写操作

hbase在切分或合并的时候,会清除垃圾文件,并不是立马清除,清除垃圾是在后台启动的,需要一定的时间,才能清除完成

一、hbase读写流程

base中,除了用户创建的表,还有系统表,这些表都存储在hdfs上

访问hbase中,可以看到用户表和系统表

在这里插入图片描述
在这里插入图片描述
在hdfs上也可以看到
此处为命名空间,默认为default,还有一个hbase,里面用于存储系统表
hehe是后期建的
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在hbase中,list查看表时,不显示系统表,但可以通过scan扫描
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1)系统表

hbase:namespace: 用于存储命名空间的信息
hbase:meta:用于存储其他表的所有region信息,记录了每个region的所在节点(datanode),即在哪个regionServer,开始key和结束key

2)读流程

1.连接zookeeper,获取meta

2.检索,查找rowkey所在的region的位置信息,连接对应的regionServer

3.如果设置了in-memory缓存

1)先在in-memory中查找数据,有就获取,没有就去memstore中查找
2)如果memstore中没有,再去storefile中获取
3)数据会被保存在缓存中

4.如果没有设置in-memory缓存

在memstore中查找,没有在去storefile中获取

3)写流程

1.连接zookeeper,获取meta

2.检索,查找rowkey所在的region的位置信息,连接对应的regionServer

3.将写入的数据保存到memstore中

4.后台自动触发flush写入storefile

memstore溢写到storefile的方法
1.大小超过128M
2.到了一定时间
3.手动触发flush '表名‘’

二、过滤器

客户端访问服务器时查询数据,服务器将全表数据通过网络发送到客户端,如果在客户端过滤,查询输出,虽然也可以实现过滤,获取想要的数据结果,但是对于网络的压力过大,因此,可以通过过滤器,在服务器端将数据过滤,然后发送到客户端,降低网络传输的压力

  • 基于 HBase 本身提供的三维有序(行键,列,版本有序),过滤器可以根据列族、列、版本等更多的条件来对数据进行过滤,这些过滤器可以高效地完成查询过滤的任务
  • 使用过滤器至少需要两类参数:
    一类是抽象的操作符,另一类是比较器

1)操作符

HBase 提供了枚举类型的变量来表示这些抽象的操作符:

LESS				小于
LESS_OR_EQUAL		小于或等于
EQUAL				等于
NOT_EQUAL			不等于
GREATER_OR_EQUAL	大于或等于
GREATER				大于
NO_OP				不做任何比较

2)比较器

  • 比较器作为过滤器的核心组成之一,用于处理具体的比较逻辑,例如字节级的比较,字符串级的比较等。

分类

1)RegexStringComparator :支持正则表达式的值比较

应用

Scan scan = new Scan();
RegexStringComparator comp = new RegexStringComparator("you."); // 以 you 开头的字符串
SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("family"), Bytes.toBytes("qualifier"), CompareOp.EQUAL, comp);
scan.setFilter(filter);

2)SubStringComparator:用于监测一个子串是否存在于值中,并且不区分大小写。

Scan scan = new Scan();
SubstringComparator comp = new SubstringComparator("1129"); // 查找包含 1129 的字符串
SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("family"), Bytes.toBytes("qualifier"), CompareOp.EQUAL, comp);
scan.setFilter(filter);

3)BinaryPrefixComparator:前缀二进制比较器。与二进制比较器不同的是,只比较前缀是否相同。
效率慢

Scan scan = new Scan();
BinaryPrefixComparator comp = new BinaryPrefixComparator(Bytes.toBytes("yting")); //
SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("family"), Bytes.toBytes("qualifier"),  CompareOp.EQUAL, comp);
scan.setFilter(filter);

4)BinaryComparator:二进制比较器,用于按字典顺序比较 Byte 数据值。

Scan scan = new Scan();
BinaryComparator comp = new BinaryComparator(Bytes.toBytes("xmei")); //
ValueFilter filter = new ValueFilter(CompareOp.EQUAL, comp);
scan.setFilter(filter);

3)过滤器

  • 列值过滤器:效率较低,需要做全表扫描
    SingleColumnValueFilter:用于测试值的情况(相等,不等,范围 等)

  • 列族过滤器
    FamilyFilter:用于过滤列族(通常在 Scan 过程中通过设定某些列族来实现该功能,而不是直接使用该过滤器)。

  • 列名过滤器
    QualifierFilter:用于列名(Qualifier)过滤。

  • 行键过滤器:效率较高,行键前缀过滤效率较高
    RowFilter:行键过滤器,一般来讲,执行 Scan 使用 startRow/stopRow 方式比较好,而 RowFilter 过滤器也可以完成对某一行的过滤。

将文科班的学生提取出来
代码演示

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;

public class Fileter_Demo4 {
    Connection conn;
    @Before
    public void init() throws IOException {
        Configuration conf = new Configuration();
        conf.set("hbase.zookeeper.quorum","master");
        conn = ConnectionFactory.createConnection(conf);
    }
    @Test
    public void scanfilter() throws IOException {
        //运行在regionserver中的一个过滤器, 返回给客户端的数据是过滤之后的数据
        Scan scan = new Scan();
        //正则表达式的值比较应用
        //RegexStringComparator regexStringComparator = new RegexStringComparator("文科.*");

        //检测是否包含子串
        //SubstringComparator substringComparator = new SubstringComparator("文科");

        //前缀二进制比较器
        BinaryPrefixComparator binaryPrefixComparator = new BinaryPrefixComparator("文科".getBytes());

        //二进制比较器,这里必须给出全名
        //BinaryComparator binaryComparator = new BinaryComparator("文科一班".getBytes());

        //列值过滤器,
        SingleColumnValueFilter fileter = new SingleColumnValueFilter(
                "info".getBytes(),//列族
                "clazz".getBytes(),//列名
                CompareFilter.CompareOp.EQUAL,//比较规则
                binaryPrefixComparator);//比较器
        scan.setFilter(fileter);
        Table table = conn.getTable(TableName.valueOf("hehe:test"));
        ResultScanner scanner = table.getScanner(scan);
        Result result;
        while ((result=scanner.next())!=null){
            String id = Bytes.toString(result.getRow());
            String clazz =Bytes.toString (result.getValue("info".getBytes(), "clazz".getBytes()));
            String name =Bytes.toString (result.getValue("info".getBytes(), "name".getBytes()));
            String age =Bytes.toString (result.getValue("info".getBytes(), "age".getBytes()));
            String sex =Bytes.toString (result.getValue("info".getBytes(), "sex".getBytes()));
            System.out.println(id+","+name+","+age+","+sex+","+clazz);
        }
    }

}

在这里插入图片描述

三、预分区

  • 为了提高并用性,提高数据插入的效率,可以根据数据表的key值分布情况,进行分区,在创建表的时候,就指明划分key值,叫做预分区
  • 第一个region是没有startkey的,最后一个region是没有stopkey的

之前的表,创建时,默认为一个分区,即一个region,在数据达到10g或者一定时间时,会均衡分为两个region,也可以手动split触发
在这里插入图片描述
此处手动触发
在这里插入图片描述
刷新查看
在这里插入图片描述

  • 此处注意,原分区变为两个新的分区,不是立即删除,虽然浏览器中不显示,但是hdfs上可以查看,成为垃圾文件,在合并切分的时候由Hmaster清理垃圾文件,才会消失

创建分区表

为了使key均等分布,我们要选取适当的key值进行划分

以当前test中的数据为例,创建一个10个分区的表
把分区的键值放到一个文件下,该文件中不能含键值以外的多余符号,包括空格
在这里插入图片描述
由于就在当前目录下,给文件的相对路径即可
在这里插入图片描述
创建成功,浏览器中观察
在这里插入图片描述
在这里插入图片描述
通过java向表中插入数据观察结果
由于边界位置含左不含右,故第一条数据只有99条
在这里插入图片描述

对于不规则的key划分方法

  • "|"的值是124,大于所有的数字和字母等符号,当然也可以用“~”(ASCII-126)。
    可以根据前缀进行划分
  • 例如
    以key值为 1| 进行划分
    1+任何字母 都是比 1+| 小的,所以以1开头的数据都会放到1|的前面,大于1开头的放在1|的后面

比如一组数据

17393
32376
23487
a2342
b2343
24344
34341
aaa34
bb34j

可以这样以该形式划分
即以1开头的为一个分区,以2开头的在一个分区,以a开头的为一个分区…

1|
2|
3|
a|
b|

在划分key时,合理运用 | 尽量使key均匀分布

四、Hbase的高可用

  • 要实现高可用:
    1.元数据同步
    2.主备切换

  • 由于Hbase的元数据存储在zookeeper上,且由zookeeper监控协调,满足该两个条件,可以实现高可用

  • Hmaster挂了,还可以进行查询插入操作,但是不能对表进行增添查改,查询插入,以为查询插入是对RegionServer建立连接

测试
在这里插入图片描述
将Hmaster进程杀死
在这里插入图片描述
界面不能显示
在这里插入图片描述

再次查询
在这里插入图片描述
可以查到,再试试删除表的操作,可以看到没有,Hmaster不能运行
在这里插入图片描述
重新启动Hmaster,观察浏览器和删除表的操作
在这里插入图片描述
在这里插入图片描述
注意,虽然Hmaster是负责切分的region,但当hmaster挂了的时候,切分指令split仍会运行成功,但实际并没有切分,只是记录了切分的操作,当Hmaster再次启动的时候,会执行split,这时候,才会分区成功

java
java入门基础学习(一)
java入门基础学习(二)
java入门基础学习(三)
java入门基础学习(四)
java入门基础学习(五)
java入门基础学习(六)
java入门基础学习(七)
java入门基础学习(八)
java入门基础学习(九)
java入门基础学习(十)
java入门基础学习(十一)
java入门基础学习(十二)
java入门基础学习(十三)
java入门基础学习(十四)Maven Git
java总结,题目+笔记
java进阶之常见对象(一)
java进阶之常见对象(二)
java进阶之冒泡排序
java进阶之选择排序
java进阶之面向对象(封装)
java进阶之面向对象(代码块、继承)
java进阶之面向对象(多态、抽象、接口)
java进阶之匿名内部类、访问修饰符、包
java进阶之io流(字节流,字符流)
java应用一(反射的应用)
java应用二(配置文件、工具类)
java应用三(数据库索引、spring)
java应用四(连接池)
Linux
Linux基础一
Linux基础二
Linux基础三
Linux基础四
Linux基础五
Mysql
mysql一
mysql二
mysql三
mysql四
java连接数据库
redis
redis一(缓存,redis简介)
redis二(单节点安装,桌面插件)
redis三(指令的使用)
redis四(java与redis的连接,基本指令在java中的操作)
redis五(练习)
redis七(持久化)
redis九(集群安装)
Hadoop
hadoop学习一
hadoop学习二
hadoop学习三
hadoop学习四
hadoop学习五
hadoop学习六
hadoop学习七
hadoop学习八
hadoop异常处理
hadoop基础学习九
hadoop基础学习十
hadoop基础学习十一
hadoop基础学习十二
hadoop基础学习十三
hadoop基础学习十四
hadoop基础学习十五
hadoop基础学习十六

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值