大数据hbase面试宝典(三)


大数据hbase面试宝典(三)文章插图
15、布隆过滤器在hbase中的应用
主要提高随机读的性能
16、Hbase是用来做什么的?什么样的数据会放到hbase?
17、Hbase和Hive的区别与适用场景
18、Hbase在建表时的设计原则(注意事项)
① 预分区
Hbase默认建表时有一个region 。 这个region的rowkey是没有边界的 , 即没有 startkey和endkey 。 当数据写入时 , 所有数据都会写入这个默认的region , 随着数据量的不断增加 , 会进行split , 分成2个region 。
在这个过程中 , 会产生两个问题:
1. 数据往一个region写 , 会有写热点问题 。
2. region split会消耗宝贵的集群I/0资源 。 我们在建表的时候 , 可以控制一下 , 创建多个空region , 并确定每个region的startkey和endkey 。 这样只要我们的 rowkey设计能均匀的命中各个region , 就不会存在写热点问题 , 自然split的几率也会大大降低 。
大数据hbase面试宝典(三)文章插图
② rowkey设计原则
1. rowkey长度越短越好 。 数据的持久化文件Hfile中是按照Keyvalue存储的 , 如果 rowkey过长 , 会极大的影响File的存储效率 。 Memstore将缓存部分数据到内存 , 如果rowkey字段过长 , 内存的有效利用率就会降低 , 系统不能缓存更多的数据 , 这样会降低检索效率 。
2. rowkey尽量散列 。 建议将rowkey的高位作为散列字段 , 将提高数据均衡分布在每个Regionserver , 以实现负载均衡的几率(哈希、反转等也可以避免热点问题) 。
3. rowkey保证唯一性 。
③ 列族设计原则
1. 建表至少指定一个列族 , 但一般不超过三个 , 一般一个 。 因为flush和compact是以region为单位 , 所以 , 某个column family在flush的时候 , 它邻近的column family也会因关联效应被触发flush , 最终导致系统产生更多的I/O 。
2. 列族名字不宜过长 , 会冗余存储 。
3. 不同列族记录的数量级不应相差太大 。 比如A、B两个列族 , A为100万条 , B为100亿条 , 则A会被分散到多个region(可能会跨reglon server) , 导致对A的扫描效率低下 。
大数据hbase面试宝典(三)文章插图
19、hbase优化方法
① 减少调整
1. 减少region分裂 。 根据你的rowkey设计来进行预建分区 , 减少region的动态分裂 。
2. 给Hfile设定合适的大小 。 Hfile是数据底层存储文件 , 在每个memstore进行刷新时会生成一个Hfile 。 当Hfile增加到一定程度时 , 会将属于一个region的Hfile进行合并 , 这个步骤会带来开销但不可避免 。 合并后 , region大小如果大于设定的值 , 那么region会进行分裂 。 为了减少这样无谓的I/O开销 , 建议估计项目数据量大小 , 给Hfile设定一个合适的值 。
② 减少启停
Hbase中也存在频繁开启关闭帯来的问题 。
1. 关闭Compaction , 在闲时进行手动Compaction 。 因为Hbase中存在Minor Compaction和Major Compaction , 合并就是I/O读写 。 大量的Hfile进行肯定会带来I/O开销 , 甚至是I/O风暴 。 所以 , 为了避免这种不受控制的意外发生 , 建议关闭自动Compaction , 在闲时进行手动compaction 。
2. 当需要写入大量离线数据时 , 建议使用BulkLoad 。
③ 减少数据量
1. 开启过滤 , 提高查询速度 , 可以减少网络I/O 。
2. 使用压缩 。 一般推荐使用Snappy和LZO压缩 。
④ 合理设计(建表注意事项)
分区、 rowkey设计、列族设计 。
大数据hbase面试宝典(三)文章插图


推荐阅读