HBase的原型是Google的BigTable论文,受到了该论文思想的启发,目前作为Hadoop的子项目来开发维护,用于支持结构化的数据存储。
官方网站:
*2006年Google发表BigTable白皮书
*2006年开始开发HBase
*2008年北京成功开奥运会,程序员默默地将HBase弄成了Hadoop的子项目
*2010年HBase成为Apache顶级项目
*现在很多公司二次开发出了很多发行版本,你也开始使用了
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数量一致,请参考如下架构图:
结构:
*数据库以表的形式存在
*支持FAT、NTFS、EXT、文件系统
*使用Commitlog存储日志
*参考系统是坐标系统
*使用主键(PK)
*支持分区
*使用行、列、单元格
功能:
*支持向上扩展
*使用SQL查询
*面向行,即每一行都是一个连续单元
*数据总量依赖于服务器配置
*具有ACID支持
*适合结构化数据
*传统关系型数据库一般都是中心化的
*支持事务
*支持Join
结构:
*数据库以region的形式存在
*支持HDFS文件系统
*使用WAL(Write-AheadLogs)存储日志
*参考系统是Zookeeper
*使用行键(rowkey)
*支持分片
*使用行、列、列族和单元格
功能:
*支持向外扩展
*使用API和MapReduce来访问HBase表数据
*面向列,即每一列都是一个连续的单元
*数据总量不依赖具体某台机器,而取决于机器数量(集群)
*HBase不支持ACID(Atomicity、Consistency、Isolation、Durability)
*适合结构化数据和非结构化数据
*一般都是分布式的
*HBase不支持事务
*不支持Join
HBase运行在HDFS上,所以HBase中的数据以多副本形式存放,数据也服从分布式存放,数据的恢复也可以得到保障。另外,HMaster和RegionServer也是多副本的。
HBase表是由分布在多个RegionServer中的region组成的,这些RegionServer又分布在不同的DataNode上,如果一个region增长到了一个阈值,为了负载均衡和减少IO,HBase可以自动或手动干预的将region切分为更小的region,也称之为subregion。
虽然HBase也可以运行在其他的分布式文件系统之上,但是与HDFS结合非常之方便,而且HDFS也非常之流行。
HBase采用log-structuredmerge-tree作为内部数据存储架构,这种架构会周期性地将小文件合并成大文件以减少磁盘访问同时减少NameNode压力。
HBase内建支持MapReduce框架,更加方便快速,并行的处理数据。
HBase提供原声的JavaAPI支持,方便开发。
HBase支持横向扩展,这就意味着如果现有服务器硬件性能出现瓶颈,不需要停掉现有集群提升硬件配置,而只需要在现有的正在运行的集群中添加新的机器节点即可,而且新的RegionServer一旦建立完毕,集群会开始重新调整。
HBase是面向列存储的,每个列都单独存储,所以在HBase中列是连续存储的,而行不是。
HBase提供了交互式命令行工具可以进行创建表、添加数据、扫描数据、删除数据等操作和其他一些管理命令。
HBase一种是作为存储的分布式文件系统,另一种是作为数据处理模型的MR框架。因为日常开发人员比较熟练的是结构化的数据进行处理,但是在HDFS直接存储的文件往往不具有结构化,所以催生出了HBase在HDFS上的操作。如果需要查询数据,只需要通过键值便可以成功访问。
HBase是由rowkey,columnfamily,column和cell组成,rowkey确定唯一的一行,columnfamily由若干column组成,column是表的字段,cell存储了实际的值或数据。
*为分布式存储提供文件系统
*针对存储大尺寸的文件进行优化,不需要对HDFS上的文件进行随机读写
*直接使用文件
*数据模型不灵活
*使用文件系统和处理框架
*优化一次写入,多次读取的方式
*提供表状的面向列的数据存储
*针对表状数据的随机读写进行优化
*使用key-value操作数据
*提供灵活的数据模型
*使用表状存储,支持MapReduce,依赖HDFS
*优化了多次读,以及多次写
*方便高效的压缩数据
*支持快速数据检索
*管理和配置简单,支持横向扩展,所以非常容易扩展
*聚合查询性能非常高
*可高效地进行分区,提供自动分区机制把大的region切分成小的subregion
*对JOIN以及多表合并数据的查询性能不好
*更新过程中有大量的写入和删除操作,需要频繁合并和分裂,降低存储效率
*对关系模型支持不好,分区和索引模式设计比较困难。
*监控RegionServer
*处理RegionServer故障转移
*处理元数据的变更
*处理region的分配或移除
*在空闲时间进行数据的负载均衡
*通过Zookeeper发布自己的位置给客户端(Client)
*负责存储HBase的实际数据
*处理分配给它的Region
*刷新缓存到HDFS
*维护HLog
*执行压缩
*负责处理Region分片
*Write-Aheadlogs
HBase的修改记录,当对HBase读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)。如果机器突然原地爆炸,把数据保存在内存中会引起数据丢失,为了解决这个问题,数据会先写在一个叫做Write-Aheadlogfile的文件中,然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。
*HFile
这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。
*Store
HFile存储在Store中,一个Store对应HBase表中的一个列族
*MemStore
顾名思义,就是内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在WAL中之后,RegsionServer会在内存中存储键值对。
*Region
Hbase表的分片,HBase表会根据RowKey值被切分成不同的region存储在RegionServer中,在一个RegionServer中可以有多个不同的region
HMaster与HRegionServer启动时会向ZooKeeper注册,存储所有HRegion的寻址入口,实时监控HRegionserver的上线和下线信息。并实时通知给HMaster,存储HBase的schema和table元数据,默认情况下,HBase管理ZooKeeper实例,Zookeeper的引入使得HMaster不再是单点故障。一般情况下会启动两个HMaster,非Active的HMaster会定期的和ActiveHMaster通信以获取其最新状态,从而保证它是实时更新的,因而如果启动了多个HMaster反而增加了ActiveHMaster的负担。
*如果数据有很多列,且包含很多空字段
*数据包含了不定数量的列
*需要维护数据的版本
*需要很高的横向扩展性
*需要大量的压缩数据
*需要大量的I/O
一般而言数百万行的数据和频率不高的读写操作,是不需要HBase的,如果有几十亿列数据,同时在单位时间内有数以千、万记的读写操作,可以考虑HBase。
*数据总量不大时(比如就几个G)
*当需要JOIN以及关系型数据库的一些特性时
*如果关系型数据库可以满足需求
$/opt/modules/cdh//bin/
$/opt/modules/cdh//sbin/
$/opt/modules/cdh//sbin/
$tar-zxf/opt/softwares//opt/modules/cdh/
*删除原有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/
$scp-r/opt/modules/cdh//\
:/opt/modules/cdh/
$scp-r/opt/modules/cdh//\
:/opt/modules/cdh/
*
$ln-s/opt/modules/cdh//etc/hadoop//opt/modules/cdh//conf/
*
$ln-s/opt/modules/cdh//etc/hadoop//opt/modules/cdh//conf/
(尖叫提示:不要忘记其他几台机器也要做此操作)
$bin/
$bin/
或者:
$bin/
对应的停止命令:
$bin/
启动成功后,可以通过主机名:60010地址来访问HBase的管理页面
例如,
http://hadoop110:60010
$bin/hbaseshell
hbase(main):001:0help
hbase(main):002:0list
hbase(main):003:0create'student','info'
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'
hbase(main):007:0scan'student'
或:查看某个rowkey范围内的数据
hbase(main):014:0scan'student',{STARTROW='1001',STOPROW='1007'}
hbase(main):009:0describe‘student’
hbase(main):009:0put'student','1001','info:name','Nick'
hbase(main):010:0put'student','1001','info:age','100'
查看更新后的数据:
hbase(main):012:0get'student','1001'
或:查看指定行指定列或列族的数据
hbase(main):013:0get'student','1001','info:name'
hbase(main):015:0deleteall'student','1001'
hbase(main):016:0delete'student','1001','info:sex'
hbase(main):017:0truncate'student'
首先需要先让该表为disable状态,使用命令:
hbase(main):018:0disable'student'然后才能drop这个表,使用命令:hbase(main):019:0drop'student'(尖叫提示:如果直接drop表,会报错:)
hbase(main):020:0count'student'
$bin/
$touchconf/backup-masters
$/backup-masters
echohadoop111conf/backup-masters
$scp-rconf/:/opt/modules/cdh//
$scp-rconf/:/opt/modules/cdh//
最后,可以尝试关闭第一台机器的HMaster:
$bin/
然后查看第二台的HMaster是否会直接启用
主要用于开发工作,一台机器上运行所有的守护进程,或者一台机器运行多个虚拟机。一般用于评估和测试。
20台机器以内的集群,不同的机器运行不同的守护进程,适用于数据量和处理请求较少的小型生产环境。
20到1000台机器集群,3到5个zookeeper节点,适用于成熟的生产环境。
1000台机器以上的集群,属于超大规模集群了,适用于大规模生产环境。
内存:16~128G
CPU:2*(8~24)核处理器
硬盘:1TB-SATA硬盘+1个元数据备份盘(转速7200R/MIN+)能使用固态更好。
网卡:2*1GB网卡
为了有更好的性能,所有的元数据都缓存在内存中,因此内存需要拥有较快的速度和较好的质量。大内存意为着可以存储更多的文件,从而支持NameNode更大的命名空间。同时NameNode不需要很大的磁盘,小容量的磁盘就可以满足需求,元数据要存储加载到内存中,数据副本以及修改日志存储在磁盘上。
可以运行在NameNode机器上,也可以运行在单独的机器上。硬件配置和NameNode一直,因为只是用于作业分发,因此不需要较大的磁盘和较强的运算能力。
实际的数据存储于这些节点,因此这些节点需要较大的存储和较强的运算能力。较小的集群可以使用一般的磁盘,内存和CPU,如果集群规模较大,可以考虑:
内存:16~128G
CPU:2*(8~24)核处理器
硬盘:2TB,转速7200
网卡:2*1GB
备选资源:
内存:64~512GB
硬盘:1TB~4TB
CPU:2*(8~24)核CPU,主频2~2.5GHZ
网卡:千、万兆以太网
工作负载核心,推荐DataNode配置为双CPU插槽,配置中等主频的CPU,高端CPU太烧钱,所以我们可以增加数量。
耐热性,稳定。
需要足量的内存以保证不需要等待数据频繁的装载到内存中,因此8~48G内存比较合适,HBase会使用大量的内存,将文件存放在内存中(如果开启了内存表的话),对于HBase集群,我们需要比单独的Hadoop集群更大的内存。如果HBase开启缓存,Hbase会尝试将整张表缓存在内存中。
不建议在某台机器上配置很大容量的磁盘,这样当这台机器出现问题,不容易将数据分散到其他机器节点中。必须不能低于SATA7200转
Hadoop或者HBase在执行任务,读取数据和写入数据时,会在节点之间传输数据块,因此建议配置高速的网络和交换机。对于中小集群,1GB/s的网络足矣。对于排序和shuffle这类操作,需要节点间传输大量数据,如果带宽不足,会导致一些节点连接超时,比如RegionServer、Zookeeper。
运算公式:T=(S*R)*1.25
尖叫提示:
S表示存储数据量
R表示副本数
T表示整个集群需要的空间
HRegionServer保存着meta表以及表数据,要访问表数据,首先Client先去访问zookeeper,从zookeeper里面获取meta表所在的位置信息,即找到这个meta表在哪个HRegionServer上保存着。
接着Client通过刚才获取到的HRegionServer的IP来访问Meta表所在的HRegionServer,从而读取到Meta,进而获取到Meta表中存放的元数据。
Client通过元数据中存储的信息,访问对应的HRegionServer,然后扫描所在HRegionServer的Memstore和Storefile来查询数据。
最后HRegionServer把查询到的数据响应给Client。
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一分为二。
当MemStore达到阈值,将Memstore中的数据Flush进Storefile
涉及属性:
:134217728
即:128M就是Memstore的默认阈值
:0.4
即:这个参数的作用是当单个HRegion内所有的Memstore大小总和超过指定值时,flush该HRegion的所有memstore。RegionServer的flush是通过将请求添加一个队列,模拟生产消费模式来异步处理的。那这里就有一个问题,当队列来不及消费,产生大量积压请求时,可能会导致内存陡增,最坏的情况是触发OOM。
:0.38
即:当MemStore使用内存总量达到
指定值时,将会有多个MemStoresflush到文件中,MemStoreflush顺序是按照大小降序执行的,直到刷新到MemStore使用内存略小于lowerLimit
把小的Memstore文件合并成大的Storefile文件。
当Region达到阈值,会把过大的Region一分为二。
$tar-zxf/opt/softwares/hbase+hadoop_~/.m2/
详见项目代码
执行命令:
$bin/hbasemapredcp
出现如下内容:
$exportHBASE_HOME=/opt/modules/cdh//$exportHADOOP_HOME=/opt/modules/cdh/$exportHADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbasemapredcp`
*执行代码
$/opt/modules/cdh//bin/yarnjarlib/
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命令查看导入后的数据即可
将本地数据导入到HBase中
BulkLoad会将tsv/csv格式的文件编程hfile文件,然后再进行数据的导入,这样可以避免大量数据导入时造成的集群写入压力过大。
*减小HBase集群插入数据的压力
*提高了Job运行的速度,降低了Job执行时间
$exportHBASE_HOME=/opt/modules/cdh//$exportHADOOP_HOME=/opt/modules/cdh/$exportHADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbasemapredcp`
$bin/hbaseshell
hbase(main):001:0create'fruit_bulkload','info'
$/opt/modules/cdh//bin/yarnjar\
/opt/modules/cdh//lib/\
-=/output_file\
-=HBASE_ROW_KEY,info:name,info:color\
fruithdfs://:8020/input_fruit
上一步完成之后,你会发现在HDFS的根目录下出现了一个output_file文件夹,里面存放的就是HFile文件,紧接着:把HFile导入到HBase表fruit_bulkload
$/opt/modules/cdh//bin/yarnjar\
/opt/modules/cdh//lib/\
completebulkload/output_filefruit_bulkload
hbase(main):001:0scan‘fruit_bulkload’
版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。