Hbase2.0.5优化总结
作者:互联网
Hbase2.0.5优化总结
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']
5个region
手动分区有个问题,如果设定300分区,这样不好敲代码
3.2 生成16进制分区序列预分区
create 'staff2','info',{NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
15,你给的region个数。
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下面空行,就会报错。
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();
}
}
标签:总结,info,splits,散列,分区,Hbase2.0,hbase,优化,手机号 来源: https://blog.csdn.net/qq_43883124/article/details/114412066