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读写Hbasepackage 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); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)