吴超
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来做这些事儿的 到七分钟正好。 .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分钟都是讲的数据模型,从哪开始不知道。 .HBase的物理模型
2.1 HBase是适合海量数据(如20PB)的秒级简单查询的数据库。有人会觉得,他可以存储海量数据,感觉和hdfs没什么区别,有区别的,因为他是可以进行秒级简单查询的,hdfs做不到的,它要查询必须要走Map/Reduce。
那么我们的Hbase不也是建立在hdfs基础上,用Map/Reduce进行查询的吗,对,但是他有一套自己的物理模型。
我们的HBase的表能存储海量数据,那么,我们想一下 ,不管我们的算法多么的优秀,多么的先进,它只要随着数据了的变大,算法总是会出现一定的问题,因为我们对数据进行计算,必须通过两点,CPU和内存,外存这个东西就是做存储的
我们现时代,外存的容量远远大于内存,那么海量数据肯定是在外存中放的,那么我们关系型数据库中的算法在海量数据面前就无能为力了。为什么Hbase可以在海量数据面前做到秒级
查询呢,因为Hbase他对大数据量的数据表存储有 一个办法,HBase表中的记录,按照行键进行拆分, 拆分成一个个的region。
2.2 HBase表中的记录,按照行键进行拆分, 拆分成一个个的region。
Hbase表中的数据是按照行键的顺序物理存储的,也就是说你的这表已经排好序了,那么我们Hbase中的记录按照行键拆分,假设行健从0-,我们可以一万一万的拆,可以把一张表
拆成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是存储列簇的。)
博客中有对这个的详细描述,可以再仔细看一下。 .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中,相当于存储在很多的服务器上,所以是非常安全的。
.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
.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. 修改$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></value>
</property>
4.3 (可选)把文件regionservers的内容改为hadoop0,原来写的是localhost,不改也是可以的(这个文件的修改代表的是RegionServer所在的那个节点)
4.4 启动hbase,执行命令start-hbase.sh
******启动hbase之前,确保hadoop是运行正常的,并且可以写入文件*******
4.5 验证:()执行jps,发现新增加了3个java进程,分别是HMaster、HRegionServer、HQuorumPeer
()使用浏览器访问http://hadoop0:60010

HBase笔记的更多相关文章

  1. HBase笔记:对HBase原理的简单理解

    早些时候学习hadoop的技术,我一直对里面两项技术倍感困惑,一个是zookeeper,一个就是Hbase了.现在有机会专职做大数据相关的项目,终于看到了HBase实战的项目,也因此有机会搞懂Hbas ...

  2. Hbase笔记——RowKey设计

    一).什么情况下使用Hbase 1)传统数据库无法承载高速插入.大量读取. 2)Hbase适合海量,但同时也是简单的操作. 3)成熟的数据分析主题,查询模式确立不轻易改变. 二).现实场景 1.电商浏 ...

  3. HBase笔记--自定义filter

    自定义filter需要继承的类:FilterBase 类里面的方法调用顺序   方法名 作用 1 boolean filterRowKey(Cell cell) 根据row key过滤row.如果需要 ...

  4. HBase笔记--filter的使用

    HBASE过滤器介绍: 所有的过滤器都在服务端生效,叫做谓语下推(predicate push down),这样可以保证被过滤掉的数据不会被传送到客户端. 注意:        基于字符串的比较器,如 ...

  5. HBase笔记--编程实战

    HBase总结:http://blog.csdn.net/lifuxiangcaohui/article/details/39997205  (very good) Spark使用Java读取hbas ...

  6. HBase笔记--安装及启动过程中的问题

    1.使用hbase shell的时候运行命令执行失败 例如:在shell下执行 status,失败. 可能的原因:节点之间的时间差距过大 解决方法调整两个节点的时间,使二者一致,这里用了个比较笨的方法 ...

  7. HBase笔记6 过滤器

    过滤器 过滤器是GET或者SCAN时过滤结果用的,相当于SQL的where语句 HBase中的过滤器创建后会被序列化,然后分发到各个region server中,region server会还原过滤器 ...

  8. HBase笔记5(诊断)

    阻塞急救: RegionServer内存设置太小: 解决方案: 设置Region Server的内存要在conf/hbase-env.sh中添加export HBASE_REGIONSERVER_OP ...

  9. HBase笔记4(调优)

    Master/Region Server调优 JVM调优 默认的RegionServer内存是1G,而Memstore默认占40%,即400M,实在是太小了,可以通过HBASE_HEAPSIZE参数修 ...

  10. HBase 笔记3

    数据模型 Namespace 表命名空间: 多个表分到一个组进行统一的管理,需要用到表命名空间 表命名空间主要是对表分组,对不同组进行不同环境设定,如配额管理  安全管理 保留表空间: HBase中有 ...

随机推荐

  1. SYZOJ 186 [额]你猜是不是DP(哈希+二分答案+二分搜索)

      题目描述 现在给两个仅包含小写字母的字符串a,b ,求a 与b的最长公共连续子串的长度. 输入格式 两个字符串 输出格式 一个整数,为输入的两个字符串的最长公共连续子串的长度 测试样例 输入 qa ...

  2. BZOJ 3931 网络吞吐量(最短路+拆点最大流)

    3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 1607  Solved: 652 [Submit][St ...

  3. [HEOI2014][bzoj3611] 大工程 [虚树+dp]

    题面: 传送门 思路: 又是一道虚树入门级的题目,但是这道题的实际难点在于dp 首先,这道题是可以点分治做的,而且因为6s时限随便浪,所以写点分治也不是不可以 但是,dp因为$O\left(n\rig ...

  4. Redis集群_主从配置

    链接地址http://www.2cto.com/database/201502/377069.html 收藏备用. Redis主从配置(Master-Slave) 一. Redis Replicati ...

  5. 使用caffe测试自己的图片

    第一种方法是测试批量图片,使用caffe.bin即可,首先要做的是把你的jpg图片转换为LMDB的格式,如何转换呢?用/build/tools/convert_image --resize_width ...

  6. bzoj 2563 贪心 思想

    BZOJ2563阿狸和桃子的游戏   2563: 阿狸和桃子的游戏 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 952  Solved: 682[Su ...

  7. chrome浏览器警告:Failed to decode downloaded font:

    使用iconfont字体时chrome报错 Failed to decode downloaded font: 在服务器设置一下自己定义MIME类型. 扩展名: .woff Mime类型:applic ...

  8. Cannot map 'XXXController.Create' bean method

    [转 :http://www.fanfanyu.cn/news/staticpagefile/2351.html] 最近在开发项目的过程中SpringMVC抛了个"Ambiguous map ...

  9. linux之软硬链接【转】

    链接---------是一种在共享文件和访问它的用户的若干目录项之间建立联系的一种方法. Linux中包括两种链接:硬链接(Hard Link)和软链接(Soft Link),软链接又称为符号链接(S ...

  10. 【git】把本地项目和远程git仓库相连通

    1. 打开在你的项目文件夹,输入下面的命令 git init 输完上面的命令,文件夹中会出现一个.git文件夹,如下图所示,其他的的文件也会出现蓝色小问号的标志 2. 添加所有文件 git add . ...