IT评测·应用市场-qidao123.com技术社区

标题: HBase基础知识分享(一) [打印本页]

作者: 惊雷无声    时间: 2024-11-13 07:43
标题: HBase基础知识分享(一)
写在前面

今天来学习Hbase部分的知识!
Zookeeper的ZAB协议

ZAB(Zookeeper Atomic Broadcast)协议是Zookeeper的核心协议之一,用于保证集群中数据的一致性、次序性和容错性。它包括以下几个关键阶段:
ZAB协议的设计灵感来自于Paxos协议,但简化了许多步骤,使其更加适合Zookeeper这种主要用作协调服务的分布式系统。
ZAB协议的特点

HBase的特点

HBase的三维有序结构

HBase的数据按 行键、列族和时间戳 三个维度进行排序:
这个设计使得HBase在处理惩罚大数据时具有高效的查询、存储和写入能力。
如何定位到 HBase 的 Cell

通过 行键、列族、列名和时间戳,可以精确地查询到一个 Cell
什么是 Region?通过 RK 定位到 Region

HBase的数据模型

HBase的架构及读写流程

HBase的架构主要包括以下组件:
HBase读写流程:
常用的HBase比较器与过滤器

比较器(Comparator)


单列值过滤器:SingleColumnValueFilter
SingleColumnValueFilter会返回满足条件的cell所在行的所有cell的值(即会返回一行数据)
通过SingleColumnValueFilter与查询文科班所有学生信息
  1.     @Test
  2.     // 通过SingleColumnValueFilter与查询文科班所有学生信息
  3.     public void RegexStringComparatorFilter() throws IOException {
  4.         Table students = conn.getTable(TableName.valueOf("students"));
  5.         SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(
  6.                 "info".getBytes(),
  7.                 "clazz".getBytes(),
  8.                 CompareFilter.CompareOp.EQUAL,
  9.                 new RegexStringComparator("^文科.*")
  10.         );
  11.         Scan scan = new Scan();
  12.         scan.setFilter(singleColumnValueFilter);
  13.         ResultScanner scanner = students.getScanner(scan);
  14.         Result rs = scanner.next();
  15.         while (rs != null) {
  16.             String id = Bytes.toString(rs.getRow());
  17.             String name = Bytes.toString(rs.getValue("info".getBytes(), "name".getBytes()));
  18.             int age = Bytes.toInt(rs.getValue("info".getBytes(), "age".getBytes()));
  19.             String gender = Bytes.toString(rs.getValue("info".getBytes(), "gender".getBytes()));
  20.             String clazz = Bytes.toString(rs.getValue("info".getBytes(), "clazz".getBytes()));
  21.             System.out.println(id + "\t" + name + "\t" + age + "\t" + gender + "\t" + clazz + "\t");
  22.             rs = scanner.next();
  23.         }
  24.     }
复制代码
列值清除过滤器:SingleColumnValueExcludeFilter
与SingleColumnValueFilter相反,会清除掉指定的列,其他的列全部返回
通过SingleColumnValueExcludeFilter与BinaryComparator查询文科一班所有学生信息,最终不返回clazz列
  1.     @Test
  2.     // 通过SingleColumnValueExcludeFilter与BinaryComparator查询文科一班所有学生信息,最终不返回clazz列
  3.     public void RegexStringComparatorExcludeFilter() throws IOException {
  4.         Table students = conn.getTable(TableName.valueOf("students"));
  5.         SingleColumnValueExcludeFilter singleColumnValueExcludeFilter = new SingleColumnValueExcludeFilter(
  6.                 "info".getBytes(),
  7.                 "clazz".getBytes(),
  8.                 CompareFilter.CompareOp.EQUAL,
  9.                 new BinaryComparator("文科一班".getBytes())
  10.         );
  11.         Scan scan = new Scan();
  12.         scan.setFilter(singleColumnValueExcludeFilter);
  13.         ResultScanner scanner = students.getScanner(scan);
  14.         Result rs = scanner.next();
  15.         while (rs != null) {
  16.             String id = Bytes.toString(rs.getRow());
  17.             String name = Bytes.toString(rs.getValue("info".getBytes(), "name".getBytes()));
  18.             int age = Bytes.toInt(rs.getValue("info".getBytes(), "age".getBytes()));
  19.             String gender = Bytes.toString(rs.getValue("info".getBytes(), "gender".getBytes()));
  20.             // clazz列为空
  21.             String clazz = Bytes.toString(rs.getValue("info".getBytes(), "clazz".getBytes()));
  22.             System.out.println(id + "\t" + name + "\t" + age + "\t" + gender + "\t" + clazz + "\t");
  23.             rs = scanner.next();
  24.         }
  25.     }
复制代码
rowkey前缀过滤器:PrefixFilter
通过PrefixFilter查询以150010008开头的所有前缀的rowkey
  1.     @Test
  2.     // 通过PrefixFilter查询以150010008开头的所有前缀的rowkey
  3.     public void PrefixFilterFilter() throws IOException {
  4.         Table students = conn.getTable(TableName.valueOf("students"));
  5.         PrefixFilter prefixFilter = new PrefixFilter("150010008".getBytes());
  6.         Scan scan = new Scan();
  7.         scan.setFilter(prefixFilter);
  8.         ResultScanner scanner = students.getScanner(scan);
  9.         Result rs = scanner.next();
  10.         while (rs != null) {
  11.             String id = Bytes.toString(rs.getRow());
  12.             String name = Bytes.toString(rs.getValue("info".getBytes(), "name".getBytes()));
  13.             int age = Bytes.toInt(rs.getValue("info".getBytes(), "age".getBytes()));
  14.             String gender = Bytes.toString(rs.getValue("info".getBytes(), "gender".getBytes()));
  15.             // clazz列为空
  16.             String clazz = Bytes.toString(rs.getValue("info".getBytes(), "clazz".getBytes()));
  17.             System.out.println(id + "\t" + name + "\t" + age + "\t" + gender + "\t" + clazz + "\t");
  18.             rs = scanner.next();
  19.         }
  20.     }
复制代码
分页过滤器PageFilter
通过PageFilter查询第三页的数据,每页10条
利用PageFilter分页效率比较低,每次都需要扫描前面的数据,直到扫描到所需要查的数据
可设计一个合理的rowkey来实现分页需求
  1.     @Test
  2.     // 通过PageFilter查询第三页的数据,每页10条
  3.     public void PageFilter() throws IOException {
  4.         Table students = conn.getTable(TableName.valueOf("students"));
  5.         int PageNum = 3;
  6.         int PageSize = 10;
  7.         Scan scan = new Scan();
  8.         if (PageNum == 1) {
  9.             scan.withStartRow("".getBytes());
  10.             //使用分页过滤器,实现数据的分页
  11.             PageFilter pageFilter = new PageFilter(PageSize);
  12.             scan.setFilter(pageFilter);
  13.             ResultScanner scanner = students.getScanner(scan);
  14.             printRS(scanner);
  15.         } else {
  16.             String current_page_start_rows = "";
  17.             int scanDatas = (PageNum - 1) * PageSize + 1;
  18.             PageFilter pageFilter = new PageFilter(scanDatas);
  19.             scan.setFilter(pageFilter);
  20.             ResultScanner scanner = students.getScanner(scan);
  21.             for (Result rs : scanner) {
  22.                 current_page_start_rows = Bytes.toString(rs.getRow());
  23.             }
  24.             scan.withStartRow(current_page_start_rows.getBytes());
  25.             PageFilter pageFilter1 = new PageFilter(PageSize);
  26.             scan.setFilter(pageFilter1);
  27.             ResultScanner scanner1 = students.getScanner(scan);
  28.             printRS(scanner1);
  29.         }
  30.     }
复制代码
通过合理的设置rowkey来实现分页功能
  1.     @Test
  2.     // 通过合理的设置rowkey来实现分页功能,提高效率
  3.     public void PageFilterTest2() throws IOException {
  4.         Table students = conn.getTable(TableName.valueOf("students"));
  5.         int PageSize = 10;
  6.         int PageNum = 3;
  7.         int baseId = 1500100000;
  8.         int start_row = baseId + (PageNum - 1) * PageSize + 1;
  9.         int end_row = start_row + PageSize;
  10.         Scan scan = new Scan();
  11.         scan.withStartRow(String.valueOf(start_row).getBytes());
  12.         scan.withStopRow(String.valueOf(end_row).getBytes());
  13.         ResultScanner scanner = students.getScanner(scan);
  14.         printRS(scanner);
  15.     }
复制代码
多过滤器综合查询
查询文科班中的学生中学号以150010008开头并且年龄小于23的学生信息
  1.     @Test
  2.     // 查询文科班中的学生中学号以150010008开头并且年龄小于23的学生信息
  3.     public void FilterListFilter() throws IOException {
  4.         Table students = conn.getTable(TableName.valueOf("students"));
  5.         Scan scan = new Scan();
  6.         SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(
  7.                 "info".getBytes()
  8.                 , "clazz".getBytes()
  9.                 , CompareFilter.CompareOp.EQUAL
  10.                 , new RegexStringComparator("^文科.*"));
  11.         PrefixFilter prefixFilter = new PrefixFilter("150010008".getBytes());
  12.         SingleColumnValueFilter singleColumnValueFilter1 = new SingleColumnValueFilter(
  13.                 "info".getBytes()
  14.                 , "age".getBytes()
  15.                 , CompareFilter.CompareOp.LESS
  16.                 , new BinaryComparator(Bytes.toBytes(23)));
  17.         FilterList filterList = new FilterList();
  18.         filterList.addFilter(singleColumnValueFilter);
  19.         filterList.addFilter(prefixFilter);
  20.         filterList.addFilter(singleColumnValueFilter1);
  21.         scan.setFilter(filterList);
  22.         ResultScanner scanner = students.getScanner(scan);
  23.         printRS(scanner);
  24.     }
复制代码
今天的分享就到这了,之后会继承分享hbase相关的内容。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4