深入浅出大数据之HBase

4 篇文章 0 订阅
2 篇文章 0 订阅

一、HBase概述
HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。
二、HBase中的角色及功能
2.1 HMaster
功能:
1)监控 RegionServer
2)处理 RegionServer 故障转移
3)处理元数据的变更
4)处理region 的分配或移除
5)在空闲时间进行数据的负载均衡
6)通过 Zookeeper 发布自己的位置给客户端
2.2 RegionServer
功能:
1)负责存储 HBase 的实际数据
2)处理分配给它的 Region
3)刷新缓存到 HDFS
4)维护HLog
5)执行压缩
6)负责处理 Region 分片
三、HBase架构原理
HBase 一种是作为存储的分布式文件系统,另一种是作为数据处理模型的 MR 框架。因为日常开发人员比较熟练的是结构化的数据进行处理,但是在 HDFS 直接存储的文件往往不具有结构化,所以催生出了 HBase 在 HDFS 上的操作。如果需要查询数据,只需要通过键值便可以成功访问。
架构图如下图所示:
在这里插入图片描述
HBase 内置有 Zookeeper,但一般我们会有其他的 Zookeeper 集群来监管 master 和 regionserver,Zookeeper 通过选举,保证任何时候,集群中只有一个活跃的 HMaster,HMaster与 HRegionServer 启动时会向 ZooKeeper 注册,存储所有 HRegion 的寻址入口,实时监控HRegionserver 的上线和下线信息。并实时通知给 HMaster,存储 HBase 的 schema 和 table 元数据,默认情况下,HBase 管理 ZooKeeper 实例,Zookeeper 的引入使得 HMaster 不再是单点故障。一般情况下会启动两个 HMaster,非 Active 的 HMaster 会定期的和 Active HMaster通信以获取其最新状态,从而保证它是实时更新的,因而如果启动了多个 HMaster 反而增加了 Active HMaster 的负担。
一个 RegionServer 可以包含多个 HRegion,每个 RegionServer 维护一个 HLog,和多个 HFiles以及其对应的 MemStore。RegionServer 运行于 DataNode 上,数量可以与 DatNode 数量一致。
如果觉得上面那张图不够详细,可以来看这张:
在这里插入图片描述

四、HBase读写流程
4.1 HBase读流程

1) HRegionServer 保存着meta 表以及表数据,要访问表数据,首先 Client 先去访问zookeeper,从 zookeeper 里面获取meta 表所在的位置信息,即找到这个meta 表在哪个HRegionServer 上保存着。
2) 接着Client 通过刚才获取到的 HRegionServer 的 IP 来访问 Meta 表所在的HRegionServer,从而读取到 Meta,进而获取到 Meta 表中存放的元数据。
3) Client 通过元数据中存储的信息,访问对应的HRegionServer,然后扫描所在
HRegionServer 的Memstore 和 Storefile 来查询数据。
4) 最后 HRegionServer 把查询到的数据响应给Client。

4.2 HBase写流程

1) Client 也是先访问 zookeeper,找到 Meta 表,并获取 Meta 表信息。
2) 确定当前将要写入的数据所对应的 RegionServer 服务器和Region。
3) Client 向该 RegionServer 服务器发起写入数据请求,然后RegionServer 收到请求并响应。
4) Client 先把数据写入到 HLog,以防止数据丢失。
5) 然后将数据写入到Memstore。
6) 如果 Hlog 和Memstore 均写入成功,则这条数据写入成功。在此过程中,如果 Memstore
达到阈值,会把 Memstore 中的数据 flush 到 StoreFile 中。
7) 当 Storefile 越来越多,会触发Compact 合并操作,把过多的 Storefile 合并成一个大的Storefile。当 Storefile 越来越大,Region 也会越来越大,达到阈值后,会触发 Split 操作,将 Region 一分为二。

特别提示:因为内存空间是有限的,所以说溢写过程必定伴随着大量的小文件产生。
4.3 读写流程中的名词解释

  1. Write-Ahead logs
    HBase 的修改记录,当对 HBase 读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)。但把数据保存在内存中可能有更高的概率引起数据丢失,为了解决这个问题,数据会先写在一个叫做 Write-Ahead logfile 的文件中, 然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。
    2)HFile
    这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。
    3)Store
    HFile 存储在 Store 中,一个 Store 对应 HBase 表中的一个列族。
    4)MemStore
    顾名思义,就是内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在 WAL中之后,RegsionServer 会在内存中存储键值对。
    5)Region
    Hbase 表的分片,HBase 表会根据RowKey 值被切分成不同的region 存储在RegionServer 中,在一个 RegionServer 中可以有多个不同的 region。
    五、HBase安装
    5.1 在安装HBase的前,要确保Zookeeper、Hadoop的正常使用。
    5.2 下载HBase安装包,并解压到指定目录
    5.3 修改HBase安装目录下conf下的 hbase-env.sh 如下:

    export JAVA_HOME= 你的JDK安装路径
    export HBASE_MANAGES_ZK=false  这个需要往下找找才可以找到
    

    特别提 示: 如果使用的是 JDK8 以上版本,则 应 在 hbase-evn.sh 中 移除“HBASE_MASTER_OPTS”和“HBASE_REGIONSERVER_OPTS”配置。
    5.3 在conf下的 hbase-site.xml文件中添加如下配置(注意按照自己的情况适当修改)
    在这里插入图片描述
    在这里插入图片描述

5.4 HBase软连接Hadoop,命令如下:

ln -s hadoop安装目录下/etc/hadoop/core-site.xml HBase的安装目录下的/conf/core-site.xml
ln -s hadoop安装目录下/etc/hadoop/hdfs-site.xml HBase的安装目录下的/conf/hdfs-site.xml

5.5 分发到集群中的其他机器(注意根据自己的情况修改以下命令)

scp -r /home/admin/modules/hbase-1.3.1/ linux02:/home/admin/modules/
scp -r /home/admin/modules/hbase-1.3.1/ linux03:/home/admin/modules/

5.6 启动集群的两种方式
5.6.1 第一种启动方式(bin目录下执行以下命令)

 ./hbase-daemon.sh start master
 ./hbase-daemon.sh start regionserver
 再去另外两台服务器上分别启动 regionserver
  ./hbase-daemon.sh start regionserver

5.6.2 有没有觉得上面的步骤比较繁琐,反正我是这么觉得,来看第二种(当然还是bin目录下执行)

  ./start-hbase.sh
  对应的关闭命令
  ./stop-hbase.sh

特别提醒,如果集群时间不同步,会导致regionserver 无法启动,抛出
ClockOutOfSyncException 异常。

《时间同步步骤》:https://mp.csdn.net/mdeditor/84757239#
5.7 查看web端口(如果没有配置映射,需要输入ip)
http://linux01:16010
六、HBase简单实用
6.1 简单命令使用

进入HBase客户端命令:(目录下)
   hbase shell
查看帮助命令
   hbase(main)> help
查看当前数据库中有哪些表
   hbase(main)> list

6.2 表操作的基本命令

1.创建表
hbase(main)> create 'student','info'
2.插入数据到表
hbase(main) > put 'student','1001','info:name','Thomas' 
3.扫描查看表数据
hbase(main) > scan 'student'
4.查看表结构
hbase(main):012:0> describe ‘student’
5.更新指定字段的数据
hbase(main) > put 'student','1001','info:name','Nick'
6.查看“指定行”或“指定列族:列”的数据
hbase(main) > get 'student','1001'
7.删除某 rowkey 的全部数据
hbase(main) > deleteall 'student','1001'
8.删除某 rowkey 的某一列数据
hbase(main) > delete 'student','1002','info:sex'
9.清空表数据
hbase(main) > truncate 'student'
特别提示:清空表的操作顺序为先 disable,然后再 truncating。
10.删除表
首先需要先让该表为 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.**

11.统计表数据行数
hbase(main) > count 'student'

关于操作命令先简单说这么多吧,大家自己可以再去找度娘要点!
七、HBase优化
7.1 高可用
在 HBase 中 Hmaster 负责监控 RegionServer 的生命周期,均衡RegionServer 的负载,如果Hmaster 挂掉了,那么整个 HBase 集群将陷入不健康的状态,并且此时的工作状态并不会维持太久。所以 HBase 支持对 Hmaster 的高可用配置。
7.2Hadoop 的通用性优化
1)NameNode 元数据备份使用 SSD
2)定时备份 NameNode 上的元数据
每小时或者每天备份,如果数据极其重要,可以 5~10 分钟备份一次。备份可以通过定时任务复制元数据目录即可。
3)为 NameNode 指定多个元数据目录
使用 dfs.name.dir 或者 dfs.namenode.name.dir 指定。这样可以提供元数据的冗余和健壮性, 以免发生故障。
4)NameNode 的 dir 自恢复
设置 dfs.namenode.name.dir.restore 为 true,允许尝试恢复之前失败的 dfs.namenode.name.dir目录,在创建 checkpoint 时做此尝试,如果设置了多个磁盘,建议允许。
7.3 预分区
每一个region维护着startRow与endRowKey,如果加入的数据符合某个region 维护的rowKey范围,则该数据交给这个 region 维护。那么依照这个原则,我们可以将数据索要投放的分区提前大致的规划好,以提高HBase 性能。
7.4 RowKey 设计
一条数据的唯一标识就是 rowkey,那么这条数据存储于哪个分区,取决于 rowkey 处于哪个一个预分区的区间内,设计 rowkey 的主要目的 ,就是让数据均匀的分布于所有的 region 中,在一定程度上防止数据倾斜。接下来我们就谈一谈 rowkey 常用的设计方案。
7.5 内存优化
HBase 操作过程中需要大量的内存开销,毕竟 Table 是可以缓存在内存中的,一般会分配整个可用内存的 70%给 HBase 的 Java 堆。但是不建议分配非常大的堆内存,因为 GC 过程持续太久会导致 RegionServer 处于长期不可用状态,一般 16~48G 内存就可以了,如果因为框架占用内存过高导致系统内存不足,框架一样会被系统服务拖死。
关于更多的优化,大家可以再去搜集一些!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值