表的设计
1. 考虑提前设置多个region‘
2. 列族尽量少
3. raw key的设计:尽量短,有利于业务需求,尽量散列开
- 考虑提前设置多个region‘
默认情况下,在创建HBase表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户端都向这一个region写数据,直到这个region足够大了才进行切分。一种可以加快批量写入速度的方法是通过预先创建一些空的regions,这样当数据写入HBase时,会按照region分区情况,在集群内做数据的负载均衡。 - 列族尽量少
不要在一张表里定义太多的column family。目前Hbase并不能很好的处理超过2~3个column family的表。因为某个column family在flush的时候,它邻近的column family无论是否达到阀值,也会因关联效应被触发flush,最终导致系统产生更多的I/O,和更多的小文件,然后小文件增多再触发minor compaction - raw key的设计:尽量短,有利于业务需求,尽量散列开
在HBase中,row key可以是任意字符串,最大长度64KB,实际应用中一般为10~100bytes,存为byte[]字节数组,一般设计成定长的。row key是按照字典序存储,因此,设计row key时,要充分利用这个排序特点,将经常一起读取的数据存储到一块,将最近可能会被访问的数据放在一块。举个例子:如果最近写入HBase表中的数据是最可能被访问的,可以考虑将时间戳作为row key的一部分,由于是字典序排序,所以可以使用Long.MAX_VALUE - timestamp作为row key,这样能保证新写入的数据在读取时可以被快速命中。
写操作
考虑分布式多节点参与写
能批量写就批量写,只耗费一次网络IO
写缓存memstore,写缓存memstore关闭自动刷新
调整version的大小
关闭自动major compaction
-
考虑分布式多节点参与写
-
能批量写就批量写,只耗费一次网络IO
通过调用HTable.put(Put)方法可以将一个指定的row key记录写入HBase,同样HBase提供了另一个方法:通过调用HTable.put(List)方法可以将指定的row key列表,批量写入多行记录,这样做的好处是批量执行,只需要一次网络I/O开销,这对于对数据实时性要求高,网络传输RTT高的情景下可能带来明显的性能提升。 -
写缓存memstore关闭自动刷新
通过调用HTable.setAutoFlush(false)方法可以将HTable写客户端的自动flush关闭,这样可以批量写入数据到HBase,而不是有一条put就执行一次更新,只有当put填满客户端写缓存时,才实际向HBase服务端发起写请求。默认情况下auto flush是开启的。 -
调整version的大小
创建表的时候,可以通过HColumnDescriptor.setMaxVersions(int maxVersions)设置表中数据的最大版本数,如果只需要保存最新版本的数据,那么可以设置setMaxVersions(1)。 -
关闭自动major compaction
数据写流程:在HBase中,数据在更新时首先写入WAL 日志(HLog)和内存(MemStore)中,MemStore中的数据是排序的,当MemStore累计到一定阈值时,就会创建一个新的MemStore,并且将老的MemStore添加到flush队列,由单独的线程flush到磁盘上,成为一个StoreFile。于此同时, 系统会在zookeeper中记录一个redo point,表示这个时刻之前的变更已经持久化了(minor compact)。
major conpaction及split:StoreFile是只读的,一旦创建后就不可以再修改。因此Hbase的更新其实是不断追加的操作。当一个Store中的StoreFile达到一定的阈值后,就会进行一次合并(major compact),将对同一个key的修改合并到一起,形成一个大的StoreFile,当StoreFile的大小达到一定阈值后,又会对 StoreFile进行分割(split),等分为两个StoreFile。
考虑手动major compaction:实际应用中,可以考虑必要时手动进行major compact,因为major compact会耗费很多IO,可以选择在系统不忙的时候进行。
读操作
考虑多线程读
批量读
调整读缓存blockcache大小与阀值
-
考虑多线程读
-
批量读
通过调用HTable.get(Get)方法可以根据一个指定的row key获取一行记录,同样HBase提供了另一个方法:通过调用HTable.get(List)方法可以根据一个指定的row key列表,批量获取多行记录,这样做的好处是批量执行,只需要一次网络I/O开销,这对于对数据实时性要求高而且网络传输RTT高的情景下可能带来明显的性能提升。 -
调整读缓存blockcache大小与阀值
来源:CSDN
作者:qq_41634872
链接:https://blog.csdn.net/qq_41634872/article/details/104197007