HBase架构读写流程,过滤器,MR读写HBase

一、HBase架构及读写流程

 1、Master作用

1)为RegionServer分配Region

2)负责RegionServer的负载均衡

3)发现失效的Region并重新分配

4)管理用户对表结构的增删改操作

2、RegionServer的作用

1)维护Region,处理用户的IO请求

2)切分运行过程中过大的Region

3、Zookeeper作用

1)保存HMater的一些原数据,例如:meta表(存储region的一些信息,在哪个RegionServer,rowkey的访问)位置、有哪些表、有哪些命名空间

2)监控RegionServer的状态

3)保证集群在任意时刻只有一个Master

4、Write Ahead Log

WAL机制:HBase在写数据之前,会险些Hlog,然后再写Memstore

Hlog它是Hadoop Sequence File,也是K-V格式的

Hlog的key记录了数据写入的信息,比如table和region字、sequence number、写入时间....

 Hlog的Value就是HBase的KeyValue对象,表示HBase中的数据

当RegionServer挂了的时候,在memstore中的数据,还未形成storefile,那么这部分数据会丢失,但是可以通过Hlog恢复

5、HBase读写流程

1)写流程

由客户端client发起一个请求,然后client会连接zk,在zk中找meta表的位置(就是HBase中的一张表,其数据也是存在某台RegionServer上)假设找到mate表在node1上,那么client就会连接到node1上RegionServer获取meta表中数据,接下来会根据写入数据(一般是一个Put对象)的rowkey去meta表中查询该rowkey属于哪一个region,假设在node2,那么client就会连接node2上的RegionServer,将数据写入,先写Hlog,然后再写入对应region中的store中的memstore,当memstore达到128M的时候就会flush到磁盘形成storefile

2)读流程

首先由client发起一个读请求,也需要根据读取的rowkey去meta表中进行查找,改rowkey属于哪一台节点中的RegionServer,假设获取的rowkey在node1上,那么client就会连接node1上的RegionServer,先去BlockCatch中找,若没找到再去memstore中找,最后再去storefile中获取数据

注意:1)在创建列簇时,有一个参数:IN_MEMORY,若为ture,则会将storefile中找到的数据放入BlockCatch进行缓存 

2)为加快读写请求响应速度,client会在第一次找到meta表位置时,将其位置缓存 

二、过滤器Filter

过滤器的作用是在服务端判断数据是否满足条件,然后只将满足条件的数据返回给客户端

1、使用过滤器的两类参数

1)抽象的操作符 CompareOp

  • LESS <

  • LESS_OR_EQUAL <=

  • EQUAL =

  • NOT_EQUAL <>

  • GREATER_OR_EQUAL >=

  • GREATER >

  • NO_OP 排除所有

2)比较器

BinaryComparator 二进制比较器

BinaryPrefixComparator 二进制前缀比较器

RegexStringComparator 正则表达式比较器(不能有空格)

SubstringComparator 子字符串比较器

2、过滤器(均传两个参数)

1)RowFilter rowkey过滤器 

2)ValueFilter 列值过滤器(作用在每一个cell上,符合要求的cell不会被过滤)

3)FamilyFilter 列簇过滤器

4)QualifierFilter 列名过滤器

3、专用过滤器(传特定参数)

1)SingleColumnValueFilter 单列值过滤器 (列簇,列名,操作符,值)

2)SingleColumnValueExcludeFilter 单列值排除过滤器 (列簇,列名,操作符,值)

3)PrefixFilter rowkey前缀过滤器 (rowkey前缀)

4)PageFilter 分页过滤器 (页数)

4、多过滤器FilterList

三、Bloom Filter(布隆过滤器)

是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。

已经知道rowKey存放在HFile中,那么为了从一系列的HFile中查询某个rowkey,我们就可以通过 Bloom Filter 快速判断 rowkey 是否在这个HFile中,从而过滤掉大部分的HFile,减少需要扫描的Block。

Bloom Filter有两个重要参数

1、哈希函数个数

2、位数组大小

四、MR读写HBase

package com.shujia;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
import org.apache.hadoop.hbase.mapreduce.TableMapper;
import org.apache.hadoop.hbase.mapreduce.TableReducer;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;

import java.io.IOException;

public class Demo6MRReadAndWriteHBase {
    /**
     * MapReaduce读写HBase
     * 读取student表,统计班级人数,并将最后的结果保存到HBase
     */
    public static class ReadHBaseMapper extends TableMapper<Text,IntWritable>{
        @Override
        protected void map(ImmutableBytesWritable key, Result value, Context context) throws IOException, InterruptedException {
            String clazz = Bytes.toString(value.getValue("info".getBytes(), "clazz".getBytes()));
            context.write(new Text(clazz),new IntWritable(1));
        }
    }

    public static class WriteHBaseReducer extends TableReducer<Text,IntWritable,NullWritable> {
        @Override
        protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            int sum=0;
            for (IntWritable value : values) {
                sum+=value.get();
            }
            //先在HBase中将表建好
            //create 'clazz_cnt','cf1'
            Put put = new Put(key.getBytes());
            put.addColumn("cf1".getBytes(),"cnt".getBytes(),(sum+"").getBytes());

            context.write(NullWritable.get(),put);
        }
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        Configuration conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper,quorum","master:2181,node1:2181,node2:2181");

        Job job = Job.getInstance();
        job.setJobName("Demo6MRReadAndWriteHBase");
        job.setJarByClass(Demo6MRReadAndWriteHBase.class);

        //map端
        TableMapReduceUtil.initTableMapperJob(
                TableName.valueOf("student"),
                new Scan(),
                ReadHBaseMapper.class,
                Text.class,
                IntWritable.class ,
                job
        );

        //reduce端
        TableMapReduceUtil.initTableReducerJob(
                "clazz_cnt",
                WriteHBaseReducer.class,
                job
        );

        job.waitForCompletion(true);
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值