HBase入门详解(三)

个人博客原文链接

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

HBase的MapReduce操作

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

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

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
    添加内容
    <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 S
      erver负载却很小,就造成了“热点”现象
  2. 解决方案
    • row key不采用单调递增算法,可以采用随机算法生成
    • 考虑数据分布情况,合理安排row key范围进行预分区

猜你喜欢

转载自blog.csdn.net/a1135497143/article/details/82844177