HBase表数据倾斜治理_采用rowkey反转策略的bulkload
在HBase表数据倾斜治理(1)_shell命令实现bulkload中已经介绍bulkload的原理以及使用shell命令实现bulkload的方法。
数据存储到HBase当中非常容易发生数据倾斜,也就是各个region当中存储的数据数量差距较大。常用于避免HBase表数据倾斜的方法是:预分区+随机散列。此处不再赘述如何实现预分区,重点关注通过Mapper类实现rowkey的随机散列,并将其与bulkload相结合。
1.设计reverse散列策略
源文件fellow.csv数据如下,总共5列数据:id(int),birthday(String),name(String),sex(String),work(String)。
38343,2022/4/24,jiazhengyang,男,正式
374836,2022/4/4,zengqingfan,男,实习
34783484,2022/3/18,lijun,男,正式
37438,2022/4/11,lijiazheng,男,实习
2384783,2022/3/16,qiuyuchen,男,正式
将int类型的id进行reverse然后转化为字节数组1,将String类型的birthday转化为子节数组2,然后将数组1和数组2拼接在一起组成rowkey。这样就可以保证在有相应优化需求时直接拆出rowkey的前4个字节得到id。
2.准备工作
与HBase表数据倾斜治理(1)_shell命令实现bulkload中的准备工作相同,只不过上次使用shell进行bulkload无法随意设计rowkey,使用java变成可以更加灵活地设计rowkey组成规则。
- 开启hadoop和hbase
- 创建csv数据文件并上传到HDFS系统
- 创建Hbase表:
create 'fellowjava','d'
3.创建Mapper类
1 | public class BulkloadMapper extends Mapper<LongWritable, Text, ImmutableBytesWritable, Put> { |
- Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>中的四个泛型:
- KEYIN表示输入数据行的key的数据类型:当输入HFile文件为字符串文件时没有作用;当输入HFile文件为HBase表时用ImmutableBytesWritable对象来装载rowkey。
- VALUEIN表示输入数据行的value的数据类型:当输入HFile文件为字符串文件时用Text对象来装载整行字符数据;当输入HFile文件为HBase表时用Result对象来装载整行单元格对象。
- KEYOUT表示输出数据行的key的数据类型:当输出HFile文件为字符串文件时用Text对象来装载字符数据;当输出HFile文件为HBase表时用ImmutableBytesWritable对象来装载rowkey。
- VALUEOUT表示输出数据行的value的数据类型:当输出HFile文件为字符串文件时用Text对象来字符数据;当输出HFile文件为HBase表时用Put对象来装载整行单元格对象。
- map方法中的context.write()方法执行一个就表示在输出HFile中写入一行数据,一个map方法中可以执行多次context.write()方法。执行n次,输出HFile文件的行数就是输入HFile文件行数的n倍。
- 反射常用来调用入参类型为Object的方法,如上所编写的reverse方法。
4.创建Driver类
1 | public class BulkloadDriver { |
运行main方法即可。