JAVA连接HBase客户端

接着上篇文章进行代码的实践,从JAVA 客户端对 HBase的客户端进行一系列操作

工具类:HbaseUtil

静态代码块一次性创建连接对象 并赋值
返回连接对象 Connection
Table对象的创建
Admin对象的创建
数据的展示

package cn._doit19.hbase.utils;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;import java.io.IOException;/*** @author:tom* @Date:Created in 16:36 2020/11/24* 工具类*/
public class HbaseUtil {static Connection conn = null;static {//创建连接对象Configuration conf = HBaseConfiguration.create();conf.set("hbase.zookeeper.quorum", "linux01:2181,linux02:2181,linux03:2181");try {conn = ConnectionFactory.createConnection(conf);} catch (IOException e) {e.printStackTrace();}}public static Table getTable(String tableName) throws Exception {TableName tbName = TableName.valueOf(tableName);return conn.getTable(tbName);}public static Connection getConn() {return conn;}public static void showData(Result result) {while (result.advance()) {Cell cell = result.current();String row = Bytes.toString(CellUtil.cloneRow(cell));String cf = Bytes.toString(CellUtil.cloneFamily(cell));String qualifier = Bytes.toString(CellUtil.cloneQualifier(cell));String val = Bytes.toString(CellUtil.cloneValue(cell));System.out.println(row + "--->" + cf + "--->" + qualifier + "--->" + val);}}public static Admin getAdmin() throws Exception {return conn.getAdmin();}
}

创建表

package cn._doit19.hbase.day01;import cn._doit19.hbase.utils.HbaseUtil;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;/*** @author:tom* @Date:Created in 17:44 2020/11/24* 创建表*/
public class Demo03 {public static void main(String[] args) throws Exception {Admin admin = HbaseUtil.getAdmin();TableDescriptorBuilder tb_builder = TableDescriptorBuilder.newBuilder(TableName.valueOf("test_a".getBytes()));ColumnFamilyDescriptorBuilder cf_builder = ColumnFamilyDescriptorBuilder.newBuilder("cf1".getBytes());ColumnFamilyDescriptor cf_desc = cf_builder.build();tb_builder.setColumnFamily(cf_desc);TableDescriptor tb_desc = tb_builder.build();admin.createTable(tb_desc);}
}

Scan 'table_name' 扫描表 数据 可添加参数 精准扫描查询

package cn._doit19.hbase.day01;import cn._doit19.hbase.utils.HbaseUtil;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;import java.util.Iterator;/*** @author:tom* @Date:Created in 11:56 2020/11/25* scan  ‘tab_name’*/
public class Demo04 {public static void main(String[] args) throws Exception {//获取表对象Table table = HbaseUtil.getTable("tb_imp");//scan   扫描表,获取所有的数据Scan scan = new Scan();//添加了列族和属性  只要表中所有的  info列族的age属性scan.addColumn("info".getBytes(), "age".getBytes());ResultScanner scanner = table.getScanner(scan);Iterator<Result> iterator = scanner.iterator();while (iterator.hasNext()) {Result res = iterator.next();HbaseUtil.showData(res);}}
}

put 时的数据结构 put 'table_name','rowKey','cf_name:qualifier','value'

package cn._doit19.hbase.day01;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.client.Put;
import java.util.List;
import java.util.Map;
import java.util.NavigableMap;
import java.util.Set;/*** @author:tom* @Date:Created in 15:58 2020/11/25* put     数据结构*/
public class PutDetails {public static void main(String[] args) throws Exception {//put方法//put 'a','rk001','cf1:qualifier','value'//一个rowKey  对应多个单元格 List<Cell>   单元格(cf:qualifier)
//        Table tb_user = HbaseUtil.getTable("tb_user");Put put = new Put("rk001".getBytes());NavigableMap<byte[], List<Cell>> familyCellMap = put.getFamilyCellMap();Set<Map.Entry<byte[], List<Cell>>> entries = familyCellMap.entrySet();//k,v     一个rowKey  对应多个单元格  List<Cell>for (Map.Entry<byte[], List<Cell>> entry : entries) {//列族String cfName = new String(entry.getKey());List<Cell> cells = entry.getValue();for (Cell cell : cells) {//每个单元格的属性String qualifier = new String(CellUtil.cloneQualifier(cell));//每个单元格的值String value = new String(CellUtil.cloneValue(cell));}}//        tb_user.put(put);}
}

HBase写入数据原理解析

写入数据原理图

步骤解析

put 'a','rk001','cf:age',21 客户端要向Hbase中写入数据

1) 客户端向Zookeeper(以下简称zk)发送请求向habse中的a表(default命名空间下)中写入数据
2)zk向客户端返回元数据表meta的位置 (具体在哪个regionserver上)
3)客户端向指定regionserver请求元数据表meta
4)客户端下载缓存到自己的本地(下次就不必再找zk和regionserver要了)
5)客户端进行解析meta表, 解析出rk001所在的hostname和regionname
6)请求指定的机器上的regionserver写数据
7)regionserver接收到数据,并不是马上就写到hdfs中,首先数据是列式存储,每一个列族都有一个store(cf)---->regionserver接收到客户端传入的数据并写入到内存memorystore中
8)memorystore内存中的数据达到128M或者人为强制的进行flush时,它将写入到store file并通过HDFS写入到hdfs的文件当中。store file即hfile

注意点:

1)flush的时机

  • 单个的MemoryStore的内存达到128M
  • 手动强制进行flush
  • 机器的内存达到阈值 所有的memorystore将会被flush走
  • 次数达到阈值

2)hbase在hdfs中真实存在的路径为

/hbase/data/namespace/table_name/region_name/cf_name/hfile

HBase读取数据原理解析

读取数据原理图

步骤解析

get 'a','rk001'

1) 向zk集群请求读取数据
2)zk返回元数据meta表的位置
3)客户端向指定regionserver请求下载元数据
4)接收下载存储元数据
5)解析
6)请求对应的regionserver的region读取数据
7)region先从自己的数据块缓存blockCache和内存memoryStore中找值,找到就直接返回
8)找不到,去到HDFS中找,利用布隆过滤器进行查询,往自己的blockCache和memorystore中存储一份,客户端直接从内存中获取。

注:

布隆过滤器是一种算法,上述步骤中,一个列族下有很多个hfile文件,不可能遍历每个文件读查询,这里使用到了布隆过滤器,快速判断出哪些文件一定不可能或极有可能存在我们需要的数据,
从而大大提高效率。布隆过滤器原理见:你不知道的查找算法之布隆过滤器更多学习、面试资料尽在微信公众号:Hadoop大数据开发

hbase原理与实践_JAVA连接HBase客户端及HBase写入数据和读取数据原理解析相关推荐

  1. java客户端重复请求_Java后台防止客户端重复请求、提交表单实现原理

    Java后台防止客户端重复请求.提交表单实现原理 发布于 2021-1-8| 复制链接 摘记: 这篇文章主要介绍了Java后台防止客户端重复请求.提交表单实现原理,文中通过示例代码介绍的非常详细,对大 ...

  2. 易语言远程查询oracle数据库连接,易语言如何连接远程服务器上的数据库,并读取数据...

    标签: 用易语言来连接远程服务器上的数据库,可以使用支持库中的方法. 连接数据库方法名: 连接mysql(服务器地址,用户名,密码,数据库名,端口号) 注意:连接mysql()这个方法名,如果没有,单 ...

  3. java游戏编程原理与实践教程_第18章青蛙过河游戏(Java游戏编程原理与实践教程课件).ppt...

    第18章 青蛙过河游戏 青蛙过河游戏是一个有趣的智力游戏.六只青蛙分成两队,左边三只,右边三只,都要过河,但是互不相让.中间只有一块空白石头.你需要用一种方法将左面的青蛙和右面的青蛙互换. 游戏说明: ...

  4. 《从Paxos到zookeeper分布式一致性原理与实践》笔记

    <从Paxos到zookeeper分布式一致性原理与实践>笔记 文章目录 <从Paxos到zookeeper分布式一致性原理与实践>笔记 一.概念 二.一致性协调 2.1 2P ...

  5. MaxCompute 搬站的原理、实践以及常见问题

    MaxCompute 是阿里巴巴自研的旗舰大数据仓库服务,与开源 Hadoop 搭建的数仓相比,一个很大的不同点是 MaxCompute 并不直接开放类似 HDFS 这样的分布式文件系统的接口,数据进 ...

  6. java图像识别算法_图像算法原理与实践——绪论

    本系列文章是写给程序源的数字图像处理教程,从最基础的知识来讲解数字图像处理专业知识,通过最基本的编码方式来实践相应的处理算法,从而使得大家掌握基础的图像处理知识. 关于图像处理知识,在高校课程中,比较 ...

  7. 【操作系统】进程调度(2b):STCF(最短完成时间优先) 算法 原理与实践

    0 前言 接上一篇文章:进程调度(2a):SJF(短任务优先) 算法 原理与实践 1 前提铺垫 与上一篇同. 2 STCF 原理 STCF(Shortest Time-to-Completion Fi ...

  8. java sqlserver数据库_java连接sqlserver2008数据库配置

    1.首先要去Microsoft官网下载sqljdbc2.0驱动--Microsoft SQL Server JDBC Driver 2.0.exe,很小大概就4M,解压后里面有2个Jar包,sqljd ...

  9. Case study:数据库网页构建原理和实践

    该笔记的目的是引导读者借助WampServer平台,并利用HTML/CSS/JS/PHP将MySQL数据库挂载到网页中.同时,该笔记通过一个具体的案例,向读者分析数据库网页架构中五个部分协同工作的机理 ...

最新文章

  1. 2020mysql下载教程_Windows10 安装MySQL详细教程2020版 亲测亲写
  2. 【ORACLE】碎片整理
  3. 《Groovy官方指南》翻译邀请
  4. fseek/ftell/rewind/fgetpos/fsetpos函数使用-linux
  5. Java常用类(5)--不可变的任意精度BigInteger、BigDecimal类
  6. linux好用的编译器,推荐几款Linux下比Notepad++好的编辑器软件
  7. 《redis-php中文参考手册》-php版
  8. HTML lt input gt 标签,科技常识:使用amp;lt;labelamp;gt;标签修改input[type=checkbox]的样式...
  9. 抖音文字时钟壁纸html,网红文字时钟怎么弄 抖音网红文字时钟主题壁纸设置教程...
  10. 11届蓝桥杯单片机设计与开发决赛
  11. python:假设一年期定期利率为3.25%,计算一下需要过多少年,一万元的一年定期存款连本带息能翻番?
  12. 更换新电池对iPhone手机性能的影响实测
  13. java int类型能表示的数值范围
  14. 百汇BCR:为什么要使用外汇模拟交易软件?有什么好处?
  15. 在Windows Embedded Standard中阻止安装提示和OOBE
  16. i9级E52450处理器_原来同型号处理器后缀字母不同性能差异会这么大
  17. 谷歌大脑深度学习炼丹指南出炉,Hinton点赞!
  18. python打开xlsm,python - 使用python在excel xlsm上写数组时拒绝Errno 13权限 - 堆栈内存溢出...
  19. 华硕笔记本a43s 触摸板不能锁定了 该如何解决
  20. 营销费用预算管理的IT应用之路

热门文章

  1. 天画-codeMaker组件化架构升级实践
  2. 资深架构专家聊小团队中微服务困境及分布式事务解决方案
  3. 阿里 P8 Java高级架构师,都需要掌握哪些技术栈?
  4. Nacos 发布 1.0.0 GA 版本,可大规模投入到生产环境
  5. [Linux] PHP程序员玩转Linux系列-nginx初学者引导
  6. 第一行代码(第二版)全书代码下载
  7. Windows批处理符号简介、常用Dos命令
  8. 三款免费的PHP加速器:APC、eAccelerator、XCache比较
  9. iPhone:文本设计的注意事项
  10. java:为什么字符串比较时要用equals方法而不是==运算符