hbase原理与实践_JAVA连接HBase客户端及HBase写入数据和读取数据原理解析
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写入数据和读取数据原理解析相关推荐
- java客户端重复请求_Java后台防止客户端重复请求、提交表单实现原理
Java后台防止客户端重复请求.提交表单实现原理 发布于 2021-1-8| 复制链接 摘记: 这篇文章主要介绍了Java后台防止客户端重复请求.提交表单实现原理,文中通过示例代码介绍的非常详细,对大 ...
- 易语言远程查询oracle数据库连接,易语言如何连接远程服务器上的数据库,并读取数据...
标签: 用易语言来连接远程服务器上的数据库,可以使用支持库中的方法. 连接数据库方法名: 连接mysql(服务器地址,用户名,密码,数据库名,端口号) 注意:连接mysql()这个方法名,如果没有,单 ...
- java游戏编程原理与实践教程_第18章青蛙过河游戏(Java游戏编程原理与实践教程课件).ppt...
第18章 青蛙过河游戏 青蛙过河游戏是一个有趣的智力游戏.六只青蛙分成两队,左边三只,右边三只,都要过河,但是互不相让.中间只有一块空白石头.你需要用一种方法将左面的青蛙和右面的青蛙互换. 游戏说明: ...
- 《从Paxos到zookeeper分布式一致性原理与实践》笔记
<从Paxos到zookeeper分布式一致性原理与实践>笔记 文章目录 <从Paxos到zookeeper分布式一致性原理与实践>笔记 一.概念 二.一致性协调 2.1 2P ...
- MaxCompute 搬站的原理、实践以及常见问题
MaxCompute 是阿里巴巴自研的旗舰大数据仓库服务,与开源 Hadoop 搭建的数仓相比,一个很大的不同点是 MaxCompute 并不直接开放类似 HDFS 这样的分布式文件系统的接口,数据进 ...
- java图像识别算法_图像算法原理与实践——绪论
本系列文章是写给程序源的数字图像处理教程,从最基础的知识来讲解数字图像处理专业知识,通过最基本的编码方式来实践相应的处理算法,从而使得大家掌握基础的图像处理知识. 关于图像处理知识,在高校课程中,比较 ...
- 【操作系统】进程调度(2b):STCF(最短完成时间优先) 算法 原理与实践
0 前言 接上一篇文章:进程调度(2a):SJF(短任务优先) 算法 原理与实践 1 前提铺垫 与上一篇同. 2 STCF 原理 STCF(Shortest Time-to-Completion Fi ...
- java sqlserver数据库_java连接sqlserver2008数据库配置
1.首先要去Microsoft官网下载sqljdbc2.0驱动--Microsoft SQL Server JDBC Driver 2.0.exe,很小大概就4M,解压后里面有2个Jar包,sqljd ...
- Case study:数据库网页构建原理和实践
该笔记的目的是引导读者借助WampServer平台,并利用HTML/CSS/JS/PHP将MySQL数据库挂载到网页中.同时,该笔记通过一个具体的案例,向读者分析数据库网页架构中五个部分协同工作的机理 ...
最新文章
- 2020mysql下载教程_Windows10 安装MySQL详细教程2020版 亲测亲写
- 【ORACLE】碎片整理
- 《Groovy官方指南》翻译邀请
- fseek/ftell/rewind/fgetpos/fsetpos函数使用-linux
- Java常用类(5)--不可变的任意精度BigInteger、BigDecimal类
- linux好用的编译器,推荐几款Linux下比Notepad++好的编辑器软件
- 《redis-php中文参考手册》-php版
- HTML lt input gt 标签,科技常识:使用amp;lt;labelamp;gt;标签修改input[type=checkbox]的样式...
- 抖音文字时钟壁纸html,网红文字时钟怎么弄 抖音网红文字时钟主题壁纸设置教程...
- 11届蓝桥杯单片机设计与开发决赛
- python:假设一年期定期利率为3.25%,计算一下需要过多少年,一万元的一年定期存款连本带息能翻番?
- 更换新电池对iPhone手机性能的影响实测
- java int类型能表示的数值范围
- 百汇BCR:为什么要使用外汇模拟交易软件?有什么好处?
- 在Windows Embedded Standard中阻止安装提示和OOBE
- i9级E52450处理器_原来同型号处理器后缀字母不同性能差异会这么大
- 谷歌大脑深度学习炼丹指南出炉,Hinton点赞!
- python打开xlsm,python - 使用python在excel xlsm上写数组时拒绝Errno 13权限 - 堆栈内存溢出...
- 华硕笔记本a43s 触摸板不能锁定了 该如何解决
- 营销费用预算管理的IT应用之路
热门文章
- 天画-codeMaker组件化架构升级实践
- 资深架构专家聊小团队中微服务困境及分布式事务解决方案
- 阿里 P8 Java高级架构师,都需要掌握哪些技术栈?
- Nacos 发布 1.0.0 GA 版本,可大规模投入到生产环境
- [Linux] PHP程序员玩转Linux系列-nginx初学者引导
- 第一行代码(第二版)全书代码下载
- Windows批处理符号简介、常用Dos命令
- 三款免费的PHP加速器:APC、eAccelerator、XCache比较
- iPhone:文本设计的注意事项
- java:为什么字符串比较时要用equals方法而不是==运算符