课程目标java
行式存储与列式存储介绍node
行式存储与列式存储特色git
行式存储github
列式存储web
行式存储与列式存储场景算法
行式存储spring
列式存储数据库
列簇式存储:概念apache
HBase表的组成json
HBase数据存储的模式
图解
列簇式存储:列数据属性
HBase重要特性:列数据版本的概念,默认一列数据能够保存三个版本
列簇式存储:数据存储原型
示例表定义
示例表数据
示例表语句定义
压缩算法
算法 | 压缩率 | 编码速度 | 解码速度 |
---|---|---|---|
GZip | 13.4% | 21MB/s | 118MB/s |
LZO | 20.5% | 135MB/s | 410MB/s |
Snappy | 22.2% | 172MB/s | 409MB/s |
在hbase-site.xml
文件中配置或查看存储目录的节点
<property> <name>hbase.rootdir</name> <value>/home/hbase_data</value> </property>
进入到HBase系统目录
.tmp
WALs
archive
corrupt
data
hbase.id
hbase.version
oldWALs
data目录解析
HBase元信息表
Row Key | Value |
---|---|
table、key、time | region server |
HBase中的LSM存储思想
什么是LSM树
LSM日志结构合并树,有两个或两个以上存储数据的结构组成的,每个数据结构各自对应本身的存储介质
LSM树的简易模型描述
LSM思想在HBase中的思想
HBase数据存储模块简介
RegionServer = Region + Store + MemStore + StoreFile + HFile + HLog
HBase Region解析
什么是Region
每个Region都会存储于肯定的RegionServer上
![]()
Region的特色
HBase HFile解析
Store + MemStore + StoreFile
> 
HFile 文件
> 
Data Block
> 
HBase WAL解析
简介介绍WAL(预写日志)
> 
HLog
> 
HLogKey
> 
HLogSyncer
> 
HLogRoller
> 
HBase Compaction解析
什么是Compaction
为何要Compaction
Compaction分类
> 
Compaction触发时机
> 
HBase数据存储流程解析
HBase Client
> 
HBase Server
> 
HBase数据获取流程解析
HBase Client
> 
HBase Server
> 
HBase数据存取api介绍
新增api void put(Put put)throws IOException Put构造方法 Put(byte[] row) Put(byte[] row,long ts) 填充值 Put add(byte[] family,byte[] qualifier,byte[] value) Put add(byte[] family,byte[] qualifier,long timestamp,byte[] value) Put add(KeyValue kv)throws IOException 原子检查写 boolean checkAndPut(add(byte[] row,byte[] family,byte[] qualifier,byte[] value,put)) 删除api void delete(Delete delete)throws IOException 构造方法 Delete(byte[] row) 填充值 Delete deleteFamily(byte[] family) Delete deleteColumns(byte[] family,byte[] qualifier) Delete deleteColumns(byte[] family,byte[] qualifier,long timestamp) 原子检查删除 boolean checkAndDelete(byte[] row,byte[] family,byte[] qualifier,byte[] value,Delete delete)throws IOException 获取api Result get(Get get)throws IOException 构造方法 Get(byte[] row) 填充值 Get addFamily(byte[] family) Get addColumn(byte[] family,byte[] qualifier) Get setTimeRange(long minStamp,long maxStamp)throws IOException Get setTimeStamp(long timestamp) Get setMaxVersions() Get setMaxVersions(int maxVersions)throws IOException
建立名为hbase-demo的maven工程pom以下
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.myimooc</groupId> <artifactId>hbase-demo</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId> <version>1.10</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>jdk.tools</groupId> <artifactId>jdk.tools</artifactId> <version>1.7</version> <scope>system</scope> <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath> </dependency> <dependency> <groupId>com.spring4all</groupId> <artifactId>spring-boot-starter-hbase</artifactId> <version>1.0.0.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.45</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project>
1.编写User类
package com.myimooc.hbase.demo.dto; /** * <br> * 标题: 用户表<br> * 描述: 用户表<br> * * @author zc * @date 2018/06/21 */ public class User { /** * 行键 */ private String row; /** * 基础信息 */ private BaseInfo baseInfo; /** * 其余信息 */ private OtherInfo otherInfo; public User() { } public User(String row, BaseInfo baseInfo, OtherInfo otherInfo) { this.row = row; this.baseInfo = baseInfo; this.otherInfo = otherInfo; } @Override public String toString() { return "User{" + "row='" + row + '\'' + ", baseInfo=" + baseInfo + ", otherInfo=" + otherInfo + '}'; } public String getRow() { return row; } public void setRow(String row) { this.row = row; } public BaseInfo getBaseInfo() { return baseInfo; } public void setBaseInfo(BaseInfo baseInfo) { this.baseInfo = baseInfo; } public OtherInfo getOtherInfo() { return otherInfo; } public void setOtherInfo(OtherInfo otherInfo) { this.otherInfo = otherInfo; } /** * 使用内部类表示 b 列簇 基础信息 */ public static class BaseInfo { /** * 名称 */ private String name; /** * 年龄 */ private Integer age; /** * 性别 */ private String sex; public BaseInfo() { } public BaseInfo(String name, Integer age, String sex) { this.name = name; this.age = age; this.sex = sex; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } } /** * 使用内部类表示 o 列簇 其余信息 */ public static class OtherInfo { /** * 电话 */ private String phone; /** * 地址 */ private String address; public OtherInfo() { } public OtherInfo(String phone, String address) { this.phone = phone; this.address = address; } @Override public String toString() { return "OtherInfo{" + "phone='" + phone + '\'' + ", address='" + address + '\'' + '}'; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } } }
2.编写UserRowMapper类
package com.myimooc.hbase.demo.mapper; import com.myimooc.hbase.demo.dto.User; import com.spring4all.spring.boot.starter.hbase.api.RowMapper; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.util.Bytes; /** * <br> * 标题: 用户表ORM<br> * 描述: 用户表ORM<br> * * @author zc * @date 2018/06/21 */ public class UserRowMapper implements RowMapper<User> { private static byte[] FAMILY_B = "b".getBytes(); private static byte[] FAMILY_B_NAME = "name".getBytes(); private static byte[] FAMILY_B_AGE = "age".getBytes(); private static byte[] FAMILY_B_SEX = "sex".getBytes(); private static byte[] FAMILY_O = "o".getBytes(); private static byte[] FAMILY_O_PHONE = "phone".getBytes(); private static byte[] FAMILY_ADDRESS = "address".getBytes(); @Override public User mapRow(Result result, int i) throws Exception { User.BaseInfo baseInfo = new User.BaseInfo( Bytes.toString(result.getValue(FAMILY_B, FAMILY_B_NAME)), Bytes.toInt(result.getValue(FAMILY_B, FAMILY_B_AGE)), Bytes.toString(result.getValue(FAMILY_B, FAMILY_B_SEX))); User.OtherInfo otherInfo = new User.OtherInfo( Bytes.toString(result.getValue(FAMILY_O, FAMILY_O_PHONE)), Bytes.toString(result.getValue(FAMILY_O, FAMILY_ADDRESS))); return new User(Bytes.toString(result.getRow()),baseInfo,otherInfo); } }
3.编写HbaseService类
package com.myimooc.hbase.demo.service; import org.apache.hadoop.hbase.client.Mutation; import java.util.List; /** * <br> * 标题: HBase服务<br> * 描述: HBase服务<br> * * @author zc * @date 2018/06/21 */ public interface HbaseService<T> { /** * 查询指定行键的表数据 * @param tableName 表名 * @param row 行键 * @return 数据 */ T findByRow(String tableName,String row); /** * 查询指定行键之间的表数据 * @param tableName 表名 * @param startRow 开始行键 * @param endRow 结束行键 * @return 数据集合 */ List<T> findByStartEndRow(String tableName,String startRow,String endRow); /** * 保存或修改数据 * @param tableName 表名 * @param datas 数据集合 * @return 数据集合 */ List<Mutation> saveOrUpdate(String tableName,List<Mutation> datas); }
4.编写UserHbaseServiceImpl类
package com.myimooc.hbase.demo.service.impl; import com.myimooc.hbase.demo.dto.User; import com.myimooc.hbase.demo.mapper.UserRowMapper; import com.myimooc.hbase.demo.service.HbaseService; import com.spring4all.spring.boot.starter.hbase.api.HbaseTemplate; import org.apache.hadoop.hbase.client.Mutation; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.util.Bytes; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * <br> * 标题: 用户服务<br> * 描述: 用户服务<br> * * @author zc * @date 2018/06/22 */ @Service public class UserHbaseServiceImpl implements HbaseService<User> { @Autowired private HbaseTemplate hbaseTemplate; @Override public User findByRow(String tableName, String row) { return hbaseTemplate.get(tableName, row, new UserRowMapper()); } @Override public List<User> findByStartEndRow(String tableName, String startRow, String endRow) { Scan scan = new Scan(Bytes.toBytes(startRow), Bytes.toBytes(endRow)); return hbaseTemplate.find(tableName, scan, new UserRowMapper()); } @Override public List<Mutation> saveOrUpdate(String tableName, List<Mutation> datas) { hbaseTemplate.saveOrUpdates(tableName, datas); return datas; } }
5.编写application.properties
# Zookeeper 地址 spring.data.hbase.quorum=192.168.0.104:2181 # HBase 存储路径 spring.data.hbase.rootDir=hdfs://zccoder.com:9000/hbase/ # HBase 在 Zookeeper上的根节点名称 spring.data.hbase.nodeParent=/hbase
6.编写Application类
package com.myimooc.hbase.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class,args); } }
7.编写UserHbaseServiceImplTest类
package com.myimooc.hbase.demo.service; import com.alibaba.fastjson.JSON; import com.myimooc.hbase.demo.Application; import com.myimooc.hbase.demo.dto.User; import org.apache.hadoop.hbase.client.Delete; import org.apache.hadoop.hbase.client.Mutation; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.util.Bytes; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.util.ArrayList; import java.util.List; /** * <br> * 标题: 单元测试类<br> * 描述: 单元测试类<br> * * @author zc * @date 2018/06/22 */ @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE,classes = Application.class) public class UserHbaseServiceImplTest { @Autowired private HbaseService<User> service; /** * 数据表名称 */ private String tableName; @Before public void init(){ tableName = "demo:user"; } @Test public void testFindByRow(){ System.out.println(JSON.toJSONString(service.findByRow(tableName,"root"))); } @Test public void testFindByStartEndRow(){ System.out.println(JSON.toJSONString(service.findByStartEndRow(tableName,"r","z"))); } @Test public void testSaveOrUpdate(){ List<Mutation> datas = new ArrayList<>(); Put put= new Put(Bytes.toBytes("root")); put.addColumn(Bytes.toBytes("b"),Bytes.toBytes("name"),Bytes.toBytes("imooc")); put.addColumn(Bytes.toBytes("b"),Bytes.toBytes("age"),Bytes.toBytes("18")); put.addColumn(Bytes.toBytes("b"),Bytes.toBytes("sex"),Bytes.toBytes("m")); put.addColumn(Bytes.toBytes("o"),Bytes.toBytes("phone"),Bytes.toBytes("123456789")); put.addColumn(Bytes.toBytes("o"),Bytes.toBytes("address"),Bytes.toBytes("北京市朝阳区")); datas.add(put); // Delete delete = new Delete(Bytes.toBytes("root")); // datas.add(delete); List<Mutation> results = service.saveOrUpdate(tableName,datas); System.out.println(results); } }