一:简介
- Hbase角色
Hbase一共存在两个角色,一个HMaster(主节点) ,一个RegionServer (从节点) - HMaster功能
⑴监控 RegionServer
⑵处理 RegionServer 故障转移
⑶处理元数据的变更
⑷处理 region 的分配或移除
⑸在空闲时间进行数据的负载均衡
⑹通过 Zookeeper 发布自己的位置给客户端 - RegionServer 功能
⑴负责存储 HBase 的实际数据
⑵处理分配给它的 Region(可以理解为table,用来存储数据)
⑶刷新缓存到 HDFS
⑷维护 HLog
⑸执行压缩
⑹负责处理 Region 分片
二:Hbase架构
- 架构图如下:
⑴客户端client:
Client 访问用户数据前需要首先访问 ZooKeeper,因为ZooKeeper中存放着数据的元数据地址信息,
ZooKeeper负责维护元数据信息。
⑵HRegionServer:
client通过ZooKeeper找到了元数据信息,那么就找到了这个数据的地址,这个数据又是存放在
HRegionServer中的,那么现在需要通过HRegionServer去访问数据本身了。
HRegionServer中又分为如下几个模块:
a:HLog
存在本地磁盘中用来做灾难恢复使用,HLog记录数据的所有变更,一旦region server 宕机,就可以从log中进行恢复。
b:HRegion(一个HRegionServer可以维护和管理多个HRegion)
table在行的方向上分隔为多个Region。Region是HBase中分布式存储和负载均衡的最小单元,
即不同的region可以分别在不同的Region Server上,但同一个Region是不会拆分到多个server上。
Region按大小分隔,每个表一般是只有一个region。随着数据不断插入表,region不断增大,
当region的某个列族达到一个阈值时就会分成两个新的region。
c:Store(一个HRegion中包含多个store)
每一个region由一个或多个store组成,至少是一个store,hbase会把一起访问的数据放在一个store里面,
即为每个 ColumnFamily建一个store,如果有几个ColumnFamily,也就有几个Store。一个Store由一个
memStore和0或者 多个StoreFile组成。 HBase以store的大小来判断是否需要切分region。
HFile 存储在 Store 中,一个 Store 对应 HBase 表中的一个列族。
d:MemStore(一个Store对应一个MemStore)
memStore 是放在内存里的。保存修改的数据即keyValues。当memStore的大小达到一个
阀值(默认128MB)时,memStore会被flush到文 件,即生成一个快照。目前hbase 会有一个
线程来负责memStore的flush操作。
e:StoreFile
memStore内存中的数据写到文件后就是StoreFile,StoreFile底层是以HFile的格式保存。
当storefile文件的数量增长到一定阈值后,系统会进行合并(minor、major compaction),
在合并过程中会进行版本合并和删除工作(majar),形成更大的storefile。
f:HFile
HBase中KeyValue数据的存储格式,HFile是Hadoop的 二进制格式文件,实际上StoreFile就是
对Hfile做了轻量级包装,即StoreFile底层就是HFile。这是在磁盘上保存原始数据的实际的物理文件,
是实际的存储文件。
三:HBase 部署与使用
- 解压 HBase 到指定目录
- 修改hbase-env.sh 配置文件,在/opt/module/hbase-1.3.1/conf/目录下
注意:如果使用的是 JDK8 以 上 版 本 , 则 应 在 hbase-evn.sh 中 移除“HBASE_MASTER_OPTS”和“HBASE_REGIONSERVER_OPTS”配置。
- 修改hbase-site.xml 配置文件,在/opt/module/hbase-1.3.1/conf/目录下
<configuration> <!--设置HBase将数据写到哪个目录下--> <property> <name>hbase.rootdir</name> <value>hdfs://hadoop102:9000/hbase</value> </property> <!--设置集群模式,完全分布式模式--> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <!-- 0.98 后的新变动,之前版本没有.port,默认端口为 60000 --> <property> <name>hbase.master.port</name> <value>16000</value> </property> <!--设置zookeeper集群 --> <property> <name>hbase.zookeeper.quorum</name> <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value> </property> <!--配置hbase中的元数据信息存放在zookeeper中的位置 --> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/opt/module/zookeeper-3.4.10/zkData</value> </property> </configuration>
- 修改regionservers配置文件,在/opt/module/hbase-1.3.1/conf/目录下
- HBase 需要依赖的 Jar 包
a:简介
由于 HBase 需要依赖 Hadoop,所以替换 HBase 的 lib 目录下的 jar 包,以解决兼容问题。
b:删除原有的 jar,zookeeper默认jar也删掉
- 拷贝新 jar,涉及的 jar 有:
- HBase 软连接 Hadoop 配置 (软链接文件有类似于Windows的快捷方式)
- HBase 远程 scp 到其他集群节点
- 启动zookeeper和hadoop
- HBase 服务的启动
- 效果,通过Hbase提供的页面查看
四:Hbase基本操作
- 进入 HBase 客户端命令行
命令:bin/hbase shell
- 查看当前数据库中有哪些表
- 创建表 ,表名:student,列簇:info
- 向表中插入数据(Hbase擅长存储非结构化数据)
语法:put '表名','rowkey(不用在创建表时候指定)','列簇:列名(这个列名不用在创建表时候指定)','数据'
- 扫描查看表数据
语法:scan '表名'
- 将之前的name覆盖掉
- 可以指定不同的rowkey
- 查看表结构
- 查看“指定行”或“指定列族:列”的数据 (会扫描整张表,性能很低)
- 删除数据
a:删除某 rowkey 的全部数据:
b:删除某 rowkey 的某一列数据:
- 清空表数据
- 删除表
a:首先需要先让该表为 disable 状态
b:然后才能 drop 这个表:
- 统计表数据行数 (这里统计的是rowkey的数量,因为Hbase是按列存储的)