Hba表设计

更新时间:2023-06-04 10:06:09 阅读: 评论:0

Hba表设计功夫茶怎么泡
1.1 Pre-Creating Regions
默认情况下,在创建HBa表的时候会⾃动创建⼀个region分区,当导⼊数据的时候,
所有的HBa客户端都向这⼀个region写数据,直到这个region⾜够⼤了才进⾏切分。
⼀种可以加快批量写⼊速度的⽅法是通过预先创建⼀些空的regions,
这样当数据写⼊HBa时,会按照region分区情况,在集群内做数据的负载均衡。
1.2 Row Key
HBa中row key⽤来检索表中的记录,⽀持以下三种⽅式:
• 通过单个row key访问:即按照某个row key键值进⾏get操作;
• 通过row key的range进⾏scan:即通过设置startRowKey和endRowKey,
在这个范围内进⾏扫描;
• 全表扫描:即直接扫描整张表中所有⾏记录。
在HBa中,row优惠活动宣传语
key可以是任意字符串,最⼤长度64KB,实际应⽤中⼀般为10~100bytes,
存为byte[]字节数组,⼀般设计成定长的。
row key是按照字典序存储,因此,设计row key时,要充分利⽤这个排序特点,
将经常⼀起读取的数据存储到⼀块,将最近可能会被访问的数据放在⼀块。
举个例⼦:如果最近写⼊HBa表中的数据是最可能被访问的,可以考虑将时间戳作为row key的⼀部分,由于是字典序排序,所以可以使⽤
Long.MAX_VALUE - timestamp作为row key,
这样能保证新写⼊的数据在读取时可以被快速命中。
Rowkey规则:
1、越⼩越好
2、 Rowkey的设计是要根据实际业务来
3、散列性
(a) 取反  001  002  100 200
(b) Hash
1.3 Column Familysk5病毒
不要在⼀张表⾥定义太多的column family。⽬前Hba并不能很好的处理超过2~3个column family的表。
因为某个column family在flush的时候,它邻近的column
family也会因关联效应被触发flush,最终导致系统产⽣更多的I/O。感兴趣的同学可以对⾃⼰的HBa集群进⾏实际测试,从得到的测试结果数据验证⼀下。
1.4 In Memory
创建表的时候,可以通过HColumnDescriptor.tInMemory(true)将表放到RegionServer的缓存中,
保证在读取的时候被cache命中。
1.5 Max Version
创建表的时候,可以通过HColumnDescriptor.tMaxVersions(int maxVersions)
设置表中数据的最⼤版本,如果只需要保存最新版本的数据,那么可以设置tMaxVersions(1)。
1.6 Time To Live
创建表的时候,可以通过HColumnDescriptor.tTimeToLive(int timeToLive)
设置表中数据的存储⽣命期,过期数据将⾃动被删除,例如如果只需要存储最近两天的数据,
那么可以设置tTimeToLive(2 * 24 * 60 * 60)。
1.7 Compact & Split
在HBa中,数据在更新时⾸先写⼊WAL ⽇志(HLog)和内存(MemStore)中,MemStore中的数据是排序的,当MemStore累计到⼀定阈值时,就会创建⼀个新的MemStore,并且将⽼的MemStore添加到flush队列,由单独的线程flush到磁盘上,成为⼀个StoreFile。于此同时,
系统会在zookeeper中记录⼀个redo point,表⽰这个时刻之前的变更已经持久化了(minor compact)。
StoreFile是只读的,⼀旦创建后就不可以再修改。因此Hba的更新其实是不断追加的操作。当⼀个Store中的StoreFile达到⼀定的阈值后,就会进⾏⼀次合并(major
compact),将对同⼀个key的修改合并到⼀起,形成⼀个⼤的StoreFile,当StoreFile的⼤⼩达到⼀定阈值后,⼜会对 StoreFile进⾏分割(split),等分为两个StoreFile。
由于对表的更新是不断追加的,处理读请求时,需要访问Store中全部的StoreFile和MemStore,将它们按照row key进⾏合并,由于StoreFile和MemStore都是经过排序的,并且StoreFile带有内存中索引,通常合并过程还是⽐较快的。
实际应⽤中,可以考虑必要时⼿动进⾏major compact,将同⼀个row key的修改进⾏合并形成⼀个⼤的StoreFile。同时,可以将StoreFile设置⼤些,减少split的发⽣。
hba为了防⽌⼩⽂件(被刷到磁盘的menstore)过多,以保证保证查询效率,hba需要在必要的时候将这些⼩的store file合并成相对较⼤的store file,
这个过程就称之为compaction。在hba中,主要存在两种类型的compaction:minor
compaction和major compaction。 minor compaction:的是较⼩、很少⽂件的合并。
major compaction 的功能是将所有的store file合并成⼀个,触发major
compaction的可能条件有:major_compact 命令、majorCompact() API、region
rver⾃动运⾏(相关参数:
hba.hregion.majoucompaction 默认为24
⼩时、hba.hregion.majorcompaction.jetter 默认值为0.2 防⽌region rver
在同⼀时间进⾏major compaction)
hba.hregion.majorcompaction.jetter参数的作⽤是:对参数hba.hregion.majoucompaction
规定的值起到浮动的作⽤,假如两个参数都为默认值24和0,2,那么major compact最终使⽤的数值为:19.2~28.8 这个范围。
1、 关闭⾃动major compaction
2、 ⼿动编程major compaction
Timer类,contab minor compaction的运⾏机制要复杂⼀些,它由⼀下⼏个参数共同决定:
paction.min :默认值为 3,
表⽰⾄少需要三个满⾜条件的store file时,minor compaction才会启动
paction.max 默认值为10,表⽰⼀次minor compaction中最多选取10个store file
paction.min.size 表⽰⽂件⼤⼩⼩于该值的store file
⼀定会加⼊到minor compaction的store file中
paction.max.size 表⽰⽂件⼤⼩⼤于该值的store file .⼀定会被minor compaction排除
paction.ratio 将store file 按照⽂件年龄排序.
(older to younger)minor compaction总是从older store file开始选择
互不打扰2. 写表操作
2.1 多HTable并发写
创建多个HTable客户端⽤于写操作,提⾼写数据的吞吐量,⼀个例⼦:
static final Configuration conf = ate();地理漫画
static final String table_log_name = “ur_log”;
wTableLog = new HTable[tableN];
for (int i = 0; i < tableN; i++) {
wTableLog[i] = new HTable(conf, table_log_name);
wTableLog[i].tWriteBufferSize(5 * 1024 * 1024); //5MB
wTableLog[i].tAutoFlush(fal);
}
2.2 HTable参数设置
2.2.1 Auto Flush 通过调⽤HTable.tAutoFlush(fal)⽅法可以将HTable写客户端的⾃动flush关闭,这样可以批量写⼊数
据到HBa,⽽不是有⼀条put就执⾏⼀次更新,只有当put填满客户端写缓存时,才实际向HBa服务端发起写请求。默认情况下auto
flush是开启的。
2.2.2 Write Buffer 通过调⽤HTable.tWriteBufferSize(writeBufferSize)⽅法可以设置HTable客户端的写buffer⼤⼩,如
果新设置的buffer⼩于当前写buffer中的数据时,buffer将会被flush到服务端。其中,writeBufferSize的单位是byte字节数,可以根据实际写⼊数据量的多少来设置该值。
2.2.3 WAL Flag 在HBae中,客户端向集群中的RegionServer提交数据时(Put/Delete操作),⾸先会先写WAL(Write
Ahead
Log)⽇志(即HLog,⼀个RegionServer上的所有Region共享⼀个HLog),只有当WAL⽇志写成功后,再接着写
MemStore,然后客户端被通知提交数据成功;如果写WAL⽇志失败,客户端则被通知提交失败。这样做的好处是可以做到RegionServer宕机后的数据恢复。
因此,对于相对不太重要的数据,可以在Put/Delete操作时,通过调⽤Put.tWriteToWAL(fal)或
Delete.tWriteToWAL(fal)函数,放弃写WAL⽇志,从⽽提⾼数据写⼊的性能。
值得注意的是:谨慎选择关闭WAL⽇志,因为这样的话,⼀旦RegionServer宕机,Put/Delete的数据将会⽆法根据WAL⽇志进⾏恢复。
2.3 批量写 通过调⽤HTable.put(Put)⽅法可以将⼀个指定的row key记录写⼊HBa,同样HBa提供了另⼀个⽅法:通过调
⽤HTable.put(List)⽅法可以将指定的row
key列表,批量写⼊多⾏记录,这样做的好处是批量执⾏,只需要⼀次⽹络I/O开销,这对于对数据实时性要求⾼,⽹络传输RTT ⾼的情景下可能带来明显的性能提升。
2.4 多线程并发写 在客户端开启多个HTable写线程,每个写线程负责⼀个HTable对象的flush操作,这样结合定时flush和写
buffer(writeBufferSize),可以既保证在数据量⼩的时候,数据可以在较短时间内被flush(如1秒内),同时⼜保证在数据量⼤的时候,写buffer⼀满就及时进⾏flush。
下⾯给个具体的例⼦:
for (int i = 0; i < threadN; i++) {
Thread th = new Thread() {
public void run() {
while (true) {
try {
sleep(1000); //1 cond
} catch (InterruptedException e) {                    e.printStackTrace();
}
synchronized (wTableLog[i]) {
try {
wTableLog[i].flushCommits();                    } catch (IOException e) {
e.printStackTrace();
}
}
星期四}
}
};怎么复印文件
th.tDaemon(true);
th.start();
歌舞升平的意思
}

本文发布于:2023-06-04 10:06:09,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/858763.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   客户端   实际
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图