文章目录 1. 创建表的高级属性
在使用hbase的过程中,我一直不清楚hbase表的设计原理。 经过查阅资料并亲自实践,我得到了以下一些感悟。
首先,以下shell命令在hbase操作中可以发挥很大的作用,主要体现在创建表的过程中。 我们先来看看以下属性。
1、
默认为 NONE 是否使用布隆过滤以及以何种方式使用。 可以为每个列族单独启用布隆过滤。 使用 .(NONE | ROW | ) 为列族单独启用布隆过滤。
= ROW 布隆过滤器行
对于ROW,每次插入行时,行键的哈希值都会添加到Bloom中。
是的,行键+列族+列族装饰的哈希会在每次插入行时添加到bloom中
用法:'表',{=>'行'}
作用:布隆过滤可以节省磁盘读取过程,有助于减少读取延迟。
2、
默认为1。该参数表示数据保留1个版本。 如果我们认为我们的数据没有那么大,需要保留这么多并且随时更新,而且旧版本的数据对我们来说没有任何价值,那么设置这个参数1可以节省2/3空间
用法:'表',{=>'2'}
附:=>'0'表示至少是操作执行后要保留的版本。
3.
默认值为 NONE,这意味着不使用压缩。 该参数表示列族是否使用压缩以及使用什么压缩算法。 方法:'table',{NAME=>'info',=>''}。 推荐使用压缩算法。 在HBase中,在发布之前(2011年向公众发布),使用LZO算法来实现尽可能最快的压缩和解压缩速度,同时降低CPU消耗。
发布后,建议采用该算法(参考《HBase:指南》)。 您可以根据实际情况对LZO和LZO进行更详细的对比测试后做出选择。
如果建表之初没有压缩,后来想添加压缩算法,可以通过alter修改。
4. TTL
默认值为: 。 该值约为 68 年。 该参数表示列族数据的生存时间,单位为s。
该参数可以根据具体需要设置数据的生存时间。 超过生存时间的数据将不再显示在表中,并将被完全删除,直到下一次重大。
注意,设置TTL后=>'0',这样设置后,TTL时间戳过期后,该时间以下的所有数据都会被彻底删除。 如果不等于0,则保留最新版本的数据,其他数据全部删除。 ,如=>'1',则会保留最新版本的数据,其他版本的数据将不再保存。
5. 改变
指示:
比如修改压缩算法
disable 'table'
alter 'table',{NAME=>'info',COMPRESSION=>'snappy'}
enable 'table'
但在进行实际操作之前需要先执行'table'命令。
6./描述
该命令检查表的参数或默认值。
用法: ''
7./
'.*'支持正则表达式,列出当前匹配的表如下:
toplist_a_total_1001
toplist_a_total_1002
toplist_a_total_1008
toplist_a_total_1009
toplist_a_total_1019
toplist_a_total_1035
...
Disable the above 25 tables (y/n)? 并给出确认提示
8、
该命令的使用方式与
9. hbase预分区
默认情况下,创建HBase表时会自动创建分区。 导入数据时,所有HBase客户端都会将数据写入该分区,直到该分区足够大,然后再进行拆分。 加速批量写入的一种方法是提前创建一些空的,这样当数据写入HBase时,数据会根据分区情况在集群内进行负载均衡。
命令模式:
# create table with specific split points
hbase>create 'table1','f1',SPLITS => ['\x10\x00', '\x20\x00', '\x30\x00', '\x40\x00']
# create table with four regions based on random bytes keys
hbase>create 'table2','f1', { NUMREGIONS => 8 , SPLITALGO => 'UniformSplit' }
# create table with five regions based on hex keys
hbase>create 'table3','f1', { NUMREGIONS => 10, SPLITALGO => 'HexStringSplit' }
您还可以使用 API:
hbase org.apache.hadoop.hbase.util.RegionSplitter test_table HexStringSplit -c 10 -f info
hbase org.apache.hadoop.hbase.util.RegionSplitter splitTable HexStringSplit -c 10 -f info
范围:
test_table 是表名
HexStringSplit 是split 方式
-c 是分 10 个 region
-f 是 family
可以在UI上查看结果,如图:
这样可以将表预先划分为15个区域,减少了数据达到大小时自动分区的时间消耗。 它还具有的优点是,合理的设计可以均匀分配每个并发请求(趋于均匀),提高IO效率。 达到最高,但是预分区需要设置更大的值。 应该设置哪个参数? hbase..最大。 该值默认为10G,即单个单元默认大小为10G。
该参数的默认值是从0.90到0.92到0.94.3。 各版本变化:256M–1G–10G
但如果Input类型使用hbase作为输入,请注意,对于每张地图,如果数据小于10G,则只会启用一张地图,造成资源的极大浪费。 这时可以考虑适当减小该参数的值。 ,或者使用预分配,会检测是否达到这个值,然后手动分配。
2. 表设计 1. 列簇设计
追求的原则是:在合理范围内尽可能减少柱簇。
最优的设计是将所有高度相关的键值放在同一个列族下,从而达到最高的查询效率并尽可能少地访问不同的磁盘文件。
以用户信息为例,必要的基本信息可以存储在一个列族中,一些额外的附加信息可以放置在另一个列族中。
2. 设计
在HBase中,表会被划分为1...n并托管在。两个重要的属性: 和 代表本次维护的范围。 当我们要读/写数据时,如果落在某个起止键范围内,那么就会定位到目标并读写相关数据。
如何快速准确的定位到我们想要操作的数据,取决于我们的设计。 这个非常重要。 接下来我就和大家聊聊设计的三大原则。
三、设计三原则 1、长度原则
是二进制码流,很多开发者建议长度应该在10到100字节之间。 但建议越短越好,不要超过16字节。
原因如下:
1、数据持久化文件HFile按照格式存储。 如果太长,比如100字节,1000万列数据就会占用100*1000万=10亿字节,接近1G的数据,这会巨大的影响HFile的存储效率;
2、将部分数据缓存到内存中。 如果字段太长,内存的有效利用率就会降低,系统无法缓存更多的数据,从而降低检索效率。 因此字节长度越短越好。
3、现在的操作系统都是64位系统,内存是8字节对齐的。 控制在16字节,8字节的整数倍,充分利用了操作系统的最佳特性。
2. 哈希原理
如果按时间戳递增,则不要将时间放在二进制代码前面。 建议使用高位作为哈希字段,由程序循环生成,而将时间字段放在低位。 这样会提高数据的均衡分布,实现各个概率下的负载均衡。 如果没有哈希字段,而第一个字段直接是时间信息,就会产生所有新数据都积累在一个地方的热点现象。 这样,在进行数据检索时,负载就会集中在某些个体身上,降低查询效率。
3、唯一原则
它的独特性必须通过设计来保证。 它按字典顺序存储。 因此,设计时必须充分利用这一排序特性,将经常读取的数据存放在一个块中,将最近可能访问的数据存放在一个块中。
4. 数据热点
HBase 中的行按字典顺序排序。 这种设计优化了扫描操作,并允许相关行和将一起读取的行存储在靠近的位置,使扫描更容易。 然而糟糕的设计是热点的根源。 当集群中的一个或极少数节点有大量的直接访问(访问可能是读、写或其他操作)时,就会出现热点。 大量的访问会使热点所在的单机超出自身的容量,导致性能下降甚至不可用。 这也会影响同一台机器上的其他机器,因为主机无法服务其他请求。 设计良好的数据访问模式,使集群得到充分、均衡的利用。 为了避免写入热点,设计将不同的行放在同一个簇中,但在数据较多的情况下,数据应该写入多个簇,而不是只写入一个簇。
五、防止数据热点的有效措施 1、加盐
这里所说的加盐并不是密码学中的加盐,而是在前面加上一个随机数。 具体来说,就是分配一个随机前缀,使其与之前的开头不同。 分配的前缀类型的数量应该与您想要使用数据展开的不同前缀类型的数量一致。 加盐后会按照随机生成的前缀进行分散,避免出现热点。
2. 哈希
散列总是会在同一行上加上前缀。 散列还将负载分散到整个集群,但使读取更加可预测。 使用确定性哈希可以让客户端完全重构并使用get操作来准确获取某一行数据。
3.逆转
防止热点的第三种方法是反转固定长度或数字格式。 这会将频繁更改的部分(最无意义的部分)放在第一位。 这实际上可以是随机的,但它牺牲了有序性。
逆转的一个例子是手机号码。 可以使用手机号码的反码字符串作为字符串。 这样可以避免因手机号码等相对固定的号码开头而造成的热点。
4. 时间戳反转
一个常见的数据处理问题是快速获取最新版本的数据。 使用反向时间戳作为数据的一部分对于解决此问题非常有用。 您可以使用长。 - 追加在key的末尾,如[key][]、[key] 可以通过扫描[key]获取[key]的第一条记录来获取最新的值,因为HBase是有序的,第一条记录是最后输入的数据。 例如,如果需要保存用户的操作记录,并按操作时间倒序排序,则可以这样设计[倒排][长整型]。 -]。 查询用户所有操作记录数据时,直接指定反转,为[][0],为[][Long。 -]
如果需要查询某段时间的操作记录,就是【用户反向】【长。 - 启动时间],是[反向][长。 - 时间结束]。