Hbase
!!Hbase各节点的时间应该统一
1.最终一致性
2.避免冗余
3.维护一致性,处理事务
1)一致性
2)可用性
3)分布式处理
跳表+布隆过滤器
四维结构rowkey,column family ,column,ts ====value
WAL 预写日志
1.所有的数据,都在磁盘和内存中存储了完整的
2.所有的数据写入都是先写日志,然后在更新到内存
1.介于sql和Nosql之间
2.不支持join
3.只支持行内事务
4.底层全是存放的字节数组对象
表特点:
1.大
2.面向列
3.稀疏(null不占空间)
4.无严格模式
1)无模式:插入的kv可以放在任何的列簇中
2)有模式,插入的kv必须在现有的列簇中
表结构
1.rowkey 一根据rowkey,也可以用过滤器扫描全表
1)查数据直接根据rowkey
2)根据rowkey范围
3)全表扫描
2.key的长度不能超过64K,最好是10-100byte之间,最好是16;最好是8的倍数
3.列簇:
一组key组成一个列簇,具有相同IO特性
查询其中一个key的时候一般来说,都会查询另外一个key
所以说key1和key2具有相同的IO特性
在部分场景中,不同IO,使用同一个列簇比较好
4.真正的key-value中的key就是列
插入的kv到底应该存储在哪个列簇中,在列入的时候一定要指定
5.时间戳
作用:相当于一个kv中的value中的多个版本的版本号
两种管理范式:
1)保存最近的最新的N个版本
2)保存一定时间范围内的所有数据秒如果某个版本数据超过时间限制,那么会被Habse服务器自动删除
Hbase架构:
三种角色:client server(mater,hregionserver)
hmaster并没有参与到真正的数据的查询(主要用来管理hregionserver的状态,和所有的region信息)
hbase的主从架构,决定了hbase还是有单点故障问题,但是问题不迫切
表示:hbase的主节点,可以在宕机了以后,整个hbase集群依然可以对外提供服务
但是hmater的负载均衡没有了。
当前hbase中的每个region都会增长,增长到10G就会分裂
分裂的标准:在h1以前是256M,在h1以后是10G
分裂出来的两个region一般来说。hregion会汇报给hmater,hmater一般来说,都会寻找以恶新的hregionserver来
进行存储这分裂出来的两个region当中的一个
zookeepr(解决SPOF(单点故障),存储寻址入口)
原始数据表raw:所有Hbase表都会有多个region
.meta.:所有的这些region的映射信息都存储在第二级表中。如果这些映射信息过多,就会造成第二级表分裂
-root-:第二级表的多个region也会被映射起来,存储在第一级表中。
最终的核心要点,-root-这张定级表中的数据量不管多大,都不会进行分裂
其实根据调表这种数据结构的特点,如果能寻找到-root-这个表中的那个唯一region在哪里,
就能得知用户要寻找的数据是那些最底层的region
-root-这张i奥的所有输就是一个region,这个region也是存储在hrgionserver中,但是经常会有迁移操作
zookeeper给hbase存储寻址入口:
其实就是存储了-root-表的唯一region在哪个regionserver的位置
hbase的寻址机制
region就是一张hbase表的逻辑抽象单位
一个region并不是一个单独的文件在HDFS的目录树中体现为一个文件夹
所有表的所有region是进行了负载均衡后进行分配存储的
hadoop一定是高可用的么? 不一定非得是高可用。
配置文件的修改:
1.hbase-env.sh 跟运行环境相关 JDK Zookeeper
export JAVA_HOME=
export HBASE_MANAGES_K=true
如果这个值为true表示使用自带的zookeeper,而不是我们用户指定的zookeeper
2.hbase-site.xml 集群的核心配置文件
3.regionserver 从节点的列表
4.backup-masters standby hmater节点
默认没有这个文件,请自己创建 在文件中放入备份主节点的列表(一行一个主机名)
5.文件分发以及配置文件的cp
6.配置环境变量
7.启动
启动一直一定要注意,保证HADOOP和Zookeeper启动正常
hbase的安装没有初始化操作
直接启动就好了
启动zookeeper
启动hadoop
查看命令:hdfs dfsadmin -safemode 安全模式是否退出
hdfs haadmin getServiceState 看有没有节点
启动hbase start-hbase.sh
8.验证
1.使用jps查看进程是否正常
2.端口号16010
Hbase的shell操作:
1.进入客户端:hbase shell
2.关于库
关于表(创建,查看表列表。查看表的详细信息,删除表,清空表,修改表的定义)
关于数据的操作(增put,删delete,查get + scan,改==变相的增加)
一个Hserver会有一个Hlog
要删除表,先停用 disable 表名 再 drop 表名
清空表,truncat 表名
hbase的表一经创建以后,那么列簇的名字就不能更改了
如果说列簇的名字指定有误,可以通过先删除列簇然后再添加回来,但是必须要承受损失这个列簇数据的代价
alter 't1',NAME =>'f1',VERSIONS=>4
增加列簇f1,版本为5
删除列簇
alter 't1',NAME=>'CF1',METHOD=>'DELETE'
get : rowkey 根据rowkey来查
scan: 不用指定rowkey,可以指定rowkey范围
删除value
HDFS的和性能API:2个
HBASE当中的核心API:13个
HBaseConfiguration 配置信息
Connection
HBaseAdmin/Admin 管理员
Htable 整个表的抽象信息
HColumnDescriptor 列的描述信息
HTableDescriptor 列簇的描述信息
HTableDescriptor包含了关于一个HBase表的详细信息,比如所有列族的描述符,表是一个目录表,HBase:meta,如果表是只读的,内存存储的 最大大小,什么时候应该进行区域分割,与之关联的协处理器等等…
Put
Delete
Get
Scan
KeyValue
Cell
Result
ResultScanner
第一步:获取连接
// 创建一个可以用来管理hbase配置信息的config对象
Configurtion config = HbaseConfigguratio.create();
//设置当前的程序去寻找的 hbase在哪里,通过zookeeper
config.set("hbase.zookeeper.quorum","hadoop02:2181,hadoop03:2181")
Connection con = ConnectionFactory.createConnection(config);
// 根据连接获取到一个管理员对象
Admin admin=con.getAdmin();
第二步:通过连接进行数据库的响应操作
boolean tableExists=admin.tableExits(TableName.valueof("XXX"));
去查Hbase的JAVA API
第三步:关闭连接
admin.close();
1.hbase的各种概念描述
表:行键 列簇 列 时间戳
集群架构: hdfs zookeeper region master regionserver
2.hbase的集群搭建
一定要把core-site.xml hdfs-site.xml 放置在conf目录中
hbase的集群对数据同步的要求很高。 只要是数据库,都对时间的同步的要求很高
当hbase集群中的任何两个节点的时间差距超过30秒的时候
对应的节点都启动不正常
3.hbase的shell操作
表:list create alter delete enable disable desc
数据: put delete
put的命令的使用:
put 表 行键 列定义 值
put 't1','rk01','cf1:age','18'
get 表 行键
get 表 行键 列簇
get 表 行键 列簇:列
get 表 行键 列簇:列 时间戳
scan 表
scan 表 起始行键 结束行键
scan 表 列簇
scan 表 列簇:列
总结命令使用的精髓:
hbase shell
exit/quit
help
help command
help command_group
Filter
过滤器的种类较多,但可以分为两大类--比较过滤器,专用过滤器。
表规则:
== eq
!= ne
> gt
>= ge
< lt
<= le
NO_OP 排除所有
查看所有的过滤器:show_filters
批量导入