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

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 浅显易懂入门大数据系列:四、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,是按列进行存储的。


行存储于列存储的比较:


image.png

image.png


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


行存储的优缺点

优点:有利于增加、修改整行记录等操作,也有利于整行数据的读取操作。

缺点:单列查询时,会读取一些不必要的数据。比如你需要查找出数据库里面所有人的名字,则需要将所有数据都读取出来,然后将名字这一列检索出来。


image.png


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


列存储的优缺点

优点:有利于面向单列数据的读取、统计等操作。

缺点:整行读取时,可能需要多次I/O操作。


HBase的底层存储结构

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


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


image.png

image.png


表名(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


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


image.png


如上图,如果我们需要获取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.sh、regionservers

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的实现?


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


相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
&nbsp; 相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情:&nbsp;https://cn.aliyun.com/product/hbase &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
5月前
|
Java 大数据 分布式数据库
Spring Boot 与 HBase 的完美融合:探索高效大数据应用开发的新途径
【8月更文挑战第29天】Spring Boot是一款广受好评的微服务框架,以其便捷的开发体验著称。HBase则是一个高性能的大数据分布式数据库系统。结合两者,可极大简化HBase应用开发。本文将对比传统方式与Spring Boot集成HBase的区别,展示如何在Spring Boot中优雅实现HBase功能,并提供示例代码。从依赖管理、连接配置、表操作到数据访问,Spring Boot均能显著减少工作量,提升代码可读性和可维护性,使开发者更专注业务逻辑。
310 1
|
4月前
|
存储 分布式计算 分布式数据库
深入理解Apache HBase:构建大数据时代的基石
在大数据时代,数据的存储和管理成为了企业面临的一大挑战。随着数据量的急剧增长和数据结构的多样化,传统的关系型数据库(如RDBMS)逐渐显现出局限性。
610 12
|
5月前
|
分布式计算 资源调度 Hadoop
Hadoop入门基础(五):Hadoop 常用 Shell 命令一网打尽,提升你的大数据技能!
Hadoop入门基础(五):Hadoop 常用 Shell 命令一网打尽,提升你的大数据技能!
|
5月前
|
分布式计算 大数据 分布式数据库
"揭秘HBase MapReduce高效数据处理秘诀:四步实战攻略,让你轻松玩转大数据分析!"
【8月更文挑战第17天】大数据时代,HBase以高性能、可扩展性成为关键的数据存储解决方案。结合MapReduce分布式计算框架,能高效处理HBase中的大规模数据。本文通过实例展示如何配置HBase集群、编写Map和Reduce函数,以及运行MapReduce作业来计算HBase某列的平均值。此过程不仅限于简单的统计分析,还可扩展至更复杂的数据处理任务,为企业提供强有力的大数据技术支持。
92 1
|
5月前
|
SQL 存储 分布式计算
MaxCompute 入门:大数据处理的第一步
【8月更文第31天】在当今数字化转型的时代,企业和组织每天都在产生大量的数据。有效地管理和分析这些数据变得至关重要。阿里云的 MaxCompute(原名 ODPS)是一个用于处理海量数据的大规模分布式计算服务。它提供了强大的存储能力以及丰富的数据处理功能,让开发者能够快速构建数据仓库、实时报表系统、数据挖掘等应用。本文将介绍 MaxCompute 的基本概念、架构,并演示如何开始使用这一大数据处理平台。
755 0
|
5月前
|
分布式计算 大数据 Java
Scala 入门指南:从零开始的大数据开发
Scala 入门指南:从零开始的大数据开发
|
6月前
|
存储 NoSQL 大数据
大数据存储:HBase与Cassandra的对比
【7月更文挑战第16天】HBase和Cassandra作为两种流行的分布式NoSQL数据库,在数据模型、一致性模型、数据分布、查询语言和性能等方面各有千秋。HBase适用于需要强一致性和与Hadoop生态系统集成的场景,如大规模数据处理和分析。而Cassandra则更适合需要高可用性和灵活查询能力的场景,如分布式计算、云计算和大数据应用等。在实际应用中,选择哪种数据库取决于具体的需求和场景。希望本文的对比分析能够帮助读者更好地理解这两种数据库,并做出明智的选择。
|
6月前
|
存储 SQL 机器学习/深度学习
阿里云数加大数据计算服务MaxCompute学习路线图:从入门到精通
将所学知识应用于实际工作中并不断进行实践和创新是提升技术能力的关键所在。用户可以结合业务需求和技术发展趋势积极探索新的应用场景和解决方案,并在实践中不断总结经验和教训以提升自己的技术水平和实践能力。
|
2月前
|
存储 分布式计算 数据挖掘
数据架构 ODPS 是什么?
数据架构 ODPS 是什么?
436 7
|
2月前
|
存储 分布式计算 大数据
大数据 优化数据读取
【11月更文挑战第4天】
59 2