大数据技术之HBase之一

一、HBase的起源

HBase的原型是Google的BigTable论文,受到了该论文思想的启发,目前作为Hadoop的子项目来开发维护,用于支持结构化的数据存储。

官方网站:

*2006年Google发表BigTable白皮书

*2006年开始开发HBase

*2008年北京成功开奥运会,程序员默默地将HBase弄成了Hadoop的子项目

*2010年HBase成为Apache顶级项目

*现在很多公司二次开发出了很多发行版本,你也开始使用了

二、基于Hadoop的HBase架构

HBase内置有zookeeper,但一般我们会有其他的Zookeeper集群来监管master和regionserver,Zookeeper通过选举,保证任何时候,集群中只有一个活跃的HMaster,HMaster与HRegionServer启动时会向ZooKeeper注册,存储所有Region的寻址入口,实时监控HRegionserver的上线和下线信息。并实时通知给HMaster,存储HBase的schema和table元数据,默认情况下,HBase管理ZooKeeper实例,Zookeeper的引入使得HMaster不再是单点故障。一般情况下会启动两个HMaster,非Active的HMaster会定期的和ActiveHMaster通信以获取其最新状态,从而保证它是实时更新的,因而如果启动了多个HMaster反而增加了ActiveHMaster的负担。

一个RegionServer可以包含多个HRegion,每个HRegion维护一个HLog,和多个HFiles以及其对应的MemStore。RegionServer运行于DataNode上,数量可以与DatNode数量一致,请参考如下架构图:

三、RDBMS与HBase的对比3.1、关系型数据库

结构:

*数据库以表的形式存在

*支持FAT、NTFS、EXT、文件系统

*使用Commitlog存储日志

*参考系统是坐标系统

*使用主键(PK)

*支持分区

*使用行、列、单元格

功能:

*支持向上扩展

*使用SQL查询

*面向行,即每一行都是一个连续单元

*数据总量依赖于服务器配置

*具有ACID支持

*适合结构化数据

*传统关系型数据库一般都是中心化的

*支持事务

*支持Join

3.2、HBase

结构:

*数据库以region的形式存在

*支持HDFS文件系统

*使用WAL(Write-AheadLogs)存储日志

*参考系统是Zookeeper

*使用行键(rowkey)

*支持分片

*使用行、列、列族和单元格

功能:

*支持向外扩展

*使用API和MapReduce来访问HBase表数据

*面向列,即每一列都是一个连续的单元

*数据总量不依赖具体某台机器,而取决于机器数量(集群)

*HBase不支持ACID(Atomicity、Consistency、Isolation、Durability)

*适合结构化数据和非结构化数据

*一般都是分布式的

*HBase不支持事务

*不支持Join

四、HBase特征简要4.1、自动故障处理和负载均衡

HBase运行在HDFS上,所以HBase中的数据以多副本形式存放,数据也服从分布式存放,数据的恢复也可以得到保障。另外,HMaster和RegionServer也是多副本的。

4.2、自动分区

HBase表是由分布在多个RegionServer中的region组成的,这些RegionServer又分布在不同的DataNode上,如果一个region增长到了一个阈值,为了负载均衡和减少IO,HBase可以自动或手动干预的将region切分为更小的region,也称之为subregion。

4.3、集成Hadoop/HDFS

虽然HBase也可以运行在其他的分布式文件系统之上,但是与HDFS结合非常之方便,而且HDFS也非常之流行。

4.4、实时随机大数据访问

HBase采用log-structuredmerge-tree作为内部数据存储架构,这种架构会周期性地将小文件合并成大文件以减少磁盘访问同时减少NameNode压力。

4.5、MapReduce

HBase内建支持MapReduce框架,更加方便快速,并行的处理数据。

4.6、JavaAPI

HBase提供原声的JavaAPI支持,方便开发。

4.7、横向扩展

HBase支持横向扩展,这就意味着如果现有服务器硬件性能出现瓶颈,不需要停掉现有集群提升硬件配置,而只需要在现有的正在运行的集群中添加新的机器节点即可,而且新的RegionServer一旦建立完毕,集群会开始重新调整。

4.8、列存储

HBase是面向列存储的,每个列都单独存储,所以在HBase中列是连续存储的,而行不是。

4.9、HBaseShell

HBase提供了交互式命令行工具可以进行创建表、添加数据、扫描数据、删除数据等操作和其他一些管理命令。

五、HBase在集群中的定位

HBase一种是作为存储的分布式文件系统,另一种是作为数据处理模型的MR框架。因为日常开发人员比较熟练的是结构化的数据进行处理,但是在HDFS直接存储的文件往往不具有结构化,所以催生出了HBase在HDFS上的操作。如果需要查询数据,只需要通过键值便可以成功访问。

六、HBase内部存储架构

HBase是由rowkey,columnfamily,column和cell组成,rowkey确定唯一的一行,columnfamily由若干column组成,column是表的字段,cell存储了实际的值或数据。

七、HBase与Hadoop7.1、HDFS

*为分布式存储提供文件系统

*针对存储大尺寸的文件进行优化,不需要对HDFS上的文件进行随机读写

*直接使用文件

*数据模型不灵活

*使用文件系统和处理框架

*优化一次写入,多次读取的方式

7.2、HBase

*提供表状的面向列的数据存储

*针对表状数据的随机读写进行优化

*使用key-value操作数据

*提供灵活的数据模型

*使用表状存储,支持MapReduce,依赖HDFS

*优化了多次读,以及多次写

八、HBase的优缺点8.1、优点

*方便高效的压缩数据

*支持快速数据检索

*管理和配置简单,支持横向扩展,所以非常容易扩展

*聚合查询性能非常高

*可高效地进行分区,提供自动分区机制把大的region切分成小的subregion

8.2、缺点

*对JOIN以及多表合并数据的查询性能不好

*更新过程中有大量的写入和删除操作,需要频繁合并和分裂,降低存储效率

*对关系模型支持不好,分区和索引模式设计比较困难。

九、HBase的环境角色9.1、HMaster9.1.1、功能描述

*监控RegionServer

*处理RegionServer故障转移

*处理元数据的变更

*处理region的分配或移除

*在空闲时间进行数据的负载均衡

*通过Zookeeper发布自己的位置给客户端(Client)

9.2、RegionServer9.2.1、功能描述

*负责存储HBase的实际数据

*处理分配给它的Region

*刷新缓存到HDFS

*维护HLog

*执行压缩

*负责处理Region分片

9.2.2、内含组件

*Write-Aheadlogs

HBase的修改记录,当对HBase读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)。如果机器突然原地爆炸,把数据保存在内存中会引起数据丢失,为了解决这个问题,数据会先写在一个叫做Write-Aheadlogfile的文件中,然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。

*HFile

这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。

*Store

HFile存储在Store中,一个Store对应HBase表中的一个列族

*MemStore

顾名思义,就是内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在WAL中之后,RegsionServer会在内存中存储键值对。

*Region

Hbase表的分片,HBase表会根据RowKey值被切分成不同的region存储在RegionServer中,在一个RegionServer中可以有多个不同的region

9.3、Zookeeper

HMaster与HRegionServer启动时会向ZooKeeper注册,存储所有HRegion的寻址入口,实时监控HRegionserver的上线和下线信息。并实时通知给HMaster,存储HBase的schema和table元数据,默认情况下,HBase管理ZooKeeper实例,Zookeeper的引入使得HMaster不再是单点故障。一般情况下会启动两个HMaster,非Active的HMaster会定期的和ActiveHMaster通信以获取其最新状态,从而保证它是实时更新的,因而如果启动了多个HMaster反而增加了ActiveHMaster的负担。

十、使用场景的探讨10.1、何时使用

*如果数据有很多列,且包含很多空字段

*数据包含了不定数量的列

*需要维护数据的版本

*需要很高的横向扩展性

*需要大量的压缩数据

*需要大量的I/O

一般而言数百万行的数据和频率不高的读写操作,是不需要HBase的,如果有几十亿列数据,同时在单位时间内有数以千、万记的读写操作,可以考虑HBase。

10.2、何时不使用

*数据总量不大时(比如就几个G)

*当需要JOIN以及关系型数据库的一些特性时

*如果关系型数据库可以满足需求

十一、HBase的安装与部署10.1、Zookeeper集群的正常部署并启动

$/opt/modules/cdh//bin/

10.2、Hadoop集群的正常部署并启动

$/opt/modules/cdh//sbin/

$/opt/modules/cdh//sbin/

10.3、解压HBase

$tar-zxf/opt/softwares//opt/modules/cdh/

10.4、修改HBase配置文件10,.4.1、10.4.2、10.4.3、regionservers10.5、替换HBase根目录下的lib目录下的jar包,以解决兼容问题

*删除原有Jar包

$rm-rf/opt/modules/cdh//lib/hadoop-*$rm-rflib/

(尖叫提示:如果lib目录下的zookeeper包不匹配也需要替换)

*拷贝新的Jar包

这里涉及到的jar包大概是:


(无)

我们可以通过find命令快速进行定位,例如我们可以执行:

$find/opt/modules/-

然后将查找出来的Jar包根据指定位置复制到HBase的lib目录下,在这里我给大家整合好到一个文件夹中了,请依次执行:

$tar-zxf/opt/softwares/CDH_/opt/softwares/

$cp-a/opt/softwares/HadoopJar/*/opt/modules/cdh//lib/

10.6、将整理好的HBase安装目录scp到其他机器节点

$scp-r/opt/modules/cdh//\

:/opt/modules/cdh/

$scp-r/opt/modules/cdh//\

:/opt/modules/cdh/

10.7、将Hadoop配置文件软连接到HBase的conf目录下

*

$ln-s/opt/modules/cdh//etc/hadoop//opt/modules/cdh//conf/

*

$ln-s/opt/modules/cdh//etc/hadoop//opt/modules/cdh//conf/

(尖叫提示:不要忘记其他几台机器也要做此操作)

10.8、启动服务

$bin/

$bin/

或者:

$bin/

对应的停止命令:

$bin/

10.9、查看页面

启动成功后,可以通过主机名:60010地址来访问HBase的管理页面

例如,

http://hadoop110:60010

十二、HBase常用操作12.1、进入HBase客户端命令操作界面

$bin/hbaseshell

12.2、查看帮助命令

hbase(main):001:0help

12.3、查看当前数据库中有哪些表

hbase(main):002:0list

12.4、创建一张表

hbase(main):003:0create'student','info'

12.5、向表中存储一些数据

hbase(main):004:0put'student','1001','info:name','Thomas'

hbase(main):005:0put'student','1001','info:sex','male'

hbase(main):006:0put'student','1001','info:age','18'

12.6、扫描查看存储的数据

hbase(main):007:0scan'student'

或:查看某个rowkey范围内的数据

hbase(main):014:0scan'student',{STARTROW='1001',STOPROW='1007'}

12.7、查看表结构

hbase(main):009:0describe‘student’

DESCRIPTIONENABLED'student',{NAME='info',BLOOMFILTER='trueROW',VERSIONS='1',IN_MEMORY='false',KEEP_DELETED_CELLS='false',DATA_BLOCK_ENCODING='NONE',TTL='FOREVER',COMPRESSION='NONE',MIN_VERSIONS='0',BLOCKCACHE='true',BLOCKSIZE='65536',REPLICATION_SCOPE='0'}1row(s)12.8、更新指定字段的数据

hbase(main):009:0put'student','1001','info:name','Nick'

hbase(main):010:0put'student','1001','info:age','100'

查看更新后的数据:

12.9、查看指定行的数据

hbase(main):012:0get'student','1001'

或:查看指定行指定列或列族的数据

hbase(main):013:0get'student','1001','info:name'

12.10、删除数据12.10.1、删除某一个rowKey全部的数据

hbase(main):015:0deleteall'student','1001'

12.10.2、删除掉某个rowKey中某一列的数据

hbase(main):016:0delete'student','1001','info:sex'

12.11、清空表数据

hbase(main):017:0truncate'student'

12.12、删除表

首先需要先让该表为disable状态,使用命令:

hbase(main):018:0disable'student'然后才能drop这个表,使用命令:hbase(main):019:0drop'student'(尖叫提示:如果直接drop表,会报错:)

12.13、统计一张表有多少行数据

hbase(main):020:0count'student'

十三、HMaster的高可用13.1、确保HBase集群已正常停止

$bin/

13.2、在conf目录下创建backup-masters文件

$touchconf/backup-masters

13.3、在backup-masters文件中配置高可用HMaster节点

$/backup-masters

echohadoop111conf/backup-masters

13.4、将整个conf目录scp到其他节点

$scp-rconf/:/opt/modules/cdh//

$scp-rconf/:/opt/modules/cdh//

13.5、打开页面测试

最后,可以尝试关闭第一台机器的HMaster:

$bin/

然后查看第二台的HMaster是否会直接启用

十四、HBase和Hadoop的集群类型14.1、单机模式

主要用于开发工作,一台机器上运行所有的守护进程,或者一台机器运行多个虚拟机。一般用于评估和测试。

14.2、小型集群

20台机器以内的集群,不同的机器运行不同的守护进程,适用于数据量和处理请求较少的小型生产环境。

14.3、中型集群

20到1000台机器集群,3到5个zookeeper节点,适用于成熟的生产环境。

14.4、大型集群

1000台机器以上的集群,属于超大规模集群了,适用于大规模生产环境。

十五、集群配置举例15.1、NameNode/HMaster常见配置

内存:16~128G

CPU:2*(8~24)核处理器

硬盘:1TB-SATA硬盘+1个元数据备份盘(转速7200R/MIN+)能使用固态更好。

网卡:2*1GB网卡

为了有更好的性能,所有的元数据都缓存在内存中,因此内存需要拥有较快的速度和较好的质量。大内存意为着可以存储更多的文件,从而支持NameNode更大的命名空间。同时NameNode不需要很大的磁盘,小容量的磁盘就可以满足需求,元数据要存储加载到内存中,数据副本以及修改日志存储在磁盘上。

15.2、ResourceManager

可以运行在NameNode机器上,也可以运行在单独的机器上。硬件配置和NameNode一直,因为只是用于作业分发,因此不需要较大的磁盘和较强的运算能力。

15.3、DataNode、RegionServer

实际的数据存储于这些节点,因此这些节点需要较大的存储和较强的运算能力。较小的集群可以使用一般的磁盘,内存和CPU,如果集群规模较大,可以考虑:

内存:16~128G

CPU:2*(8~24)核处理器

硬盘:2TB,转速7200

网卡:2*1GB

十六、CDH配置

备选资源:

内存:64~512GB

硬盘:1TB~4TB

CPU:2*(8~24)核CPU,主频2~2.5GHZ

网卡:千、万兆以太网

16.1、CPU

工作负载核心,推荐DataNode配置为双CPU插槽,配置中等主频的CPU,高端CPU太烧钱,所以我们可以增加数量。

16.2、电源

耐热性,稳定。

16.3、内存

需要足量的内存以保证不需要等待数据频繁的装载到内存中,因此8~48G内存比较合适,HBase会使用大量的内存,将文件存放在内存中(如果开启了内存表的话),对于HBase集群,我们需要比单独的Hadoop集群更大的内存。如果HBase开启缓存,Hbase会尝试将整张表缓存在内存中。

16.4、磁盘

不建议在某台机器上配置很大容量的磁盘,这样当这台机器出现问题,不容易将数据分散到其他机器节点中。必须不能低于SATA7200转

16.5、网络

Hadoop或者HBase在执行任务,读取数据和写入数据时,会在节点之间传输数据块,因此建议配置高速的网络和交换机。对于中小集群,1GB/s的网络足矣。对于排序和shuffle这类操作,需要节点间传输大量数据,如果带宽不足,会导致一些节点连接超时,比如RegionServer、Zookeeper。

十七、容量规划

运算公式:T=(S*R)*1.25

尖叫提示:

S表示存储数据量

R表示副本数

T表示整个集群需要的空间

十八、HBase读写流程18.1、HBase读数据流程

HRegionServer保存着meta表以及表数据,要访问表数据,首先Client先去访问zookeeper,从zookeeper里面获取meta表所在的位置信息,即找到这个meta表在哪个HRegionServer上保存着。

接着Client通过刚才获取到的HRegionServer的IP来访问Meta表所在的HRegionServer,从而读取到Meta,进而获取到Meta表中存放的元数据。

Client通过元数据中存储的信息,访问对应的HRegionServer,然后扫描所在HRegionServer的Memstore和Storefile来查询数据。

最后HRegionServer把查询到的数据响应给Client。

18.2、HBase写数据流程

Client也是先访问zookeeper,找到Meta表,并获取Meta表元数据。

确定当前将要写入的数据所对应的HRegion和HRegionServer服务器。

Client向该HRegionServer服务器发起写入数据请求,然后HRegionServer收到请求并响应。

Client先把数据写入到HLog,以防止数据丢失。

然后将数据写入到Memstore。

如果HLog和Memstore均写入成功,则这条数据写入成功

如果Memstore达到阈值,会把Memstore中的数据flush到Storefile中。

当Storefile越来越多,会触发Compact合并操作,把过多的Storefile合并成一个大的Storefile。

当Storefile越来越大,Region也会越来越大,达到阈值后,会触发Split操作,将Region一分为二。

十九、HBase中的3个重要机制19.1、flush机制

当MemStore达到阈值,将Memstore中的数据Flush进Storefile

涉及属性:

:134217728

即:128M就是Memstore的默认阈值

:0.4

即:这个参数的作用是当单个HRegion内所有的Memstore大小总和超过指定值时,flush该HRegion的所有memstore。RegionServer的flush是通过将请求添加一个队列,模拟生产消费模式来异步处理的。那这里就有一个问题,当队列来不及消费,产生大量积压请求时,可能会导致内存陡增,最坏的情况是触发OOM。

:0.38

即:当MemStore使用内存总量达到
指定值时,将会有多个MemStoresflush到文件中,MemStoreflush顺序是按照大小降序执行的,直到刷新到MemStore使用内存略小于lowerLimit

19.2、compact机制

把小的Memstore文件合并成大的Storefile文件。

19.3、split机制

当Region达到阈值,会把过大的Region一分为二。

二十、HBaseAPI的使用20.1、解压Maven离线仓库到指定目录

$tar-zxf/opt/softwares/hbase+hadoop_~/.m2/

20.2、新建Eclipse的MavenProject,添加的depency如下:20.3、编写HBaseAPI代码

详见项目代码

二十一、文件格式的说明21.1、tsv格式的文件:字段之间以制表符\t分割21.2、csv格式的文件:字段之间以逗号,分割二十二、HBase的MapReduce的调用22.1、查看HBase执行MapReduce所依赖的Jar包

执行命令:

$bin/hbasemapredcp

出现如下内容:

22.2、执行环境变量导入

$exportHBASE_HOME=/opt/modules/cdh//$exportHADOOP_HOME=/opt/modules/cdh/$exportHADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbasemapredcp`

22.3、运行官方的MapReduce任务22.3.1、案例一:统计student表中有多少行数据

*执行代码

$/opt/modules/cdh//bin/yarnjarlib/

22.3.2、案例二:使用MapReduce任务将数据从文件中导入到HBase

Step1、创建一个tsv格式的文件

$,内容如下:

Step2、创建HBase表

$bin/hbaseshellhbase(main):001:0create'fruit','info'

Step3、在HDFS中创建input_fruit文件夹并上传文件

$/opt/modules/cdh//bin/hdfsdfs-mkdir/input_fruit/

$/opt/modules/cdh//bin//input_fruit/

Step4、执行MapReduce到HBase的fruit表中

$/opt/modules/cdh//bin/yarnjarlib/

=HBASE_ROW_KEY,info:name,info:colorfruit\

hdfs://:8020/input_fruit

Step5、使用scan命令查看导入后的数据即可

二十三、BulkLoad加载文件到HBase表23.1、功能

将本地数据导入到HBase中

23.2、原理

BulkLoad会将tsv/csv格式的文件编程hfile文件,然后再进行数据的导入,这样可以避免大量数据导入时造成的集群写入压力过大。

23.3、作用

*减小HBase集群插入数据的压力

*提高了Job运行的速度,降低了Job执行时间

23.4、案例Step1、配置临时环境变量

$exportHBASE_HOME=/opt/modules/cdh//$exportHADOOP_HOME=/opt/modules/cdh/$exportHADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbasemapredcp`

Step2、创建一个新的HBase表

$bin/hbaseshell

hbase(main):001:0create'fruit_bulkload','info'

Step3、将tsv/csv文件转化为HFile(别忘了要确保你的fruit格式的文件在input目录下)

$/opt/modules/cdh//bin/yarnjar\

/opt/modules/cdh//lib/\

-=/output_file\

-=HBASE_ROW_KEY,info:name,info:color\

fruithdfs://:8020/input_fruit

Step4、把HFile导入到HBase表fruit_bulkload

上一步完成之后,你会发现在HDFS的根目录下出现了一个output_file文件夹,里面存放的就是HFile文件,紧接着:把HFile导入到HBase表fruit_bulkload

$/opt/modules/cdh//bin/yarnjar\

/opt/modules/cdh//lib/\

completebulkload/output_filefruit_bulkload

Step5、查看使用bulkLoad方式导入的数据

hbase(main):001:0scan‘fruit_bulkload’

版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。

相关推荐