Hive映射 Region拆分 HFile合并 HBase优化

映射

hbase 数据

 amiller                         column=addr:state, timestamp=1608006023452, value=TX                                        
 jsmith                          column=addr:city, timestamp=1608006023386, value=denver                                     
 jsmith                          column=addr:state, timestamp=1608006023402, value=CO                                        
 jsmith                          column=order:date, timestamp=1608005448652, value=2015-12-19                                
 jsmith                          column=order:numb, timestamp=1608007773239, value=654321                                    
 njones                          column=addr:city, timestamp=1608006023291, value=miami                                      
 njones                          column=addr:state, timestamp=1608006023431, value=TX                                        
 njones                          column=order:numb, timestamp=1608006023340, value=5555                                      
 tsimmons                        column=addr:city, timestamp=1608006023353, value=dallas                                     
 tsimmons                        column=addr:state, timestamp=1608006023369, value=TX                                        
 tsimmons                        column=order:city, timestamp=1608008650389, value=beijing1                                 

在hive里执行

只有做了映射的的列才显示 没有映射的列不显示数据 hbase没有该列order:age 的数据映射在 hive 里为null

create external table customer(
name string,
age string,
city string)
stored by'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties('hbase.columns.mapping'=':key,order:age,addr:city')
tblproperties("hbase.table.name"="customer");

执行结果

hive> select * from customer;
OK
jsmith	NULL	denver
njones	NULL	miami
tsimmons	NULL	dallas

HBase管理

Region管理

  1. Region 就是一个表的一段 Rowkey 的数据集合

region的自动拆分

IncreasingToUpperBoundRegionSplitPolicy 增加到上限区域分割策略(0.94 版本后默认)

Math.min(tableRegionsCounts^3 * initialSize,defaultRegionMaxFileSize)

  1. tableRegionCount:表在所有 RegionServer 上所拥有的 Region 数量总和。

  2. initialSize:如果定义了 hbase.increasing.policy.initial.size,则使用这个数值。如果没有定义,就用memstore 的刷写大小的 2 倍 , hbase.hregion.memstore.flush.size * 2。

  3. defaultRegionMaxFileSize : ConstantSizeRegionSplitPolicy 所 用 到 的

  4. hbase.hregion.max.filesize,即 Region 最大大小。

DisabledRegionSplitPolicy 禁用区域分割策略

预拆分
  1. 概念:预拆分(pre-splitting)就是在建表的时候就定义好了拆分点的算法,所以叫预拆分。
[root@hadoop101 ~]$ hbase org.apache.hadoop.hbase.util.RegionSplitter my_split_table HexStringSplit -c 10 -f mycf
my_split_table:我们指定要新建的表名。
HexStringSplit:指定的拆分点算法为 HexStringSplit。
-c:要拆分的 Region 数量。
-f:要建立的列族名称。
强制拆分

通过 Merge 类合并 Region

  1. Region 可以被拆分,也可以被合并。不过 Region 的合并(merge)并不是为了性能考虑的,而更多地是出于维护的目的被创造出来的。
  2. 比如你删了大量的数据,每个 Region 都变小了,这个时候分成这么多个Region 就有点浪费了,可以把 Region 合并起来,然后可以减少一些 RegionServer 服务器来节省成本
[root@hadoop101 ~]$ hbase org.apache.hadoop.hbase.util.Merge students
students,,1576734174477.0d9f2bedc502b84929196eefc60a5130.
students,aaaa,1576735993384.82fe8c88c99d789dcc424cd18daaea30.

online_merge(热合并)

  1. hbase shell 提供了一个命令叫 online_merge,通过这个方法可以进行热合并(online_merge)。我举个例子说明这个命令怎么用。比如要合并以下两个 Region:
    students, ,1576734174477.0d9f2bedc502b84929196eefc60a5130.
    students,aaaa,1576735993384.82fe8c88c99d789dcc424cd18daaea30.
  2. online_merge 的传参是 Region 的 hash 值,Region 的 hash 值就是 Region 名最后那段在两个“.”号之间的字符串。
hbase(main):026:0> merge_region '0d9f2bedc502b84929196eefc60a5130','82fe8c88c99d789dcc424cd18daaea30'

HFile 合并

  1. Minor Compaction:将 Store 中多个 HFile 合并为一个 HFile。在这个过程中达到 TTL 的数据会被移除,但是被手动删除的数据不会被移除。这种合并触发频率较高。
  2. Major Compaction:合并 Store 中的所有 HFile 为一个 HFile。在这个过程中被手动删除的数据会被真正地移除。同时被删除的还有单元格内超过MaxVersions 的版本数据。这种合并触发频率较低,默认为 7 天一次。不过由于 Major Compaction 消耗的性能较大,你不会想让它发生在业务高峰期,建议手动控制 MajorCompaction 的时机。

HBase优化

高可用

在 HBase 中 HMaster 负责监控 RegionServer 的生命周期,均衡 RegionServer
的负载,如果 HMaster 挂掉了,那么整个 HBase 集群将陷入不健康的状态,并且
此时的工作状态并不会维持太久。所以 HBase 支持对 HMaster 的高可用配置

1.关闭 HBase 集群
[root@hadoop102 hbase]$ bin/stop-hbase.sh
2.在 conf 目录下创建 backup-masters 文件。
[root@hadoop102 hbase]$ touch conf/backup-masters
3.在 backup-masters 文件中配置高可用 HMaster 节点。
[root@hadoop102 hbase]$ echo hadoop103 > conf/backup-masters
4.将整个 conf 目录 scp 到其他节点
[root@hadoop102 ~]$ scp -r /opt/install/hbase/conf/ root@hadoop103:/opt/install/hbase/
[root@hadoop102 ~]$ scp -r /opt/install/hbase/conf/ hadoop104:/opt/install/hbase/
5.启动 HBase 并打开页面测试查看,如图所示。
http://hadooo102:60010

RowKey 设计

一条数据的唯一标识就是 rowkey,那么这条数据存储于哪个分区,取决于
rowkey 处于哪个一个预分区的区间内,设计 rowkey 的主要目的 ,就是让数据
均匀的分布于所有的 region 中,在一定程度上防止数据倾斜(数据热点)。下面
rowkey 常用的设计方案。

  1. 生成随机数、hash、散列值
原本 rowKey 为 1001 的,SHA1 后变成:
dd01903921ea24941c26a48f2cec24e0bb0e8cc7
  1. 字符串反转
20170524000001 转成 10000042507102
  1. 字符串拼接
20170524000001_a12e
20170524000001_93i7

内存优化

HBase 操作过程中需要大量的内存开销,毕竟 Table 是可以缓存在内存中的,一般会分配整个可用内存的 70%给 HBase 的 Java 堆。但是不建议分配非常大的堆内存,因为 GC 过程持续太久会导致 RegionServer 处于长期不可用状态

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值