本文内容:利用SpringBoot整合HBase,基于HBaseJavaAPI的二次封装,可以直接引用jar包使用,目前测试已支持HBase1.1.2和HBase1.4.6两个版本。下文内容为该项目的使用方式,同时也介绍了HBaseJavaAPI的基本使用。
项目地址:https://gitee.com/Yao_Qi/HBaseComponent
table: 表
columnFamily:列族,一个表下可以有多个列族,但是不建议设置多个列族,HBase建议设计长窄型的表而不是短宽型。
qualifier:列,一个列族下可以有多列,一个表中的列可以是不对齐的,但是这样效率不高,同一张表中的列最好是相同的。
cell:一列数据下的一个单元格,一个列下可以有多个单元格,根据版本号区分,默认每次读取最新版本的数据,cell下的存储是数据本身。
row: 行,多列数据组成一行,一行中有多个qualifier。
rowKey: 行健,用于唯一标识一行数据,一行下有多列,行健的设计直接关系到查询的效率。
HBase配置以下配置为最基础配置,缺一不可。
HBase: conf: quorum: 192.168.80.234:2181,192.168.80.235:2181,192.168.80.241:2181 znodeParent: /hbase-unsecure #如果有更多配置,写在config下,例如: #config: # key: value # key: value如果需要更多配置,需要在config中配置,以key-value的形式书写。
参数说明quorum是HBase中zookeeper的配置,znodeParent是HBase配置在zookeeper中的路径。
简单示例引入组件jar包:
<dependency> <groupId>com.semptian.hbase.component</groupId> <artifactId>hbase-component</artifactId> <version>1.0.1-SNAPSHOT</version> </dependency>在需要的地方注入HBaseOperations接口,该接口的实现类是HBaseTemplate,通过这个类来操作HBase。
@Autowired private HBaseOperations hBaseDao;查询一条数据,通过rowKey查询:
public void testQueryTable() { Result result = hBaseDao.queryByTableNameAndRowKey( "LBS", 9223372036854775803L); System.out.println(result.isEmpty()); result.listCells().forEach(cell -> { System.out.println( "row:" + Bytes.toLong(CellUtil.cloneRow(cell)) + ",family:"+ Bytes.toString(CellUtil.cloneFamily(cell)) + ", qualifier: " + Bytes.toString(CellUtil.cloneQualifier(cell)) + ", value:" + Bytes.toString(CellUtil.cloneValue(cell))); }); } 表的基本操作 新建表创建表通过HBaseTemplate就可以实现,HBaseTemplate类中带有这个方法。
操作示例:
hBaseDao.createTable("HBASE-COMPONENT_1", "CF1", "CF2");上述代码创建了一张表,HBASE-COMPONENT_1 是表名,CF1,CF2代表这个表有两个列族。
如果有多个列族可以往后面加,列族不建议设置很多个。
删除表 hBaseDao.dropTable("HBASE-COMPONENT_1");参数是表名,通过表名删除表。
判断表是否存在 hBaseDao.tableExists("lbs");这里的表名是区分大小写的。返回值:boolean。
新增数据 新增一条数据需要注意的是在HBase中的存储的数据是不分格式的,都是以字节数组的形式存储,因此在存储一条数据时需要将数据都转化成字节数组。
String格式的数据能直接转换为字节数组getBytes(),但是其他格式的数据需要借助工具作转换。
这里需要格外注意rowKey的格式,用什么格式存就决定了用什么格式取。
hBaseDao.put("HBase-component", "1534154424340", "CF1", "test_1", Bytes.toBytes("testData"));参数说明:
(1) tableName 目标数据表 (2) rowName rowKey (3) familyName 列族名 (4) qualifier 列名 (5) data 字节数组类型的数据这里新增一条数据是填充数据到一个cell中去。
批量新增数据 String rowKey = String.valueOf(System.currentTimeMillis()); Put put = new Put(rowKey.getBytes()); String defaultColumn = "CF1"; String column1 = "col1"; String column2 = "col2"; String column3 = "col3"; String value = "test"; put.addColumn(defaultColumn.getBytes(), column1.getBytes(), value.getBytes()); put.addColumn(defaultColumn.getBytes(), column2.getBytes(), value.getBytes()); put.addColumn(defaultColumn.getBytes(), column3.getBytes(), value.getBytes()); List<Put> putList = new ArrayList<>(); putList.add(put); putList.add(put); putList.add(put); putList.add(put); putList.add(put); hBaseDao.putBatch("HBase-component", putList);批量插入数据就是使用多个Put对象,putBatch(...)方法的参数:表名,putList(多个put的集合)。
注意批量插入数据也都是插入字节数组格式的数据。
参数说明:
(1) 表名
(2) rowKey
(3) 列族名
(4) 列名
这里删除是删除一个cell下的数据
批量删除数据 String tableName = "HBase-component"; String rowKey1 = "1534164113922"; String rowKey2 = "1534168248328"; List<Delete> deleteList = new ArrayList<>(); Delete delete = new Delete(rowKey1.getBytes()); Delete delete1 = new Delete(rowKey2.getBytes()); deleteList.add(delete); deleteList.add(delete1); hBaseDao.deleteBatch(tableName, deleteList);