hbase中的一些重要的知识点

hbase中的一些重要的知识点

##1.应用场景

1.需要对海量非结构化的数据进行存储

2.需要随机近实时的读写管理数据

##2.rowKey的设计

  1. 长度原则: rowkey是一个二进制流,建议rowkey的长度不要超过16个字节

原因如下:

(1)数据的持久化文件HFile中是按照KeyValue存储的,如果Rowkey过长比如100个字节,1000万列数据光Rowkey就要占用100*1000万=10亿个字节,将近1G数据,这会极大影响HFile的存储效率;

(2)MemStore将缓存部分数据到内存,如果Rowkey字段过长内存的有效利用率会降低,系统将无法缓存更多的数据,这会降低检索效率。因此Rowkey的字节长度越短越好。

(3)目前操作系统是都是64位系统,内存8字节对齐。控制在16个字节,8字节的整数倍利用操作系统的最佳特性。

  1. 散列原则: 如果rowkey是按时间戳的方式递增,不要将时间放在二进制码前,建议将rowkey的高位作为散列字段,由程序循环生成,低位放时间字段,这样将提高数据均衡分布在每个regionserver实现负载均衡的几率.如果没有散列字段,首字段直接是时间信息,将产生所有新数据都在一个regionserver上堆积的热点现象,这样在做数据检索的时候负载将会集中在个别regionserver上,降低查询效率

  2.    rowKey唯一原则: 必须在设计上保持其唯一性.
    

##3.二级索引

二级索引的本质就是建立各列值与行键之间的映射关系.

扫描二维码关注公众号,回复: 4203299 查看本文章

由于 HBase 本身没有二级索引( Secondary Index)机制,基于索引检索数据只能单纯地依靠 RowKey,为了能支持多条件查询,开发者需要将所有可能作为查询条件的字段一一拼接到 RowKey 中,这是 HBase 开发中极为常见的做法

##4.协处理器

协处理器有两种:observer和endpoint

Observer允许集群在正常的客户端操作过程中可以有不同的行为表现

Endpoint允许扩展集群的能力,对客户端应用开放新的运算命令

Observer协处理器

² 正常put请求的流程:
在这里插入图片描述

² 加入Observer协处理后的put流程:

在这里插入图片描述

1 客户端发出put请求

2 该请求被分派给合适的RegionServer和region

3 coprocessorHost拦截该请求,然后在该表上登记的每个RegionObserver上调用prePut()

4 如果没有被prePut()拦截,该请求继续送到region,然后进行处理

5 region产生的结果再次被CoprocessorHost拦截,调用postPut()

6 假如没有postPut()拦截该响应,最终结果被返回给客户端

Observer的类型

1、RegionObs——这种Observer钩在数据访问和操作阶段,所有标准的数据操作命令都可以被pre-hooks和post-hooks拦截

2、WALObserver——WAL所支持的Observer;可用的钩子是pre-WAL和post-WAL

3、 MasterObserver——钩住DDL事件,如表创建或模式修改

5.hbase和hive、hdfs的关系

Hive与Hbase的数据一般都存储在HDFS上。Hadoop HDFS为他们提供了高可靠性的底层存储支持。

Hive:

Hive不支持更改数据的操作,Hive基于数据仓库,提供静态数据的动态查询。其使用类SQL语言,底层经过编译转为MapReduce程序,在Hadoop上运行,数据存储在HDFS上。

HDFS:

HDFS是GFS的一种实现,他的完整名字是分布式文件系统,类似于FAT32,NTFS,是一种文件格式,是底层的。

Hbase:

Hbase是Hadoop database,即Hadoop数据库。它是一个适合于非结构化数据存储的数据库,HBase基于列的而不是基于行的模式。

6.hbase的架构及各组件的功能

client**:**

1.hbase的客户端,包含访问hbase的接口(linux shell 、java api)

2.client维护一些cache来加快访问hbase的速度,比如region的位置信息

zookeeper**:**

1.监控hmaster的状态,保证有且仅有一个active的hmaster,达到高可用。

2.存储所有region的寻址入口,–root表在那台服务器上。

3.实时监控hregionserver的状态,将regionserver的上下线信息实时通知给hmaster

4.存储hbase的所有表的信息(hbase的元数据)

hmaster**:(hbase的老大)**

1.为regionserver分配region(新建表等)

2.负责regionserver的负载均衡

3.负责region的重新分配(hregionserver异常、hregion裂变)

4.hdfs上的垃圾文件回收

5.处理schema的更新请求

hregionserver**:(hbase的小弟)**

1.hregionserver维护master分配给他的region(管理本机器上region)

2.处理client对这些region的IO请求,并和hdfs进行交互

3.region server负责切分在运行过程中变大的region

hlog:

对hbase的操作进行记录,使用WAL写数据,优先写入log,然后再写memstore(提速的工具),以防数据丢失时可以进行回滚.

hregion:

hbase中分布式存储和负载均衡的最小单元,是表或者表的一部分

store:

相当于一个列簇.

memstore:128M

内存缓冲区,用于将数据批量刷新到HDFS上.

hstorefile(hfile):

hbase中的数据是以hfile的形式存储在hdfs上

7.hbase的优化

客户端的优化

1.关闭自动刷新

.setAutoFlush

2.尽量批量写入数据(put或者delete时尽量批量写入)

3.谨慎关闭写Log

.setDurability(Durability.SKI);

4.尽量将数据放入到缓存:

.setInMemory(true);

5.尽量不要有太多的列簇,最多两个,hbase在刷新列簇的同时会将相邻的两个列簇也刷新到磁盘

6.rowkey的长度尽量的短,最大64KB,尽量将该关闭的资源关闭

Admin,Table,ResultScanner等 (连接到服务器的对象)

8.宽表高表的选择

hbase中的宽表是指很多列较少行,即列多行少的表,一行中的数据量较大,行数少;高表是指很多行较少列,即行多列少,一行中的数据量较少,行数大。

宽表和高表的优劣总结如下:

1.查询性能:高表更好,因为查询条件都在row key中, 是全局分布式索引的一部分。高表一行中的数据较少。所以查询缓存BlockCache能缓存更多的行,以行数为单位的吞吐量会更高。

2.分片能力:高表分片粒度更细,各个分片的大小更均衡。因为高表一行的数据较少,宽表一行的数据较多。HBase按行来分片。

3.元数据开销:高表元数据开销更大。高表行多,row key多,可能造成region数量也多,- root -、 .meta表数据量更大。过大的元数据开销,可能引起HBase集群的不稳定、master更大的负担(这方面后续再好好总结)。

4.事务能力:宽表事务性更好。HBase对一行的写入(Put)是有事务原子性的,一行的所有列要么全部写入成功,要么全部没有写入。但是多行的更新之间没有事务性保证。

5.数据压缩比:如果我们对一行内的数据进行压缩,宽表能获得更高的压缩比。因为宽表中,一行的数据量较大,往往存在更多相似的二进制字节,有利于提高压缩比。通过压缩,缓解了宽表一行数据量太大,并导致分片大小不均匀的问题。查询时,我们根据row key找到压缩后的数据,进行解压缩。而且解压缩可以通过协处理器(coproesssor)在HBase服务器上做,而不是在业务应用的服务器上做,以充分应用HBase集群的CPU能力

猜你喜欢

转载自blog.csdn.net/weixin_43637653/article/details/84334755