Hbase2.0.5优化总结

  • 1.Hbase优化
  • 2.实际生产中Hbase的使用
  • 3.预定分区
  • 3.1 手动分区
  • 3.2 生成16进制分区序列预分区
  • 3.3按照文件设定的规则进行预分区


1.Hbase优化

Hbase优化 核心就是结合分区_时间戳_关键字段联合使用。其中rowKey设计很重要。

2.实际生产中Hbase的使用

处理散列热点问题
散列热点问题即处理数据的倾斜问题,只要从事于大数据工作,解决数据倾斜问题就不可避免。
常见的散列问题:
1.“双十一”淘宝订单可能引起热点现象:处理方式:根据订单时间戳进行字符串反转,使数据更加散列
2.国庆节旅游热点问题等等。

rowKey设计的注意事项:
散列不能太散,需要稳定在一定的范围,不然数据不好进行聚合。

0. 需求: 存储手机号在某个时间打了多少分钟的电话
 
2. 2. 预分区
     -> 001|
001| -> 002|
002|
003|
...
300|

3. 对手机号进行hash,得到的值取模分区数,放到rowkey的最前端


4. 进一步散列,使用月份来划分用户的信息

对手机号和月份(202103)进行公式计算得到的值,进行hash,取模分区数,放到rowkey的最前端

001_
002_
003_
...
300_


4. 进行一个拼接得到完整的rowkey
分区号_yyyy-MM-dd HH-mm-ss_手机号



1)要求:找某某(131313131)在2021 某时刻 有没有打电话,打了几分钟
	求分区号,然后时间戳,然后手机号,三者用_下划线进行拼接==>rowKey,根据rowKey来查询统计

2)要求:找某某(131313131)在2021 某天 有没有打电话,打了几分钟
	在1)基础上使用scan扫描,按照分区号和时间扫描,按照手机号过滤,判断是否是某某,满足条件求和

3)要求:找某某(131313131)在2021 某月 有没有打电话,打了几分钟
	求出某月哈希,每个分区看一下

4)要求:找某某(131313131)在2021 某年 有没有打电话,打了几分钟
	不同月份进行哈希,每个分区看一下

3.预定分区

3.1 手动分区

create 'staff1','info', SPLITS => ['1000','2000','3000','4000']

hbase row key 设计 热点问题 hbase数据热点问题_16进制


5个region

手动分区有个问题,如果设定300分区,这样不好敲代码

3.2 生成16进制分区序列预分区

create 'staff2','info',{NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}

15,你给的region个数。

hbase row key 设计 热点问题 hbase数据热点问题_hbase_02


16进制分区不常用,容易引起分区数据倾斜,16进制 0-F,ASCI中数据在0-9之范围的数据,尤其是999999~aaaaaa大量使用,可能造成数据的倾斜。

因此在实际生产中压根不会用。

3.3按照文件设定的规则进行预分区

创建splits.txt文件内容如下:
aaaa
bbbb
cccc
dddd
ffff
eeee
然后执行:
create 'staff3', 'info',SPLITS_FILE => 'splits.txt'

注意不是按照a—b–c—d,随意写,但是要注意,文件不能有空行,比如eee下面空行,就会报错。

hbase row key 设计 热点问题 hbase数据热点问题_大数据_03


4.使用JavaAPI创建预分区

package com.atguigu.hbase;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

/**
 * @author dxy
 * @date 2021/3/5 19:41
 */
public class HbasePrepartition_JavaAPI {
    public static void main(String[] args) throws IOException {
        //1.创建配置对象
        Configuration conf = new Configuration();

        //2.给该配置类添加配置信息
        conf.set("hbase.zookeeper.quorum", "hadoop102,hadoop103,hadoop104");

        //3.获取连接
        Connection connection = ConnectionFactory.createConnection(conf);

        //4.获取admin
        Admin admin = connection.getAdmin();


        //5.获取descriptor的builder
        TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(TableName.valueOf("default", "shuff4"));

        //6.创建列族描述对象
        ColumnFamilyDescriptor info = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("info")).build();

        //7.添加列族
        tableDescriptorBuilder.setColumnFamily(info);

        //8.创建对应的切分
        byte[][] splits = new byte[3][];
        splits[0] = Bytes.toBytes("aaa");
        splits[1] = Bytes.toBytes("bbb");
        splits[2] = Bytes.toBytes("ccc");

        //9.创建表
        admin.createTable(tableDescriptorBuilder.build(),splits);

        //9.关闭资源
        admin.close();
        connection.close();

    }
}

hbase row key 设计 热点问题 hbase数据热点问题_apache_04


hbase row key 设计 热点问题 hbase数据热点问题_hadoop_05