文章目录

  • 一、HBase的起源
  • 二、HBase的概念
  • 三、HBase产生的背景
  • 四、HDFS与HBase的相关特点以及场景分析
    • HDFS的适用场景分析
    • HBase的适用场景分析
  • 五、HBase的存储结构
    • 行存储的优缺点
    • 列存储的优缺点
    • HBase的底层存储结构
    • 存储结构总结
  • 六、配套教程详解
    • 配套教程六之HBase集群的安装与配置
  • 七、常见错误总结
  • 文章总览

一、HBase的起源

前面我们已经学习了Hadoop的HDFS、YARN、MapReduce,而且也学习了Zookeeper,现在我们来学习HBase,在学习HBase之前,我们先来粗略看一篇文章:Hadoop 十年解读与发展预测(插图+排版),这篇文章详细讲解了Hadoop过去最开始的十年发展历史,非常值得我们学习。从中我们可以了解到,我们的Google当年发表了三篇很关键的论文,分别是叙述了GFS(Google File System)、MapReduce、Bigtable,从字面上来看,我们可以大概理解到,是讲解了Google的文件系统,MapReduce,还有一个是大表。其实,也正是这三篇论文,才有了之后Hadoop的发展,对Hadoop的起源起到非常关键的作用。HDFS的灵感正是来源于GFS,MapReduce也是由于谷歌的MapReduce论文。而这篇文章需要讲解的HBase的灵感,也是三篇论文里面的Bigtable。

二、HBase的概念

简单地了解了HBase的起源,我们再来看一下HBase的相关概念。
HBase(Hadoop Database):Apache HBase™ is the Hadoop database, a distributed, scalable, big data store.
从官网的概念来看,我们的HBase主要有几个特点:
1、the Hadoop database:HBase是基于Hadoop的数据库,所以跟Hadoop是有强依赖关系的,而实际上,我们的HBase底层是要依赖于HDFS的,我们HBase上的数据,其实就是存放在HDFS上,这个我们在后面会学习到。
2、distributed:分布式的,我们的HBase结构也是主从结构,类似于HDFS的主从结构,主从结构有利于我们对表、对数据进行处理。
3、scalable:可扩展的,自然而然,我们的HBase的数据存储在HDFS上,HDFS可以部署在廉价的机器上,而且理论上可以无限扩展。所以,HBase其实是具有这个特点的。
4、big data store:大数据量的存储,说明我们HBase可以存储很大的数据量,一张表可以达到数百万列,数十亿行,而传统数据库,在达到上百万行的时候,就要考虑进行读写分离、分库分表等操作了。

三、HBase产生的背景

在简单地了解了HBase的概念后,我们来看一下HBase产生的背景。

首先我们来想一个这样的情景,比如说我们现在要开发一个网站,开发好后要将网站程序打包到服务器上执行,而在运行你的网站前,应该先在你的服务器(如:Centos)装好数据库(如:MySQL、Redis、Oracle等等)。

我们应该都很清楚,我们的网站程序里面,我们的数据是以表的形式来存储和读取的,而这些表,就是我们数据类型里面的结构化数据。如果没有数据库,其实我们网站程序相关的数据也是可以存放在你的服务器系统上的,只是,你会发现特别麻烦,如果直接存到Linux,你可以通过简单的Select语句检索出你想要的数据吗?你能简单地用一句Update就修改里面相关条件的内容吗?你能够通过简单的聚合函数就做一些简单的分析吗?明显是不太容易操作的,当然也还有很多原因,我们只是简单地列举一下。

OK,我们现在回到我们的大数据相关知识。到目前为止,我们已经学过了HDFS,是一个分布式文件系统,我们的数据可以存放到我们的HDFS上。但是,如果我们要对数据进行一些快速查询、聚合分析等操作的时候,也一样是非常困难的,这点跟我们上面分析的场景相类似。

四、HDFS与HBase的相关特点以及场景分析

下面总结一下HDFS与HBase的相关特点以及场景分析,以便有一个更清晰的认识。

HDFS的适用场景分析

1、HDFS不适合大量小文件的存储。因为存储的文件的元数据是存放到Namenode所在机器的内存中的,HDFS中每个文件、目录、数据块占用150个字节左右。如果存放1百万的文件则至少需要消耗300MB内存,但是如果存放数10亿甚至更大的数据的时候,我们的内存就非常局限了,当然这也是相对的,如果是几万个小文件,那当然是没有问题的。
2、适合用于高吞吐量的访问,而不适合低延迟访问,做不到低延迟访问,操作时不是简单地在本地就可以实现,需要联系多台服务器,索引等等也是一个限制。所以,为了提高HDFS的性能,这里边就有了一个原则:尽可能地去移动计算而不是移动数据。在吞吐量很大的时候,我们的计算就相对更小,此时我们当然是移动我们的计算程序去其他节点会更节省资源。
3、适合流式数据访问,一个文件只能被一个用户写,不支持随机写入,只能在文件末尾append进去,或者直接覆盖掉。此外,我们的用户最好就是在访问的时候,尽量减少断开连接、建立连接的操作,因为此操作也是需要消耗性能的,最好就是做到一次建立了连接,一直访问、操作就好。流式数据访问,可以理解为就是一直都在访问,即一直都连接。
4、适合用于一次写入,多次读取,而且不适应用于低时间的访问。我们在进行写文件的时候需要涉及到多台服务器,那就存放RPC、数据传输等操作,非常消耗性能,所以最好就是存好在HDFS了就最好不要乱动了。而且有一点,HDFS的读取是按顺序读取的,不利于检索。

HBase的适用场景分析

理解完HDFS,我们来看一下HBase:
1、有利于处理各种类型的数据,如结构化数据、半结构化或者非半结构数据。
2、HBase是以稀疏的结构存储数据的,我们的数据是按列进行存储的,如果某一行的这一列没有数据,则不占用空间。
3、HBase支持多版本存储,默认是只存储一个版本,但是可以设置存多个版本,这个版本的索引是时间戳。
4、HBase支持随机读写,而HDFS只支持追加或者覆盖。

到目前为止,我们可以简单总结一下HBase的产生背景,我们都知道HDFS与HBase都是用来存储数据的,而HBase的出现,主要也是为了做一些HDFS做不到的。

五、HBase的存储结构

接下来,我们来看一下HBase的存储结构。
在开始讲结构之前,我们先来看一下百度百科里面的一句话:

HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。
——来自百度百科

高可靠性、高性能、可伸缩我们此处不做叙述,主要开一下面向列这一特性。
我们都知道,传统的数据库,比如说MySQL、Oracle,这些数据库都是按行存储的,而我们这里的HBase,是按列进行存储的。

行存储于列存储的比较:

行存储,数据按行存储在底层文件系统中。通常,每一行会被分配固定的空间。这就有个问题了,如果数据库里面没有存放你这个人的Phone或者Address,但是因为有你的ID、Name,那么你的Phone和Address其实也是占用空间的。

行存储的优缺点

优点:有利于增加、修改整行记录等操作,也有利于整行数据的读取操作。
缺点:单列查询时,会读取一些不必要的数据。比如你需要查找出数据库里面所有人的名字,则需要将所有数据都读取出来,然后将名字这一列检索出来。

列存储,数据以列为单位,存储在底层文件系统中,列是按照类似于文件夹这样的方式存储的。所以如果你要读取Name这一列,则直接把这个文件夹读取出来就行了,而不需要读取其他没关的数据。如果某个人的少了Address,那几不存就行了。

列存储的优缺点

优点:有利于面向单列数据的读取、统计等操作。
缺点:整行读取时,可能需要多次I/O操作。

HBase的底层存储结构

了解了列存储,我们来看一下HBase的存储结构。其实,我们的HBase是采用一种<key,value>的结构进行存储的,就好比我们前面看到的字段:ID、Name、Phone、Address,也都是有相对应的key,然后再检索到相对应的值的。其实如果有基础的读者应该也比较容易联想到我们的Map,其实就是键值对:<key,value>,我们的HBase也一样,其实也是由这个Map结构组成的。

首先我们先将HBase表的一些名字概念了解一下:

表名(Table):表名,跟传统数据库一样。
行键(Row Key):用来检索记录的主键,一行数据的主键。
列簇/列族(CF1、CF2):列的一个集合,而下面的列,其实可以当做是列簇的子列。
列(q1、q2):列,跟传统的列一样,但是,这里的列其实可有可无,只是列簇的子列而已,但是列簇一定不能少。
时间戳(TimeStamp):确定数据版本的索引。
上面五个名词是比较关键的名词,还有下面的Cell也是非常关键的。
Cell:由{Row Key, Column(= + ), Version}唯一确定的单元。由上面的图我们可以知道,一个行键,可以有很多数据,可以有很多列的数据。试想一下,如果我们知道了行键和列名,能确定一个真实的值了吗?其实还是不行的,那么还应该加上版本号,其实就是时间戳,这个时候才能真正确定一个数据,也就是说Cell相当于一个小小的单元。

了解完我们的一些名词概念后,我们来看一下HBase是怎样的Map结构,其实就是三个Map结构,就可以构成我们的HBase表。
首先第一个Map,我们将这个Map称之为Table,而表里面的key其实就是Row Key,一个又一个的key对应一个又一个的Row Key,而value,就对应Row Key所索引出来的数据,我们来看一下下面这张图:
比如说我们有一张snytable表,也就是这个Map对象是snytable。snytable里面有行健,对应下面的内容:

Map<key, value> 等价于
Map<Row Key, value>

而我们上面的value,其实也是一个Map<key, value>,而第二个Map里面的key,对应的是列簇。而value,又继续对应其他的内容,所以snytable可演变成:

Map<Row Key, value> 等价于
Map<Row Key, Map<Column Family, value>>

如果是传统数据库,如果知道了表名,还知道了id,还知道了列,其实我们就可以对数据进行增删改查了。而我们这里也知道了类似的信息,我们知道了表名,行键,列名,按道理已经是可以对数据进行增删改查了。但是,我们HBase还有一个重要的概念,那就是时间戳,它作为数据的版本存在,我们自然也不能少,不然,怎么知道你要修改哪个版本呢?!所以,我们继续演变,将我们的时间戳加进去:

Map<Row Key, Map<Column Family, value>> 等价于
Map<Row Key, Map<Column Family, Map<TimeStamp, value>>>

整理一下:

Map<Row Key, Map<Column Family, Map<TimeStamp, value>>>

这样,我们就可以很清晰地知道HBase的结构了。在这里,我们的结构没有加上列,是因为,我们在建表的时候,其实不需要列也是可以的,只需要有列簇即可,如果需要加上列,可以在Column Family后加上即可,如=> Column Family:name

为了让大家更好地理解,我这里边再解释一下,请看下面的图:

如上图,如果我们需要获取t1:Beijing的值,我们可以通过由key3确定某一行,然后根据PersonalInfo确定列,然后确定Address,再确定时间戳t1,就可以得到里面相对应的值了。简而言之,就是根据 {row key,column family,column name,timestamp}可以得到相应的value值。即:{key3,PersonalInfo,Address,t1}->Beijing。所有相应的值,都是以这样的KeyValue键值对形式确定的。

存储结构总结

此时此刻,请认真地回想一下我们前面所讲的内容,我们首先是建一张表,表是一个Map,Map是由key-value组成的,而行键是这个Map的key,也就是这行数据的索引,所以,我们的数据是一行一行的,我们可以称这个Map里面的每一对key-value为row;而第二个Map里面,Column Family作为这个Map的key,可以有很多个key,这里的Map是一列一列的,我们可以称这个Map里面的每一对key-value为clumn。

六、配套教程详解

配套教程六之HBase集群的安装与配置

教程:HBase集群的安装与配置
此教程主要有两个步骤:
一、解压、配置HBase
首先我们像之前的Zookeeper等一样,下载好安装包后解压安装包,然后进行配置文件设置,我们这里有三个配置文件需要配置:hbase-env.shregionservers
1、hbase-env.sh
与HDFS类似,我们的HBase也是由Java写的,所以我们要在此文件中配置好JAVA_HOME路径,然后,要在此文件中将HBase所依赖的Zookeeper设置成我们自己独立安装的Zookeeper,上一教程我们已经安装好了Zookeeper,我们设置成内置Zookeeper管理为false:
export HBASE_MANAGES_ZK=false
此外,我们还可以设置一下HBase的配置文件,将Hadoop的也配置上(如果不配置,也可以将Hadoop里面的配置文件拷贝到$HBASE/conf路径下,如拷贝hdfs-site.xml):
export HBASE_CLASSPATH=/usr/local/hadoop-2.7.5/etc/hadoop
2、regionservers
然后我们需要给HBase分配角色,与HDFS类似。
3、hbase-site.xml

  • 配置好HBase的数据存放到HDFS的什么路径
  • 配置成分布式集群的部署模式
  • 配置好依赖的Zookeeper

修改好之后,加上Master的环境变量,然后同步到slave1、slave2。

二、启动
启动HBase之前,要先启动三台服务器的Zookeeper,HDFS也要先启动,YARN可以不启动。最后再启动HBase,教程里面出现了几个问题,其实在我们平时的操作中是不会出现的,因为教程里面是在Docker里安装的,资源较少,容易出现问题。

PS:教程还没有空整理,目前只有一个安装的教程,后期会添加更加教程!

七、常见错误总结

1、未同步配置文件到slaves节点,修改好后忘记重启HBase
2、忘记先启动Zookeeper

文章总览

一、HBase的起源
二、HBase的概念
三、HBase产生的背景
四、HDFS与HBase的相关特点以及场景分析
HDFS的适用场景分析
HBase的适用场景分析
五、HBase的存储结构
行存储的优缺点
列存储的优缺点
HBase的底层存储结构
存储结构总结
六、配套教程详解
配套教程六之HBase集群的安装与配置
七、常见错误总结
文章总览

后期更精彩
HBase的Shell、Java API操作?
HBase关键理论之RowKey的设计原则?
通过实操理解HBase各服务进程的作用?
通过实操理解HBase表的结构组成?
通过实操理解Zookeeper在HBase集群里面的作用?
实际生产上的HBase性能调优(设计JVM)?
HBase HA的实现?

因为此文章仅根据个人了解,用白话形式记录,所以难免有些地方使用描述地不够恰当,甚至也会理解错误,恳请读者们指正,谢谢!我们努力提供更加友好的资料,不误导人。如果您想要加入我们,请与我们联系,谢谢。


作者简介:邵奈一
全栈工程师、市场洞察者、专栏编辑
| 公众号 | 微信 | 微博 | CSDN | 简书 |

福利:
邵奈一的技术博客导航
邵奈一 原创不易,如转载请标明出处。


浅显易懂入门大数据系列:四、HBase(超详细)相关推荐

  1. 浅显易懂入门大数据系列:一、HDFS(超详细)

    文章目录 一.Hadoop的诞生 Hadoop的定义及组成 HDFS产生的背景 背景下所面临的挑战 二.Hadoop概念及原理 HDFS应运而生 HDFS的存储特点 HDFS的架构特点 HDFS的架构 ...

  2. 浅显易懂入门大数据系列:二、MapReduce、YARN(超详细)

    文章目录 一.MapReduce概念及架构 MapReduce的定义 MapReduce的特点 MapReduce的架构 二.YARN的背景及架构 产生YARN的背景 YARN的架构 三.YARN的调 ...

  3. hive 如果表不存在则创建_从零开始学习大数据系列(四十七) Hive中数据的加载与导出...

    [本文大约1400字,阅读时间5~10分钟] 在<从零开始学习大数据系列(三十八) Hive中的数据库和表>和<从零开始学习大数据系列(四十二)Hive中的分区>文章中,我们已 ...

  4. 2022最新大数据学习路线,超详细

    IT行业技术更新太快了,上班已经很辛苦了,下班还要逼着自己去提升,唉,有什么办法呢~ 昨天有同学问我,有没有最新的大数据学习路线呢,他做Java有几年了,想晋升大数据开发方向,有基础有资料,不过没有系 ...

  5. 外部jar包_大数据系列之PySpark读写外部数据库

    本文以MySQL和HBASE为例,简要介绍Spark通过PyMySQL和HadoopAPI算子对外部数据库的读写操作 1.PySpark读写MySQL MySQL环境准备参考"数据库系列之M ...

  6. 政务大数据系列10:政务大数据的运营

    政务是个大市场,阿里.腾讯.电信.华为都在赔本赚吆喝.本文作者宇同学是资深从业人士,研发总监,他会写一系列文章来阐述政务云全景. 前面九篇分别深入阐述: 政务大数据的本质:< 浅谈政务大数据的本 ...

  7. 23篇大数据系列(二)scala基础知识全集(史上最全,建议收藏)

    作者简介: 蓝桥签约作者.大数据&Python领域优质创作者.管理多个大数据技术群,帮助大学生就业和初级程序员解决工作难题. 我的使命与愿景:持续稳定输出,赋能中国技术社区蓬勃发展! 大数据系 ...

  8. jdbc代码_凯哥带你从零学大数据系列之数据库篇---第三章:JDBC基础

    温馨提示:如果想学扎实,一定要从头开始看凯哥的一系列文章(凯哥带你从零学大数据系列),千万不要从中间的某个部分开始看,知识前后是有很大关联,否则学习效果会打折扣. 系列文章第一篇是拥抱大数据:凯哥带你 ...

  9. 大数据入门-大数据技术概述(一)

    目录 大数据入门系列文章 1.大数据入门-大数据是什么 一.概念 二.技术详解 1.基础架构:Hadoop 2.分布式文件系统:HDFS 3.数据仓库:Hive 4.存储引擎:Kudu 5.分布式数据 ...

最新文章

  1. 清除浮动(clearfix)
  2. A problem occurred starting process 'command '/home/jason/Android/Sdk/build-tools/23.0.3/aapt
  3. elasticsearch index 之 put mapping
  4. MapReduce的自制Writable分组输出及组内排序
  5. nodejs后台启动
  6. 2021暑假实习-SSM超市积分管理系统-day03笔记
  7. 12月25日服务器例行维护公告,12月25日维护公告 技能修改测试
  8. 如果我是推荐算法面试官,我会问哪些问题?
  9. 如何下载谷歌地图高程数据
  10. 华为手机老是android自动升级,华为手机系统怎么升级 华为手机升级系统的两种方法...
  11. 接口测试简介以及接口测试用例设计思路
  12. 计算机word简历制作教程,用word制作个人简历的方法
  13. ajax回调函数运用(由前端到后端代码全过程)
  14. 如何做好日程管理?实操介绍:不同角色的日程管理方法
  15. MySQL 日期字段时间加 1 毫秒
  16. 米老师经典语录————再造生命力
  17. 2021年中国工业互联网安全大赛
  18. 49. 把字符串转换成整数
  19. vue-cli实现多页面多路由
  20. 雅虎、百度、谷歌三大巨头比拼社区化搜索

热门文章

  1. 打包jar读取不到图片资源问题
  2. python实验室预约系统(基于xlsx表)(石山代码)
  3. Word转CHM方法
  4. MongoDB 3.6高可用集群(分片技术)
  5. dnf服务器是什么系统,什么云服务器可以挂的起dnf
  6. [整理]Unity3D游戏开发之Lua
  7. ccf--20150303--节日
  8. 好网站--中国代码网China-Code.Net-代码、源代码、源码下载网站
  9. iOS 项目中 网络请求Alamofire 的二次封装
  10. 建筑施工借助物联网卡保障高楼安全