1、每天百亿数据存入HBase,如何保证数据的存储正确和在规定的时间里全部录入完毕,不残留数据
1)百亿数据:证明数据量非常大
2)存入HBase:证明是跟HBase的写入数据有关
3)保证数据的正确:要设计正确的数据结构保证正确性
4)在规定时间内完成:对存入速度是有要求的
那么针对以上的四个问题我们来一一分析
1)数据量百亿条,什么概念呢?假设一整天60x60x24 = 86400秒都在写入数据,那么每秒的写入条数高达100万条,HBase当然是支持不了每秒百万条数据的,所以这百亿条数据可能不是通过实时地写入,而是批量地导入。批量导入推荐使用BulkLoad方式(
2)存入HBase:普通写入是用JavaAPI put来实现,批量导入推荐使用BulkLoad
3)保证数据的正确:这里需要考虑RowKey的设计、预建分区和列族设计等问题
4)在规定时间内完成也就是存入速度不能过慢,并且当然是越快越好,使用BulkLoad
2、Hbase的六大特点
(1)表大:一个表可以有数亿行,上百万列。
(2)无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态增加,同一个表中的不同行的可以有截然不同的列。
(3)面向列:HBase是面向列的的存储和权限控制,列族独立索引。
(4)稀疏:空(null)列并不占用空间,表可以设计的非常稀疏。
(5)数据类型单一:HBase中的数据都是字符串,没有类型。
(6)数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳。
3、Hbase的rowkey设计原则:
(1)rowkey长度原则:rowkey是一个二进制流,长度开发者建议是10-100字节,不过建议越短越好,最好不超过16字节。原因是:数据持久化文件HFile中是按照按照key/value存储的,如果rowkey太长的话就会影响HFile的存储效率。Memstore将缓存数据到内存,如果rowkey字段过长内存的有效利用会降低,系统将会无法缓存更多的数据,降低检索的效率。
(2)rowkey散列原则:如果rowkey是按照时间戳方式递增的话,不要将时间放在二进制码的前面,建议将rowkey的高位作为散列字段,如果没有散列字段就会出现一个regionServer上堆积的热点现象。
(3)rowkey的唯一原则:rowkey不能为空且唯一。
4、Hbase的查询方式
1、全表查询:scan tableName
2、基于rowkey的单行查询:get tableName,‘1’
3、基于rowkey的范围扫描:scan tableName, {STARTROW=>‘1’,STOPROW=>‘2’}
4、get和scan方法:
(1)、按指定的rowkey获取唯一一条数据,get方法:分为两种,分别是设置了closestRowBefore和没有设置的rowlock,只要保证行的事务性,即每一个get是以一个row来标记的,一个row中可以有多个family和column。
(2)、按指定的条件获取一批记录,条件查询。1、scan可以通过setCaching和setBatch方法来提高速度;2、scan也可以通过setStartRow和setEndRow来限定范围(左闭右开),3、scan还可以通过setFileter方法来添加过滤器。
ps:setCache和setBatch方法:
setCache方法:这个方法设置即一次RPC请求放回的行数,对于缓存操作来说,如果返回行数太多了,就可能内存溢出,那么这个时候就需要setBatch方法,。
setBatch:设置这个之后客户端可以选择取回的列数,如果一行包括的列数超过了设置的值,那么就可以将这个列分片。例如:如果一行17列,如果batch设置为5的话,就会返回四组,分别是5,5,5,2。、
※:Cache设置了服务器一次返回的行数,而Batch设置了服务器一次返回的列数。
ps:Batch参数决定了一行数据分为几个result,它只针对一行数据,Cache决定了一次RPC返回的result个数。
RPC请求次数 = (行数 * 每行列数) / Min(每行的列数,批量大小) / 扫描器缓存
5、Hbase的读写流程:
1、HBase的读流程:
(1)、HRegisonServer保存着.meta.表及数据表,首先client先访问zk,访问-ROOT-表,然后在zk上面获取.meta.表所在的位置信息,找到这个meta表在哪个HRegionServer上面保存着。
(2)、接着client访问HRegionServer表从而读取.meta.进而获取.meta.表中存放的元数据。
(3)、client通过.meta.中的元数据信息,访问对应的HRegionServer,然后扫描HRegionServer的Memstore和StoreFile来查询数据。
(4)、最后把HRegionServer把数据反馈给client。
2、HBase的写流程:
(1)client访问zk中的-ROOT-表,然后后在访问.meta.表,并获取.meta.中的元数据。
(2)确定当前要写入的HRegion和HRegionServer。
(3)clinet向HRegionServer发出写相应的请求,HRegionServer收到请求并响应。
(4)client先将数据写入到HLog中,以防数据丢失。
(5)然后将数据写入到MemStore中。
(6)如果HLog和MemStore都写入成功了,那么表示这个条数据写入成功了。
(7)如果MemStore写入的数据达到了阈值,那么将会flush到StoreFile中。
(8)当StoreFile越来越多,会触发Compact合并操作,将过多的StoteFile合并成一个大的StoreFile。
(9)当StoreFile越来越多时,Region也会越来越大,当达到阈值时,会触发spilit操作,将这个Region一分为二。
ps:HBase中所有的更新和删除操作都会在后续的compact中进行,使得用户的写操作只需要进入内存中就行了。实现了HBase的 I/O高性能。