高级应用?
如何设计表 + 协处理器
如何设计表?
HBase 的模式设计。那么这个设计模式是固定的吗?是强约束吗?
设计模式:我们解决某一类问题的方案。是非强制性的。
设计一个表需要考虑的问题?
一:表应该有多少列族?
二:哪些数据进入哪个列族?
三:每个列族中应该有多少列?
四:列名应该是什么?虽然在创建表时不必定义列名,但在写入或读取数据时需要知道列名。
五:在单元格中应写入什么信息?
六:每个单元格应存储多少个版本号?
七:主键(rowkey)结构应该是什么,它应该包含什么?
创建表:通过 shell + javaApi 进行创建
创建的时候必须定义表名 + 列族
如果要对表进行任何列族的修改,需要先禁用表,再修改(实际:不禁用表也可以修改)
下面给出很多建议?
一:维持 region(区域)大小在 10 到 50 GB之间。
二:保持不超过 10MB 的单元格,如果使用 mob 数据类型,则为 50MB,否则,考虑在 HDFS 中存储单元数据,并在 HBase 中存储指针指向该数据。
三:一个典型的模式应该是每个表有 1 到 3 个列族,(最好就是一个列族)
四:对于具有 1 个列族或 2 个列族的表,大于 50-100 个区域是一个不错的数字
五:尽量缩短列族名。为每个值存储列族名称(可以忽略前缀编码)(列族只是一个标识,我们通常只用一个字节就够了)student:name == s:name (推荐)
六:行键设置要合理。避免出现热点。
分区热点:当大量流量集中在集群中的一个或一小部分节点上时,就会发生分区热点。
诱因:不合理的行键设计导致分区热点。
解决分区热点的方案:
一:行键加盐。HBase 中的加盐是指将一个随机数放在行键的开头,此操作随机为每个行键指定一个前缀,以使其排序与通常不同。
二:行键哈希。哈希就是哈希函数。可用一个单向的哈希散列来取代随机指派前缀
三:反转键。第三种预防分区热点的方法是反转一段固定长度或者可数的键。
四:时间戳。根据存储数据的时间检索数据时,最好在行键中包含时间戳。
行键的特点:
行键不可改:行键不能改变。唯一可以“改变”的方式删除然后再插入
支持的数据类型:
Cell 支持的数据类型是字节数组。HBase 单元只保存字节数组。
HBase 中还有一种更受支持的数据类型值得特别提及,那就是“计数器” 。
计数器上的同步是在 RegionServer 上完成的,而不是在客户端上。
联接:HBase 不支持联接(joins)
二级索引:二级索引是从主访问路径访问数据的一种正交方法。
约束:schema
HBase 目前支持传统(SQL)数据库术语中的 “约束”。
约束的建议用途是为表中的属性强制执行业务规则(例如,确保值在 1-10 范围内)。
约束也可以用于强制引用完整性,但强烈不建议这样做,因为它会显著降低启用完整性检查的表的吸入吞吐量。
加载协处理器的三种方式:
(1)静态加载(一把不推荐)
(2)通过 shell 动态加载(推荐)
(3)通过 API 动态加载(推荐)
上一篇:RabbitMQ-持久化
下一篇:Java笔记-内部类