今天的主要来分析一下HBase的特点,提出一些真实的应用场景,利用HBase去解决应用中的效率问题;
- HBase特点概述
HBase是google的Bigtable的开源实现,建立在HDFS上,提供高可靠性、高性能、列存储、可伸缩、实时读写的数据库系统。
HBase介于nosql和rdbms之间,仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务(可通过hive支持来实现多表join等复杂操作)。
主要用来存储非结构化和半结构化的松散数据。因为底层是Hadoop所以完全和hadoop一样,Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。HBase中的表一般有这样的特点:
分析我们的业务的时候我们不要从关系数据库表的结构去构思未来表的结构。我们主要去看我们的数据的特点是否具备我们上面提到三个特点。如果具备的话我们一般认为这种业务数据适合放到HBase上来存储。
- 大:一个表可以有上亿行,上百万列;数据量大,并且表很宽;
- 面向列:面向列(族)的存储和权限控制,列(族)独立检索;
- 稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏;
场景1:对变形金刚实时数据监控应用(虚拟场景)
1.场景描述:
2.业务分析
我们主要是对某个变形金刚的一段时间内状态进行分析,实时对变形金刚的状态进行监控和分析;
假如我们的每一帧数据作为一行的话,我们的表会很宽,有100个列簇,1000*100列;
我们来看我下设计图
- 从大这个特点上来我们这个场景是满足的。
- 从宽的特点上来说我们这个场景也是可以满足的。
- 变形金刚上提供数据传输模块,对1000个零部件的状态的指标进行监控并以1秒/帧实时传输到数据中心;
- 假如现在有100个变形金刚,数据量=1000(指标)*100个变形金刚=100000条指标;
- 一年的数据量是31536亿条指标,那么存储十年的数据的话我就不算了,太大了。
package com.hugy.hadoop.invoke; import java.io.IOException; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Random; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.client.Result; import com.hugy.hadoop.hbase.HBaseHelper; public class HBaseInvoke { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { System.out.println("HBase 操作开始..."); Configuration conf = new Configuration(); conf.set("hbase.zookeeper.quorum", "hadoop"); conf.set("hbase.zookeeper.property.clientPort", "2181"); HBaseHelper hbase = new HBaseHelper(conf); // 2.1创建表 String tableName = "thransformersdata";// 变形金刚指标数据存储表 hbase.deleteTable(tableName); String colFamilies[] = { "thransformer1","thransformer2","thransformer3","thransformer4","thransformer5"}; hbase.createTable(tableName, colFamilies); Random random = new Random(); Date starttime=new Date(); long rowkey = starttime.getTime()/1000; for (int x = 1; x <=5; x++)// 5秒钟的数据 { rowkey++; //一秒钟一帧数据 for (int i = 1; i <= 5; i++)// 5个变形金刚 { for (int j = 1; j <= 100; j++)// 100个指标 { hbase.insertRecord(tableName,Long.toString(rowkey), "thransformer"+i, "quota"+j, Float.toString(0.3f)); } } } // 2.4查询整个Table List<Result> list = null; list = hbase.getAllRecord(tableName); Iterator<Result> it = list.iterator(); while (it.hasNext()) { Result rs2 = it.next(); for (KeyValue kv : rs2.raw()) { System.out.print("row key is : " + new String(kv.getRow())); System.out.print("family is : " + new String(kv.getFamily())); System.out.print("qualifier is:" + new String(kv.getQualifier())); System.out.print("timestamp is:" + kv.getTimestamp()); System.out.println("Value is : " + new String(kv.getValue())); } } } }
部分输出结果输出如下:
row key is : 1406466972 family is : thransformer3 qualifier is:quota91 timestamp is:1406495760290 Value is : 0.3
row key is : 1406466972 family is : thransformer3 qualifier is:quota92 timestamp is:1406495760314 Value is : 0.3
row key is : 1406466972 family is : thransformer3 qualifier is:quota93 timestamp is:1406495760352 Value is : 0.3
row key is : 1406466972 family is : thransformer3 qualifier is:quota94 timestamp is:1406495760366 Value is : 0.3
row key is : 1406466972 family is : thransformer3 qualifier is:quota95 timestamp is:1406495760379 Value is : 0.3
row key is : 1406466972 family is : thransformer3 qualifier is:quota96 timestamp is:1406495760437 Value is : 0.3
row key is : 1406466972 family is : thransformer3 qualifier is:quota97 timestamp is:1406495760450 Value is : 0.3