Hbase笔记1-2

时间:2022-07-02 22:42:56

吴超
1.1 Hbase是Hadoop中的数据库,Hadoop还需要数据库吗?我们学的Hadoop是一个分布式的存储和计算的平台
为什么要在他上面建一个数据库呢,数据库是干什么的呢,数据库是一个管理系统(DBMS),用来管理数据的,也就是
说我们的数据是存储在磁盘中的,但是我们对这一部分的数据进行高效的查询操作的时候,那么你就得用数据库来做
,为啥呢,因为我们通常见的数据库都是关系型数据库,他是支持SQL的,SQL是一个非常强大的查询语言,Hadoop
存储的是海量数据,海量数据存储起来的目的是为了应用,我们的M/R就是搞应用的,但是M/R的特点是执行起来比较慢,
并且需要些大量的代码的,有点儿瓶颈(门槛儿)了,所以只有会JAVA的人和了解HadoopAPI的人才能用M/R。所以有了Hbase
Hbase是一个分布式存储系统,它的落脚点还是存储系统,就想我们的关系型数据库(RDBMS),它的落脚点是管理系统。
Hbase是基于Hadoop之上的,HBase利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据
这里需要注意两点,从现在开始,我们以后学到的各种框架,它的基础都是Hadoop,那么Hadoop存储是hdfs,如果你用hadoop的
存储必然要经过hdfs,如果我们要使用hdfs,我们必然要使用FileSystem的API,如果要对数据进行操作,就要用到M/R,也就是
说以后我们学到的框架都是利用hdfs和m/r的,就想以前学java web的时候,那些springMVC strust2 等等的,必然用到的是
javaweb中的servlet、filter、listener等等,这样最最基础的技术搭建起来的。只要谈及框架,必然要利用他们。我们说的
Habase也是利用hadoop的hdfs和m/r来做这些事儿的 到七分钟正好。

1.HBase(属于NoSQL)的数据模型(数据模型就是我们把数据交给Hbase,它是如何存储的呢,数据模型是最接近我们用户的,它下面还有一个体系结构,就是部署的模型。)
1.1 表(table),是存储、管理数据的。和Mysql中的表的意思是一样的,没有本质区别。
1.2 行键(row key),类似于MySQL中的主键。
行键是HBase表天然自带的,而Mysql中的主键是可有可无的。其实,看Hbase表中有几条记录,就是看行健的不同,有几个行键,就有几条记录。
1.3 列族(column family),列的集合,Mysql中没有与之对应的东西。
HBase中列族是需要在定义表时指定的,在定义表的时候不需要定义列,列是在插入记录时动态增加的。这和关系型数据库很不一样,关系型数据库在创建表的时候需要指定列,而且要指定列的长度和类型。
HBase表中的数据,每个列族单独一个文件。不管我们的HBase还是Mysql,表中的数据肯定都是存放在磁盘上,我们的数据是这么存放的呢,在Hbase中,他是一个列族一个文件,为什么不是一行一个文件呢,他就是按列划分的,哈哈
按行存储,适合一行一行的查询,或者说适合于查行中的很多记录,Hbase它有个不同,它再查询的时候,它喜欢查询某一些指定的列,也就是说他对查询条件要求不高,它只要求把某些列查询出来就可以了,按行查询却不是。我们想想
按行查询哪些地方限定的条件多,就是WHERE语句,WHERE语句那里变化是最多的,在那种语法中他就适合于按行查询,我们的Hbase是按列存储的,他就适合于查列,它对查哪些行要求不高,如果你就要求查行,那么它就不适合用Hbase来查询,
也就是说,不适合用Hbase来构建这种表结构
1.4 时间戳(timestamp,64位整数),列(也称作标签、修饰符)的一个属性。
行键和列确定的单元格,可以存储多个数据,每个数据含有时间戳属性,数据具有版本特性。
如果不指定时间戳或者版本,默认取最新的数据。
1.5 Hbase中存储的数据都是字节数组(不像关系型数据库,还区分时间类型、int类型、字符串类型,hbase不对这些做区分,它都作为字节数组存放)。
1.6 Hbase表中的数据是按照行键的顺序物理存储的(关系型数据库,是按照我们插入的先后顺序存储的)===>由于存储的数据都是字节数组,所以顺序是按照ASCII码排的。
1.7 表中的不同行可以拥有不同数量的成员。即支持“动态模式”模型。这样理解:表中的不同行,具有相同的列族,但是列族中的列是在
插入记录的时候动态增加的,也就是说有的行对应的列多,有的行对应的列少。

逻辑数据模型和物理数据模型
每一个列一个物理模型,PPT上有==>个人觉得物理数据模型就是如何真正的在磁盘上存储,就向上面说的一个列族一个文件,所以一个逻辑数据模型可以划分成多个物理数据模型,因为在逻辑数据模型中,有很多列族。

hbase上锁:上锁的范围是,只能对行上锁,对行的写操作是原子的。

到35分钟都是讲的数据模型,从哪开始不知道。

2.HBase的物理模型
2.1 HBase是适合海量数据(如20PB)的秒级简单查询的数据库。有人会觉得,他可以存储海量数据,感觉和hdfs没什么区别,有区别的,因为他是可以进行秒级简单查询的,hdfs做不到的,它要查询必须要走Map/Reduce。
那么我们的Hbase不也是建立在hdfs基础上,用Map/Reduce进行查询的吗,对,但是他有一套自己的物理模型。
我们的HBase的表能存储海量数据,那么,我们想一下 ,不管我们的算法多么的优秀,多么的先进,它只要随着数据了的变大,算法总是会出现一定的问题,因为我们对数据进行计算,必须通过两点,CPU和内存,外存这个东西就是做存储的
我们现时代,外存的容量远远大于内存,那么海量数据肯定是在外存中放的,那么我们关系型数据库中的算法在海量数据面前就无能为力了。为什么Hbase可以在海量数据面前做到秒级
查询呢,因为Hbase他对大数据量的数据表存储有 一个办法,HBase表中的记录,按照行键进行拆分, 拆分成一个个的region。
2.2 HBase表中的记录,按照行键进行拆分, 拆分成一个个的region,一个Region中有多行数据。
Hbase表中的数据是按照行键的顺序物理存储的,也就是说你的这表已经排好序了,那么我们Hbase中的记录按照行键拆分,假设行健从0-100000,我们可以一万一万的拆,可以把一张表
拆成10个Region,拆成Region有什么用呢,许多个region存储在region server(单独的物理机器)中的。换句话说,就是我们这一个表中的数据,被拆分成很多的region,region就放在不同的regionserver中。但是问题是,如果我们要查询的数据被分配在了很多的RegionServer中,那么我要
查的话,岂不是要从很多台机器上分别的查,对,确实是从10台机器上分别查,但是要看如何分别的查,它是根据行键的范围,看你要查询的记录在那几个region上,然后把查询的算法同时发送到这几个region所在的regionServer中,意味着并行查询。
这样,对表的操作转化为对多台region server的并行查询。 这又回到了我们hadoop分布式计算的路子上,这就是我们Hbase能胜任海量数据查询的原因。
region是Hbase最大的亮点,我们的region设置成多大比较合适呢,这个值是可以设置的,从源代码中查看(46分零8秒)。在源代码中,有一个hbase-default.xml,它有一个参数
hbase.hregion.max.filesize,默认为10G,超过这个值,就会分裂。这么理解,当我们表最初始的时候,也就是刚刚创建之后,只能有一个region,那么随着我们不断的插入记录,插的时候,我们是按行键的顺序物理存储的,那么
region会不断的变大,当region的大小超过了设定的这个值,10G,那么他就会分裂成两个,每个region就变小了,然后被发送到不同的RegionServer中,方便并行查询

不理解的地方:hbase-default.xml文件中的hbase.hregion.max.filesize属性,源码上描述的是HStoreFile的最大文件尺度,HStoreFile是存储列簇的,数据是按行拆分成Hregion的,所以一个Hregion应该有多个HStoreFile,而
hbase.hregion.max.filesize属性描述的又是HStoreFile的最大文件尺度,吴超所说的意思是,当我们的HRegion超过设定值的时候会分裂,明显不对啊,举一个极端情况,当我们的每一个HStoreFile都处在马上要超过,却没有
超过的时候,我们目的HRegion肯定是超过了这个HStoreFile的最大文件尺度,而我们的每一个HStoreFile并没有超过。所以不需要分裂。

源码中对hbase.hregion.max.filesize属性的描述: Maximum HStoreFile is size.If any one of a column families' HStoreFiles has grown to exceed this value,the
hosting HRegion is split in two.
翻译: hbase.hregion.max.filesize代表的是HStoreFile的最大文件尺度。如若任何一个列族的HStoreFile增长到超过设定值,
这个hosting HRegion 被分裂成两个。(hosting HRegion的意思是,HRegion包含HStoreFile,所以叫做hosting,从这里
我们也可以看出HStore是存储列簇的。)
博客中有对这个的详细描述,可以再仔细看一下。

3.HBase的体系结构
3.1 HBase是主从式结构,HMaster(主)、HRegionServer(从),一主多从。
虽然我们的hadoop也是主从结构,但是存在单点式问题,当我们的主(NameNode、JobTracker)DOWN的时候,我们的系统就DOWN了,我们的HBase有所改进,,可以有多个HMaster,但是在同一时间,只有一个在运行生效的,其他的是后备的。在
合适的时机他就会起来,比如原来的那个HMaster dwon了。这一点和NameNode、JobTracker不一样,NameNode、JobTracker,都只允许有一个,而且他俩要是down了,服务器就down了。
3.2 看PPT。补充:当RegionServer down机的时候(失效的RegionServer),master会把该RegionServer中的Region分配到其他机器上。
Hbase的表结构信息居然都交给Zookeeper管理,为什么不交给Mater管理呢,想一下这个问题, master作为一个主节点,存在单点问题,如果一个master DOWN了,我们通过
Zookeeper是的一个备用的Mater运行起来,虽然有备用的,但是DOWN的那个master它上面的数据怎么办,硬盘都坏了,数据肯定就都丢了,Zookeeper就是可以保证数据在Zookeeper
集群之间事务性一致,所以把数据存储在Zookeeper中,相当于存储在很多的服务器上,所以是非常安全的。
3.3HBase中有两张特殊的表
我们的HBase存储大数据的,HBase中的每张表,被分成多个Region,当我们的表变得很大的时候,就会被分成很多很多的Region,用户去查找的话这么查呢,如果一个表,他有10个
region他可以很快的找到,如果有上百万个region,这么办呢,他不能一个一个的去遍历吧,太麻烦了。怎么办呢,他有个表叫.META.,存储了用户的region信息,那么我们刚才
举例子的时候说是有成百上千个region,找很麻烦,你用这个.META.存,他就不麻烦了吗?要知道,我们的region里面存储的是行记录,行记录有什么特点呢,按照行键进行物理存储的
,也就是说我们通过什么就可以确定一个region呢,通过这个行键的开始和结束就可以确定一个region(PPT8,一个Region是由startkey和endkey表示的),也就是说,比如我们在.META.中记录用户表的时候,有成千上万个region,我们只需要
确定每一个region的行健的开始和结束就可以了。 用户要是找这个数据的话,我们只需要看在哪个region范围内, 就可以确定哪个region,是不是就可以去访问RegionServer上的制定region了,
如果存储的信息很多.META.也会很大,Hbase还有一种表叫-ROOT-,它存储的就是.META.中的region信息,他是一级一级存储的,那么要是-ROOT-中存储的数据也变得很大呢,HBase设计
的时候就没觉得-ROOT-会大成什么样,所以不会有更多的表。
所以用户访问的时候会首先去找Zookeeper,通过Zookeeper去找-ROOT-( Zookeeper中记录了-ROOT-表的location),然后找.META.,然后再去找RegionServer中的region

ppt13,里面有一个虚线上面的HBase,下面是Hadoop,HBase中的数据信息存放在Hadoop中。

视频2
4.HBase伪分布安装
4.1 解压缩、重命名、设置环境变量
环境变量:export HBASE_HOME=/usr/local/hbase
$HBASE_HOME/bin:
source /etc/profile
4.2 修改配置文件(把配置文件修改成适合伪分布的模式)
4.2.1修改$HBASE_HOME/conf/hbase-env.sh,修改内容如下(共两处):
export JAVA_HOME=/usr/local/jdk(把这一项改为我们机器上的JDK安装的目录)
export HBASE_MANAGES_ZK=true 这一项在文件的最后面(意思是Hbase是否要管理它自己的ZooKeeper实例,也就是说这个Zookeeper实例,是可以自己启动管理的,我们选成true,意思就是Hbase自己启动一个Zookeeper实例,让它来管理)
4.2.2 修改$HBASE_HOME/conf/hbase-site.xml,修改内容如下:
<property>
<name>hbase.rootdir</name> 设置Hbase根目录,上一节中已经讲过了,HBase中的数据信息(包括数据库、表等信息)是存放在Hadoop中的,但是它存放在Hadoop中的哪个目录中呢,我们需要设置一下Hbase在Hadoop中的根目录。
<value>hdfs://hadoop0:9000/hbase</value> 这个根目录用户可以自己定义,这里设置到了hdfs文件系统的/hbase
</property>
<property>
<name>hbase.cluster.distributed</name> 设置Habase是否是要安装到分布式的集群环境中,虽然我们这里是为分布的,但也是分布在集群环境中。
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name> 设置ZooKeeper节点在哪台机器上,我们前面设置了Hbase自己管理自己的ZooKeeper实例,那么ZooKeeper所在节点一定是Hbase安装的节点一定是同一个。
<value>hadoop0</value>
</property>
<property>
<name>dfs.replication</name>设置副本数
<value>1</value>
</property>
4.3 (可选)把文件regionservers的内容改为hadoop0,原来写的是localhost,不改也是可以的(这个文件的修改代表的是RegionServer所在的那个节点)
4.4 启动hbase,执行命令start-hbase.sh
******启动hbase之前,确保hadoop是运行正常的,并且可以写入文件*******
4.5 验证:(1)执行jps,发现新增加了3个java进程,分别是HMaster、HRegionServer、HQuorumPeer
(2)使用浏览器访问http://hadoop0:60010