HBase 权威指南笔记
hadoop
- core-site.xml
- hdfs-site.xml
- mapred-site.xml
- yarn-site.xml
$ ./sbin/start-dfs.sh
$ ./sbin/stop-dfs.sh
hbase
$ ./bin/start-hbase.sh
$ ./bin/hbase shell
$ ./bin/stop-hbase.sh
- scan
- scan withStartRow withEndRow 的参数类型与 ID 必须一致
- 缓存是面向行的操作,批量是面向列的操作
- RPC 个数=(行数*每行列数)/min(每行列数,批量大小)/缓存大小+1次打开scan+1次关闭scan
- filter 作用与 Get、Scan setFilter 185页
- 谓词下推
- 比较器
- BinaryComparator
- BinaryPrefixComparator
- NullComparator
- BitComparator 只能是 EQUAL NOT_EQUAL
- RegexStringComparator 只能是 EQUAL NOT_EQUAL
- SubstringComparator 只能是 EQUAL NOT_EQUAL
- 过滤器
- RowFilter 行键 ID 过滤器
- FamilyFilter 列族名过滤器
- ValueFilter 值过滤器,但是不能指定某列,只会返回匹配到列值
- QualifierFilter 列名过滤器
- DependentColumnFilter 参与列过滤器,某列值相等后按时间戳查找合并其它列,某个列必须大于小于等于某个值
- 专用过滤器
- SingleColumnValueFilter 值过滤,默认会返回每匹配的
- SingleColumnValueExcludeFilter 单列排除过滤器,默认会返回每匹配的,参考列不会包括到结果中,只有这个不支持 setBatch,如果加入 FilterList 则 FilterList 不支持 setfBatch
- PrefixFilter 前缀过滤器
- PageFilter 分页过滤器
- KeyOnlyFilter 行键过滤器,有参数设置值返回列名不返回值
- FirstKeyOnlyFilter 首次行键过滤器,访问一行中第一列
- IncludsiveStopFilter 包含结束到过滤器
- TimestampsFilter 时间戳过滤器,具体时间列表或时间范围
- ColumnCountGetFilter 列计数过滤器,超过列数就停止扫描,不适合 scan 适合 get
- ColumnPaginationFilter 列分页过滤器,对列而不是行
- ColumnPrefixFilter 列前缀过滤器
- RandomRowFilter 随机行过滤器,指定种子产生随机数过滤
- 附加过滤器
- SkipFilter 跳转过滤器,如果匹配列值,则忽略该行数据
- WhileMatchFilter 全匹配过滤器,如果发现匹配,就直接返回结果并停止扫描
- FilterList 默认 and,可以往 FilterList 添加 FilterList 实现括号功能,添加顺序会影响执行效率
- 自定义过滤器
- 计数器:读取并修改,原子操作
- 协处理器
- observer 可以实现 HBase DML DDL DCL DQL 监控
- RegionObserver
- MasterObserver
- WALObserver
- endpoint 可以实现在直接在每个 Region 计算,而后返回每个结果给客户端由客户端归并结果,减少数据传输
- 可以被链接起来,就像过滤器
- 分为 SYSTEM(高)和 USER(低),可以有序号
- HTablePool
- 删除表、修改表结构需要先禁用表
- enable 启用
- disable 禁用
- avaliable 物理状态的可用
- 存储
- 同一个列族的数据存在同一个文件
- 最新的数据会最先读取到
- 先按行键升序存储
- 再按列键升序存储
- 最后按时间降序存储
- 不存 null 的数据
- 通过时间戳查询会很快,但是通过特定列或值查询则性能一般
- 查询性能:行键 > 列族 > 列限定符键 > 时间戳键 > 值
- HBase 只能按行分片,高表更有优势
- 高表(空列限定符键)、宽表
- 高表的数据键左移,查询性能更好
- 宽表的数据键右移,查询性能一般
- 高表一行记录分多行,宽表一行记录仍然是一行,所以高表不能保证原子性
- 解决某个热点数据导致集群数据分布不均的方法之一:(这里前缀和集群 Region 数匹配)Long.hashCode(Time)+"-"+Time(这样可以防止某天数据过多都落在同一个 Region)
- HBase 只保证行级原子性
- 辅助索引不能保证数据添加的原子性,但是可以先添加辅助索引,再添加数据,如果数据失败,可以通过定时任务(或 HBASE 支持的 MapReduce)删除辅助索引
- 降序索引需要反转存储,如:Long.MAX_VALUE - Time
- 布隆过滤器
- 如果根据行键扫描,使用行加列级的布隆过滤器没有任何帮助
- 反之如果是根据行加列的读操作,则使用行级的布隆过滤器可以减少需要检查的文件数量
- 如果一行记录在所有文件中都有分布,行加列级布隆过滤器很有用,但是如果每次查询修改都包含整行记录,这个过滤器仍然很难起到作用
- 行级比行加列级布隆过滤器占用空间小
- 布隆过滤器可容纳元素数量有一个最大值
- 尽量使用行级布隆过滤器
- 单元格如果较小可以不使用布隆过滤器
- 版本控制
- 可以指定版本,也可以由 HBase 服务器隐式指定,但要注意 HBase 服务器之间的时间同步问题
- 如果设置服务器只保存最新的 3 个版本数据,则插入 6 条数据,再删除最新的 2 条,可能第2、3条数据仍存在,因为 HBase 可能延后删除老数据(只会出现在 Major 合并被执行之前)(要避免的话用户可以删除后立即强制执行 Major 合并)
- 用户可以不使用时间戳,而是自定义一个单调递增的数字(不能是负数),但这样必须每次 put 都必须指定这个数据作为版本,否则服务器会使用时间戳
- 优化
- master 通常不会出现垃圾回收问题,因为 master 没处理过重的负载,并且实际的数据服务并不经过它
- HBase_OPTS JVM 参数针对:master + region
- HBase_RegionServer_OPTS JVM 参数针对:region
- region 如果垃圾回收停顿时间过长,master 会认为其不可用,会抛弃之,此时 region 垃圾回收后发现自己被抛弃会自行关闭
- 压缩
- CPU 压缩、解压时间比磁盘读、写能耗费更短时间
- 定义列族时可以指定压缩算法
- region 可分割、合并、移动、压缩
- 批量操作 setAutoFlush(false) flushCommits()
- 垃圾回收时间要比 zk 会话超时时间短
- 推荐 region 使用压缩
- 自带了性能测试,第一次安装时建议测试一下
- HBase 默认日志为 debug 级别
- 故障处理 hbck