1.HBASE与关系型数据库结合使用,存储实时数据:
一般是关系型数据库区处理实时的在线数据,处理完成之后,定期的将数据存到HBASE上面,这个定期的频率很低,一般就会认为就是在线的业务
2.zookeeper维护HBASE的元数据,HBASE的元数据存储在zookeeper中
当启动Hmaster成功的时候,Hmaster会去zookeeper中拿到regionServer的所有信息(region在哪个地方存放着)
当Hmaster启动的时候,会向zookeeper写入当前的运行状态,目的是为了高可用,以及regionServer和Hmaster之间的通信
3.数据已经提前上传到了hdfs上了,为什么还要写入到region中,region也是在hdfs中的
首先数据本身和数据对应的操作(当次的操作,还未生效的预写入操作)会写入Hlog中,数据上传到Hlog成功后,Hlog再将数据写入到hdfs中,
成功之后,下一步会往内存中存储(memory store,默认内存中存储64M),
再次成功后,数据会生效存储(已经进行对应操作的数据)到region中
在region中生效成功了,Hlog和内存中之前存储的数据就会删除掉,最终数据会持久化保存到region中,Hlog和memory store只是在保存数据的过程中产生的临时文件
HBASE中的数据就存在region中,region在hdfs上,会随着hdfs的备份机制有几个副本
4.数据存到了DataNode上面,是什么意思?
这句话是为了方便我们理解,其实本身是错误的,DataNode和namenode不能存储数据,数据最终是存储到Linux系统的磁盘里的,
它们只是一个服务进程,帮助你在数据最终落到磁盘这个过程中进行一些优化,提供一些服务,它们没有存储数据的功能,只有处理数据的功能
我们遇到的一些角色,基本上都是进程,比如hdfs中的NameNode,DataNode,HBASE中的Hmaster,RegionServer,每一个服务进程里面会开若干个线程
5.Master可以自动做一些数据倾斜的优化,在空闲时间进行数据的负载均衡
6.Hbase是依赖zookeeper和hdfs的
7.HBASE为了读写高效,进行了二级缓存,刚写进来的数据是在缓存里面的,内存里的数据是刷到本地磁盘的,刷到本地磁盘之后,再刷到hdfs里面
8.HBASE中的Hlog,里面是往HBASE里面写数据的逻辑操作,这个操作包含了数据本身和对这个数据的行为.HBASE二级缓存,一部分是写进内存,一部分是写进Hlog,
这两部分都写入成功了,才称之为一次HBASE写入操作
9.HBASE读数据的流程:
客户端读取数据的时候,根据从zookeeper得到的元数据信息,定位到存有目标数据的region,首先会尝试从内存里(memory store,里面存的是用户最近写入的数据)里把数据读出来,
如果发现内存里没有,紧接着会去加载Hfile,把数据从Hfile加载到内存中,然后再返回给客户端
如果客户端第一次访问内存找到了目标数据,就直接返回数据了,读操作结束.
HBASE是带内存缓存的,经常访问的数据,会进行内存缓存,有一个算法:LRUCache,最小引用技术算法,用一个双链表来维护对应访问关系
regionserver保存着.META.的这样一张表以及表数据,要访问表数据,首先客户端会先去访问zookeeper,从zookeeper里面获取-ROOT-表的位置信息,进而找到.META.表所在的位置信息,
即找到这个.META.表是在哪个regionserver上保存着
10.HBASE写数据的流程:
从zookeeper知道数据将要往哪个regionserver里面写,接下来就要确定数据写入该regionserver中的哪个region
每个region都维护了若干个rowkey,每一个rowkey维护了一个范围段的数据
如果要写入的数据,正好属于某一rowkey的维护范围,那么客户端就把数据写入这个region,写的时候,要先写入内存(memory store),写入内存成功后,接着写入到Hlog中,这次写入操作才算成功
每一次的写入操作不一定会写入Hfile中,还要看阈值,达到了阈值后,regionserver才会把memory store中的数据溢写到Hfile中,
Hfile是在本地磁盘,与hdfs没有关系,当溢写到本地磁盘之后,regionserver会调用一个API,hdfsclient,将Hfile中的数据写入到hdfs里,
然后hfile会删除,但会保留元数据信息,知道hfile的数据存到了哪个DataNode上
11.regionserver包含多个region的原因:
HBASE可能会有多个客户端,多个客户端可能会同时读数据,写数据,操作同一个region,这种情况下,一个regionserver维护多个region,可以提高效率,
并且,可以针对不同的业务来设计不同的region,交由一个regionserver管理
memostore和blockcache是同属于一块JVM堆的,memostore只负责写入数据的缓存,blockcache只负责读取数据的缓存
客户端在读取数据的时候,首先会去memostore写入数据的缓存中去寻找,因为有时候读写操作是同时进行的,没有的话就会去blockcache里面寻找
blockcache里面有一个最小引用算法:LRUCache 意思是最近的,最常使用的缓存算法(替换使用频次最低的,如果使用频次最低有并列的,就替换最早加入队列的那一个)
当在memostore和blockcache里都没有找到的时候,客户端就会去Hfile(在hdfs里面)找,找到后会将数据缓存在blockcache里,最后返回给客户端
客户端读取数据的时候,ROOT表怎么知道要读取的数据是在哪一个region里面?
存储实际业务数据的region,是要维护一个rowkey范围的,每一个region都维护了一个指定范围内的rowkey数据,在region里面的rowkey是排好序的(按位比较排序)
12.HBASE是强依赖hdfs和zookeeper的,在启动HBASE集群前,一定要保证hdfs和zookeeper启动没问题
13.如果部署的时候出错,一定可以在logs里面找到问题
14.HBASE的表结构(从左到右):
rowkey:必须是唯一的不重复的
ts(timestamp):时间戳,每一条数据在修改的过程中,都会自动的添加一个时间戳,这是HBASE自带的功能,目的是为了维护多个版本
COLUMN FAMILIES:列族,可以包含很多列,每一列下面是存储数据的若干列,比如: username sex
tom male
cell:单元格,每一个列中的数据,是存在cell中的 ,同一个单元格里会放多个版本的数据,对外展示的是最新版本的数据,但是可以根据时间戳获取到之前版本的数据,起到了备份的作用
怎么定位到cell中的数据:首先找到rowkey,再找到列族,接着找到列族中的列,比如HBASE中存放数据 hbase.put(rowkey:info:username,tom)
15.hbase shell:
首先启动zookeeper集群,再启动hdfs集群,最后启动HBASE集群
HBase 服务的启动
启动方式 1 :
$ bin/hbase-daemon.sh start master
$ bin/hbase-daemon.sh start regionserver
如果集群之间的节点时间不同步,会导致 regionserver 无法启动,抛出
ClockOutOfSyncException 异常。
启动方式 2 :
$ bin/start-hbase.sh
对应的停止服务:
$ bin/stop-hbase.sh
尖 叫 提 示 : 如 果 使 用 的 是 JDK8 以 上 版 本 , 则 应 在 hbase-evn.sh 中 移 除
“HBASE_MASTER_OPTS”和“HBASE_REGIONSERVER_OPTS”配置。
查看 Hbse 页面
启动成功后,可以通过“host:port”的方式来访问 HBase 管理页面,例如:
http://hadoop101:16010
进入 HBase 客户端命令行
$ bin/hbase shell
查看帮助命令
$ bin/hbase shell
查看当前数据库中有哪些表
$ bin/hbase shell
创建表
hbase(main)> create 'student','info'
插入数据到表
hbase(main) > put 'student','1001','info:name','Thomas'
扫描查看表数据
hbase(main) > scan 'student'
hbase(main) > scan 'student',{STARTROW => '1001', STOPROW => '1001'}
hbase(main) > scan 'student',{STARTROW => '1001'}
查看表结构
hbase(main):012:0> describe ‘student’
更新指定字段的数据
hbase(main) > put 'student','1001','info:name','Nick'
查看 “指定行”或“指定列族:列 列 ” 的数据
hbase(main) > get 'student','1001'
hbase(main) > get 'student','1001','info:name'
删除某 rowkey 的 的 全部 数据: :
hbase(main) > deleteall 'student','1001'
删除某 rowkey 的某一列 数据:
hbase(main) > delete 'student','1002','info:sex'
清空表数据
hbase(main) > truncate 'student'
尖叫提示:清空表的操作顺序为先 disable,然后再 truncating。
首先需要先让该表为 disable 状态: :
hbase(main) > disable 'student'
能 然后才能 drop 这个表:
hbase(main) > drop 'student'
尖叫提示:如果直接 drop 表,会报错:Drop the named table. Table must first be disabled
ERROR: Table student is enabled. Disable it first.
统计表数据行数
hbase(main) > count 'student'
变更表信息
将 info 列族中的数据存放 3 个版本:
hbase(main) > alter 'student',{NAME=>'info',VERSIONS=>3}
16.regionserver宕机后,如何进行数据迁移?
在初始化的时候,master会持有-root-表和.meta.表的元数据信息,这些元数据信息指的就是DataNode中的信息,具体的root表所对应的region,所对应的存储文件是在哪个DataNode上面
然后master会把宕机的regionserver所维护的region迁移到其他的regionserver上面去,继续提供服务
17.master的主要功能:
1.做regionserver的故障转移
2.持有regionserver的各种状态,这些状态信息是保存在zookeeper中的,master会定期从zookeeper中获取
18.Hlog存的是本次写数据的操作,包含数据本身和对数据的操作,当region挂掉之后,就从Hlog中恢复数据,当memostore的数据成功的成功溢写到hdfs的时候,Hlog就会被删掉