环境:centos7+hadoop3.0.3+hbase2.0.1+jdk8

HBase的MapReduce操作

注意事项:
Map继承TableMapper
Reduce继承TableReducer
最后Reduce输出的value的类型是Mutation
通过TableMapReduceUtil来设置相关信息

实例:统计行键并添加到指定列族

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class RowCountMR extends Configured implements Tool {
public static void main(String[] args) throws Exception {
ToolRunner.run(new RowCountMR(), args);
}
@Override
public int run(String[] args) throws Exception {
// 设置配置信息
Configuration conf = getConf();
conf.set("hbase.zookeeper.quorum","hadoop5:2181");
conf.set("hbase.master.dns.interface", "hadoop5");
// 创建job对象
Job job = Job.getInstance(conf,"xj_count");
// 创建扫描对象
Scan scan = new Scan();
// 创建Map任务,传入表名、scan、Mapper类、map输出key类型、map输出value类型、job
TableMapReduceUtil.initTableMapperJob(conf.get("inpath"), scan, RCMapper.class, Text.class, IntWritable.class, job);
// 创建Reduce对象,传入表名、Reducer类、job
TableMapReduceUtil.initTableReducerJob(conf.get("outpath"), RCReducer.class, job);
// 提交任务
job.waitForCompletion(true);
return 0;
}
// 创建Map类继承TableMapper
public static class RCMapper extends TableMapper<Text,IntWritable>{
@Override
protected void map(ImmutableBytesWritable key, Result value, Context context) throws IOException, InterruptedException {
context.write(new Text("t"),new IntWritable(1));
}
}
// 创建Reducer类继承TableReducer
public static class RCReducer extends TableReducer<Text, IntWritable, Text> {
@Override
protected void reduce(Text key, Iterable<IntWritable> value, Context context) throws IOException, InterruptedException {
long l = 0;
for (IntWritable v : value) {
l+=v.get();
}
// 创建put对象并指定行健
Put put = new Put(Bytes.toBytes("xj"));
// 添加数据信息,列族,列名,值
put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("count"), Bytes.toBytes(""+l));
// 输出的value是Mutation类型的
context.write(key, put);
}
}
}

HBase的用户权限控制

简介:
R - 代表读取权限
W - 代表写权限
X - 代表执行权限
C - 代表创建权限
A - 代表管理权限

  1. 配置权限
    修改配置文件hbase-site.xml
    添加内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <property>
    <name>hbase.superuser</name>
    <value>hbase</value>
    </property>
    <property>
    <name>hbase.coprocessor.region.classes</name>
    <value>org.apache.hadoop.hbase.security.access.AccessController</value>
    </property>
    <property>
    <name>hbase.coprocessor.master.classes</name>
    <value>org.apache.hadoop.hbase.security.access.AccessController</value>
    </property>
    <property>
    <name>hbase.rpc.engine</name>
    <value>org.apache.hadoop.hbase.ipc.SecureRpcEngine</value>
    </property>
    <property>
    <name>hbase.security.authorization</name>
    <value>true</value>
    </property>
  2. 授予权限
    给用户’HBaseTest’授予所有权限
    grant 'HBasetest','RWXCA'

  3. 撤销权限
    撤销用户’HBaseTest’所有权限
    revoke 'HBaseTest'
  4. 列出指定表的权限
    列出表’student’的所有权限
    user_permission 'student'

列族的高级配置

  1. 可配置的数据块大小
    HFile数据块大小可以放在列族层次设置,本质和hdfs数据块不是一回事,是在hbase内部,把Hfile划分成了块,默认大小是64k。每个数据块都会将索引值放入hfile中,块越小那么数据小,hfile中索引值越多占用容量越大,带来的效果是随机访问性能更好。如果每个数据块体积变大,那么hfile中索引值占用容量越小,能让更多的数据加载进入内存,从而提高顺序访问性能。
    create ‘mytable’,{NAME=>’cf1’,BLOCKSIZE=>’65536’}

  2. 数据块缓存
    把数据放进读缓存里并不一定能提高效率,比如,一张表或者表中的列族,只是偶尔进行get和scan,那么有无此缓存功能都无所谓,并不会提高效率。此外,再比如,如果一张表或者表中的列族,高频率的进行scan操作,那么会造成缓存滥用的情况,很有可能把真正能提高性能的数据排挤出缓存。为了避免上述情况发生,可以关闭缓存功能,缓存功能默认是打开的。
    create ‘mytable’,{NAME=>’cf1’,BLOCKCACHE=>’false’}

  3. 激进缓存
    可以选择一些列族,赋予他们在数据块缓存中有更高的优先级,从而可以提高他们被缓存的概率,以及减小被从缓存中删除的概率。要注意此属性,除了让此列族比其他列族更激进外无其他特殊功能。默认值为false
    create ‘mytable’,{NAME=>’cf1’,IN_MEMORY=>’true’}

  4. 布隆过滤器
    布隆过滤器允许对存储在每个数据块的数据做一个反向测试,当某行被请求时,先检查布隆过滤器,看看该行在不在这个数据块中,返回结果不在或者 不确定在不在,那么可以减少访问block的次数,从而提高随机访问的效率
    布隆过滤器会占用额外的内存空间,并且随着表数据的增长而增长,当空间不是问题时,在数据量较大的情况下,布隆过滤器的性能尤为突显。
    create ‘mytable’,{NAME=>’cf1’,BLOOMFILTER=>’ROWCOL’}
    ROW只针对rowkey进行过滤,get提高效率,scan无影响
    ROWCOL指既针对rowkey也针对qualifier进行过滤,get提高效率, scan看情况,如果scan有针对列名在操作则提高效率,如果没有则无影响

  5. 生存时间
    早于TTL值所指定时间的数据,会在下一次大合并时会被删除。在同一个单元上的多个时间版本的数据也生效。 可以禁用,也可以设置值为INT.MAX_VALUE 即永远启用,单位:秒。
    create ‘mytable’,{NAME=>’cf1’,TTL=>’18000’}

  6. 压缩
    HFile可以被压缩并存放在HDFS上,这有助于节省硬盘空间,但是读写压缩数据会抬高CPU的利用率。推荐启用压缩,除非能确定压缩不会带来益处,或者CPU利用率有限制。
    Hbase有多种压缩编码,LZO,Snappy,GZIP前两者是流行的两种,但是LZO受版权影响需要单独安装,故常用Snappy。注意,数据只有在硬盘上是压缩的,在内存中或者网络传输时是没有压缩的。
    create ‘mytable’,{NAME=>’cf1’,COMPRESSION=>’SNAPPY’}

协处理器Coprocessor

简介:
HBase变成数据处理工具
处理数据的压力放在服务器端
给HBase添加新的行为

  1. Observer
    Observer类似于传统数据库中的触发器,当发生某些事件的时候这类协处理器会被Server端调用。Observer Coprocessor 就是一些散布在HBaseServer端代码中的hook钩子,在固定的事件发生时被调用。比如:put操作之前有钩子函数prePut,该函数在put操作执行前会被RegionServer调用;在put操作之后则有postPut钩子函数
  2. EndPoint
    Endpoint协处理器类似传统数据库中的存储过程,客户端可以调用这些 Endpoint协处理器执行一段Server端代码,并将Server端代码的结果返回给客户端进一步处理,最常见的用法就是进行聚合操作。

HBase的热点效应

  1. 产生原因
    • row key单调递增
    • 表采用默认分区
      检索HBase的记录首先要通过row key来定位数据行。当大量的client访问HBase集群的一个或少数几个节点,造成少数Region Server的读写请求过多、负载过大,而其他Region Server负载却很小,就造成了“热点”现象
  2. 解决方案
    • row key不采用单调递增算法,可以采用随机算法生成
    • 考虑数据分布情况,合理安排row key范围进行预分区

最后更新: 2018年11月21日 16:09

原始链接: https://www.lousenjay.top/2018/09/25/HBase入门详解(三)/