Admin对象中的方法

负载均衡
快照
合并
小合并
大合并
拆分
刷写
读写数据流程
数据存储原理
rowkey的设计
热点问题
过滤器
整合MR程序
协处理器

HDFS安全模式导致hbasse不可用

hdfs dfsadmin -safemode enter
 hdfs dfsadmin -safemode leave

负载均衡region可手动 拆分

split “tb_balance” , “r002”
 region 下线
 unassign “” 下线
 assign 上线
 assign “” 上线


move “xxxxxxx” , “linux03,16020,xxxxxx”

给表拍摄快照

snapshot “sourceTable”, “snapshotName”
 snapshot “namespace:sourceTable”, “scapshotName”, {SKIP_FLUSH => true}
 list_snapshots
 restore_snapshot(restore前需要disable “tb_xx”)

region拆分
1某个regions中经常出现查询热点问题 手动的拆分 以后移动
2自动的拆分 随着数据的越来越多 单节点RS管理的数据很多 增加查询热点的概率
3预拆分region,建表的时候指定拆分点
shell
hbase> create “ns1:t1”, “f1”, SPLITS =>[“10”,“20”,“30”,“40”]
HBASE> create “t1”, “f1”, SPLITS=>[‘10’,‘20’,‘30’,‘40’]
java
admin.create(tbdescriptor, byte[][]{keys})
按key的固定长度拆分
按分隔符拆分

当hbase表在regionserver上的region,如果region的大小达到一个阈值,这个region将会分成为二个
1^32128 256M
2^32128 2G
3^32128 6.75G
10G 10G
数据的储存
hbase数据库 借助了HDFS分布式文件系统来储存数据 HDFS中的数据不允许随机修改
名称空间(default)/tb_balance(表名)/XXXXXXXXXXXXXXXX(region)/cf(列族)/xxxxxx(hfile)
hbase hfile -p -f /名称空间(default)/tb_balance(表名)/XXXXXXXXXXXXXXXX(region)/cf(列族)/xxxxxx(hfile)

Hbase实现数据的CRUD 所有的操作都是追加操作
put 插入 更新
delete
get

自动合并major_compact
major_compact “t1”, “c1”
compact 合并
手动合并
hfile的合并
region合并
小合并
大合并
split “a”,“a002”
list_regions “a”

merge_region “xxxxxxxx”, “xxxxxxxxx” 合并region

读数据流程
布隆过滤器
写数据流程

flush时机
单个memstore达到128M
节点的内存达到阈值
操作的次数
人为的flush

过滤器入门程序
行过滤器多条件过滤
行和属性过滤器
多条件过滤案例
rowkey设计
二级索引
电影案例
bulkload批量导入

1阐述Hbase写数据流程
1客户端请求ZK集群获取存储元数据信息的META表所有机器
2请求META表所在的机器,下载META表到客户端并缓存在本地
3客户端解析META表,获取要读取的数据所在的RegionServer机器
4请求RegionServer确定读取的数据在哪个region
5先从内存对象中获取数据,如果没有再查看缓存区域,缓存中没有再去Hfile中读取数据,为了快速的确定数据在哪个Hfile中,HBASE引入了布隆过滤器
6如果数据是从Hfile中读取,会将数据存储在缓冲区中再返回给客户端,方便下次查询时提高查询效率

2阐述hbase读数据流程
客户端-ZooKeeper-meta-regionserver-region-memstore-blockfile-storefile
1首先从ZooKeeper中找到meta表的region的位置,然后读取meta表中的数据,而meta中又存储了用户表的region信息
2根据namespace,表名,rowkey,根据meta表中的数据找到写入数据对应的region信息
3找到对应的regionServer
4查找对应的region
5先从Memstore找数据,如果没有,再到StoreFile上读
1客户端请求ZooKeeper,ZooKeeper返回meta表所在的位置信息
2客户端获取meta表的位置信息以后,请求META表所在的RegionServer机器获取存储数据的元数据表META
3客户端获取META表,并缓存到客户端(方便下次使用),客户端这时得到了数据在哪个RegionServer的哪个Region上
4客户端根据元数据信息,请求对应的RegionServer上的region获取数据
4.1从MemStore中查看是否有要读取的数据,如果有,则将数据写入到缓冲块中,返回客户端
4.2如果内存中没有要读取的数据,则去缓冲块汇总查看是否有需要的数据,如果有则返回客户端
4.3如果缓存中依然没有我们要找的数据,这时去HDFS中的Hfile中读取数据
4.4从HFile中获取数据以后,也会将查询的结果写到缓冲块中,再返回给客户端

3什么是二级索引,意义何在,怎么使用
HBase的查询都是通过RowKey(要把多条件组合查询的字段都拼接在RowKey中显然不太可能)或者全表扫描再结合过滤器筛选出目标数据(太低效)
所以通过设计HBase的二级索引来解决这个问题。
多个查询条件构成了多维度的组合查询,需要根据不同组合查询出符合条件的数据。

4Hbase中的rowkey是什么 怎么设计
用来表示唯一一行记录的主键,HBase的数据是按照RowKey的字典顺序进行全局排序的,所有的 查询都只能依赖于这一个排序维度
设计原则
a)一条数据的唯一标识就是rowkey,这条数据储存在哪个分区,取决于rowkey处于那个一预分区的区间
设计rowkey的主要目的,就是让数据均匀的分布在所有的region中,在一定的程度上防止数据倾斜
1rowkey程度原则
Rowkey是一个二进制码流,Rowkey的长度被建议在设计10-100个字节,不过建议越短越好,不要超过1个字节,存为byte[]字节数组
原因:1数据的持久化文件HFile是按照KeyValue存储的,如果RowKey过长比如100个字节,1000万列数据储存Rowkey就占用了大量空间,影响HFile的存储效率
2MemStore将缓存部分数据到内存中,字段过长有效利用率会降低,系统无法缓存更多的数据,降低检索效率
b)散列原则
如果RowKey是按时间戳的方式递增,不要将时间放在二进制码的前面,建议将RowKey的高位作为散列由程序循环生成,低位放时间字段,这样可以提供数据均衡分布在每一个RegionServer实现负载均衡的几率
rowkey是按照字典存储,设计rowkey时,利用这个排序特点,将经常一起读取的数据存储在一块,将最近可能被访问的数据负载一起
c)rowkey唯一性原则
必须保证唯一性,rowkey是按照字典顺序排序存储的,设计rowkey的时候,充分利用这个排序的特点,将经常读取的数据存储在一块,将最近可能被访问的数据负载一块
d)避免热地问题
根据数据特点,业务特点,查询多还是写入多,是否存在并发操作,并发的频次和周期,并发量比较打
进行设计

5什么是热点问题 如何避免
当表被创建时,HBASE默认只会为该表分配一个region,那么,初始状态所有的请求会集中在一个RegionServer上,当大量数据写入,该节点将成为热点,甚至产生full gc
region热点不仅仅体现在创建表的阶段,对于一张拥有很多region的大表来说,其在RegionServer上的分布往往十分不均匀,region较多的RegionServer在有大量数据写入时,负载会大于其他region数少的RegionServer,这也是热点
如何避免:
如果知道了Hbase数据表的key分布情况,可以根据需要,规划拆分成多少个region,每个region的起始key是多少,那么就可以在建表的时候对hbase进行region的预区分,这样可以避免热点,提供写入数据效率
合理设计rowkey能让各个region的并发请求平均分配,是的IO效率达到最高.例如key的前几位字符串都是0001-0010的数字,这样就可以分成为10个region,使用SOLITS
create “t1”, “f1”, {SPLITS=>[“0001”,“0002”,“0003”,“0004”,“0005”,“0006”]}
如果分区信息比较多,可以通过指定分区文件来做
create “t1”, “f1”,{SPLITS_FILE=>“region_split_info.txt”}

6手动操作批量导入数据到hbase
bulkloader:用于批量快速导入数据到HBASE的工具/方法
用于已经存在一批巨量静态数据的情况,如果不是要bulkloader工具,则只能使用rpc请求,一条一条的通过rpc提交到regionserver插入效率低下
bulkloader利用了HBASE的数据信息是按照特定格式储存在hdfs中这一特性,字节在HDFS中生成持久化的HFile数据格式文件
完成巨量数据快速的入库操作
配合MapReduce完成这一的操作,不会占用RegionServer资源,不会产生巨量的写入I/O,所以需要带的jcpu个网络资源较少
实现原理:通过MapReduce Job生成一个Hbase的HFile格式文件,形成一个特殊的hbase数据表,直接将数据文件加载到运行的集群中
原理:三部分
1从数据源(文本文件或者其他数据库)提取原始数据并上传到HDFS.抽取数据到HDFS和Hbase没有关系
2利用MapReduce作业处理事先准备的数据,使用HFileOutputFormat2生成HBase数据文件
3告诉RegionServers数据的位置并导入数据.使用LoadlncrementalHFiles(或者completebulkload工具)
将文件在HDFS上的位置传递给它,它会利用RegionServer将数据导入到相应的区域
例:1数据文件
uid001.lss.32.F
uid002.zss.32.F
uid004.wss.32.F
uid004.dss.32.F
2在hbase中创建表
create “tb_teacher”, “cf”
3将user.csv文件上传到linux系统的目录中
4生成Hfile文件
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.separator=, -Dimporttsv.columns=‘HBASE_ROW_KEY,cf:name,cf:age,cf:gender’  -Dimporttsv.bulk.output=/csv/out   tb_teacher   /csv/user.csv
5将生成的file文件导入到hbase表中
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /csv/out/ tb_teacher

7布隆过滤器在hbase中的应用
使用很少的空间来实现从大量文件汇总定位数据(数据一定不在 或者极其可能在)
每次flush都会在表对应的文件夹中生成Hfile文件,可能一个表中的Hfile文件很多,为了快速的确定数据在哪个Hfile中,Hbase引入了布隆过滤器
使用布隆过滤器可以减少不必要的快加载,提高整个集群的吞吐率