欢迎投稿

今日深度:

hbase建表,alter‘表名’

hbase建表,alter‘表名’


TTL 设置

1.7.1# 建表时设置,TTL单位为秒,此例中列簇’f1’的数据保留1天(86400秒)
hbase(main):002:0>create ‘table’, {NAME => ‘f1’, TTL => 86400}
1.7.2# 通过修改表设置
hbase(main):002:0>alter ‘table’, {NAME => ‘f1’, TTL => 86400}

MIN_VERSION 设置

要起到完全删除数据的作用的还需要设置MIN_VERSION为0,命令如下,这样就不会保留任何版本了。

alter ‘表名’, {NAME => ‘cf’, MIN_VERSIONS => ‘0’}

Region

Region是 HBase集群分布数据的最小单位。

请求(读或者写)短时间内落在了集中的个别region上,导致了该region所在机器的负载急剧上升,超过了单点实例的承受能力,从而引起性能下降或者不可用。
要解决这个问题,就需要设计RowKey时,使得数据尽量往多个region上去写。
举个例子:
假如region按照26个字母分成26个,那么同时写入m开头的rowkey的记录都会同时写入同一个region
比如m001,m002,m003,m004,m005。
因此,RowKey的设计非常关键。常见的设计策略有这么几种。

RowKey

2.1)salting
salting策略就是将生成随机数放在行键的开头作为前缀,使得每个行键有随机的字典序。
对上面的案例进行优化,我们采用了salting策略,插入前给每个rowkey生成一个随机的字母,变成了
am001,zm002,nm003,qm004,lm005
这样就能同时往5个region里面写入了,成功打散。
副作用:由于前缀生成是随机的,因此如果想要按照字典序查询这些行,则需要做更多的事情。从这个角度上看,salting增加了写操作的吞吐量,却也增大了读操作的开销。
2.2)Hashing
Hashing策略也是一种特殊的salting,是用一个单向的 hash 来取代随机指派前缀。
这样能使一个给定rowkey的行在“salted”时有相同的前缀,因此,这样既可以分散RegionServer间的负载的,同时也允许在读操作时能够预测这个前缀值是什么。确定性hash( deterministic hash )可以让客户端重建完整的行键,然后就可以像正常一样用Get方法查询确定的行。
2.3)reverse key
第三种预防hotspotting的方法是反转一段固定长度或者可数的键,让变化最多的某个位置放在rowkey的第一位,
副作用:对于Get操作没有影响,但是不利于Scan操作进行范围查询,因为数据在原RowKey上的顺序已经被打乱。

预分区

在 HBase核心特性—region split 中,我们知道已经提到过关于预分区。
主要原因是当一张表被首次创建时,只会分配一个region给这个表。因此,在刚刚开始时,所有读写请求都会落在这个region所在的region server上,而不管你整个集群有多少个region server。不能充分地利用集群的分布式特性。
因此,预分区主要也是解决“热点”问题。
最为常见的建表语句为:
create ‘tb’,{NAME => ‘f1’,COMPRESSION => ‘snappy’ }, { NUMREGIONS => 50, SPLITALGO => ‘HexStringSplit’ }
NUMREGIONS 为 region的个数,一般按照每个region 8-10GB左右来计算region数量,如果集群规模非常大,那么region数量可以适当取大一些
SPLITALGO 为 rowkey分割的算法,Hbase自带了三种pre-split的算法,分别是 HexStringSplit、DecimalStringSplit 和 UniformSplit。
各种Split算法适用场景:
HexStringSplit: rowkey是十六进制的字符串作为前缀的
DecimalStringSplit: rowkey是10进制数字字符串作为前缀的
UniformSplit: rowkey前缀完全随机
例子:
首先就是要想明白数据的key是如何分布的,然后规划一下要分成多少region,每个region的startkey和endkey是多少
字母行键
如果您的行键以字母开头,则可以在字母边界处拆分表格。例如,下面的命令创建一个表,其区域在每个元音处都有拆分,所以第一个区域有AD,第二个区域有EH,第三个区域有IN,第四个区域有OV,第五个区域有UZ。
数字行键
,然后将规划的key写到一个文件中。比如,key的前几位字符串都是从0001~0010的数字,这样可以分成10个region,划分key的文件如下:
0001|
0002|
0003|
0004|
0005|
0006|
0007|
0008|
0009|
为什么后面会跟着一个"|",是因为在ASCII码中,"|"的值是124,大于所有的数字和字母等符号,当然也可以用“~”(ASCII-126)。分隔文件的第一行为第一个region的stopkey,每行依次类推,最后一行不仅是倒数第二个region的stopkey,同时也是最后一个region的startkey。也就是说分区文件中填的都是key取值范围的分隔点,如下图所示:

分区建表语句 create ‘split_table_test’,{NAME =>‘cf’, COMPRESSION => ‘SNAPPY’}, {SPLITS_FILE => ‘region_split_info.txt’}
字母数字都可以这么分的但是要理清楚ansi吗,如果单纯字母数字就要好好算一下因为数字头到字母尾一共73位差
使用自定义算法
RegionSplitter工具提供了HBase,并使用SplitAlgorithm为您确定拆分点。作为参数,您可以给出算法,所需的区域数量和列族。它包括三个分割算法。首先是 HexStringSplit 算法,它假定行键是十六进制字符串。第二种 DecimalStringSplit 算法是假定行键是00000000到99999999范围内的十进制字符串。第三种 UniformSplit假设行键是随机字节数组。您可能需要开发自己的 SplitAlgorithm,使用提供的模型。
HexStringSplit 策略 适用于 rowkey 前缀是十六进制字符串的场景,比如经过 MD5 编码为十六进制的 rowkey;
UniformSpilt 策略 适用于 rowkey 是比较随机的字符数组的场景,比如经过某些 hash 算法转换为字节数组的 rowkey。

www.htsjk.Com true http://www.htsjk.com/hbase/45989.html NewsArticle hbase建表,alter‘表名’ TTL 设置 1.7.1# 建表时设置,TTL单位为秒此例中列簇’f1’的数据保留1天86400秒 hbase(main):002:0create ‘table’, {NAME ‘f1’, TTL 86400} 1.7.2# 通过修改表设置 hbase(main):002...
评论暂时关闭