HBase笔记
吴超
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笔记的更多相关文章
- HBase笔记:对HBase原理的简单理解
早些时候学习hadoop的技术,我一直对里面两项技术倍感困惑,一个是zookeeper,一个就是Hbase了.现在有机会专职做大数据相关的项目,终于看到了HBase实战的项目,也因此有机会搞懂Hbas ...
- Hbase笔记——RowKey设计
一).什么情况下使用Hbase 1)传统数据库无法承载高速插入.大量读取. 2)Hbase适合海量,但同时也是简单的操作. 3)成熟的数据分析主题,查询模式确立不轻易改变. 二).现实场景 1.电商浏 ...
- HBase笔记--自定义filter
自定义filter需要继承的类:FilterBase 类里面的方法调用顺序 方法名 作用 1 boolean filterRowKey(Cell cell) 根据row key过滤row.如果需要 ...
- HBase笔记--filter的使用
HBASE过滤器介绍: 所有的过滤器都在服务端生效,叫做谓语下推(predicate push down),这样可以保证被过滤掉的数据不会被传送到客户端. 注意: 基于字符串的比较器,如 ...
- HBase笔记--编程实战
HBase总结:http://blog.csdn.net/lifuxiangcaohui/article/details/39997205 (very good) Spark使用Java读取hbas ...
- HBase笔记--安装及启动过程中的问题
1.使用hbase shell的时候运行命令执行失败 例如:在shell下执行 status,失败. 可能的原因:节点之间的时间差距过大 解决方法调整两个节点的时间,使二者一致,这里用了个比较笨的方法 ...
- HBase笔记6 过滤器
过滤器 过滤器是GET或者SCAN时过滤结果用的,相当于SQL的where语句 HBase中的过滤器创建后会被序列化,然后分发到各个region server中,region server会还原过滤器 ...
- HBase笔记5(诊断)
阻塞急救: RegionServer内存设置太小: 解决方案: 设置Region Server的内存要在conf/hbase-env.sh中添加export HBASE_REGIONSERVER_OP ...
- HBase笔记4(调优)
Master/Region Server调优 JVM调优 默认的RegionServer内存是1G,而Memstore默认占40%,即400M,实在是太小了,可以通过HBASE_HEAPSIZE参数修 ...
- HBase 笔记3
数据模型 Namespace 表命名空间: 多个表分到一个组进行统一的管理,需要用到表命名空间 表命名空间主要是对表分组,对不同组进行不同环境设定,如配额管理 安全管理 保留表空间: HBase中有 ...
随机推荐
- Redis集群_主从配置
链接地址http://www.2cto.com/database/201502/377069.html 收藏备用. Redis主从配置(Master-Slave) 一. Redis Replicati ...
- 二叉树节点个数,叶子个数,第K层个数,最低公共节点
1. 节点个数 function getNodeNum(root){ if(root == null){ return 0; } //+1为root的计数 return getNodeNum(root ...
- 序列操作(bzoj 1858)
Description lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0 ...
- UVA1218 Perfect Service
Time Limit: 3000MS 64bit IO Format: %lld & %llu /*by SilverN*/ #include<iostream> #inc ...
- 【HDOJ5514】Frogs(容斥原理)
题意:n个青蛙在一个有m个节点的圆上跳,m个节点的标号为0-m-1,每只青蛙每次跳的节点数给出,让求n只青蛙所跳位置标号之和 n<=1e4,m<=1e9,a[i]<=1e9 思路:由 ...
- WML标签速查手册 wap标签
原文发布时间为:2010-08-19 -- 来源于本人的百度文章 [由搬家工具导入] WML标签速查手册(转)比较方便便于速查 结构相关标签 语法及属性 <wml> <wml x ...
- group by having执行顺序
原文发布时间为:2009-07-28 -- 来源于本人的百度文章 [由搬家工具导入] 核心原理 where>group>having>order by 只有深入理解这些语句执行的过程 ...
- SQLServer Split
ALTER FUNCTION dbo.splitl ( @String VARCHAR(MAX), @Delimiter VARCHAR(MAX) ) RETURNS @temptable TABLE ...
- Atcoder CODE FESTIVAL 2017 qual C C - Inserting 'x' 回文串
题目链接 题意 给定字符串\(s\),可以在其中任意位置插入字符\(x\). 问能否得到一个回文串,若能,需插入多少个\(x\). 思路 首先统计出现次数为奇数的字符\(cnt\). \(cnt\ge ...
- 转 c++多线程编程
c++多线程编程 一直对多线程编程这一块很陌生,决定花一点时间整理一下. os:ubuntu 10.04 c++ 1.最基础,进程同时创建5个线程,各自调用同一个函数 #include <io ...