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

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

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 {
    
    public static class ReadHbaseMapper extends TableMapper{
        @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 {
        @Override
        protected void reduce(Text key, Iterable 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);
    }

}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5654149.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存