一幅长文细学华为MRS大数据开发(四)——HBase

4 HBase

摘要:HBase是一种非关系型数据库,它是基于谷歌BigTable的开源实现,和BigTable一样,支持大规模海量数据的存储,对于分布式并发数据处理的效率极高,易于扩展且支持动态伸缩,适用于廉价设备。HBase实际上就是一个稀疏、多维、持久化的映射表,它采用行键、列和时间戳即可轻松锁定数据,每个数据都是未经解释的字符串,在本文中我们都会具体学习。

在本文中我们会谈及HBase系统架构、相关概念、关键流程、突出特点、性能优化以及基本shell操作。

作者:来自ArimaMisaki创作

文章目录

  • 4 HBase
    • 4.1 HBase基本介绍
    • 4.2 HBase应用场景
    • 4.3 HBase数据模型
      • 4.3.1 数据模型基本概念
      • 4.3.2 数据存储视图
      • 4.3.3 行存储和列存储
    • 4.4 HBase架构
      • 4.4.1 基本架构
      • 4.4.2 存储架构
      • 4.4.3 Region的定位
      • 4.4.4 HMaster高可用
      • 4.4.5 RegionServer
    • 4.5 HBase关键流程
    • 4.6 HBase的特点
      • 4.6.1 多File的影响
      • 4.6.2 Compaction
      • 4.6.3 OpenScanner
      • 4.6.4 BloomFilter
    • 4.7 HBase性能优化
      • 4.7.1 行键
      • 4.7.2 构建二级索引
    • 4.8 HBase常用shell命令

4.1 HBase基本介绍

说明:HBase是谷歌BigTable的开源实现,是一个高可靠、高性能、面向列、可伸缩的分布式存储系统。

特点

  • 适合于存储大表数据,并且对大表数据的读写访问可以达到实时级别。
  • 利用Hadoop作为其文件存储系统,提供实时读写的分布式数据库系统。
  • 利用ZooKeeper作为协同服务。

与传统数据库的对比

  • 数据索引:关系数据库通常可以针对不同列构建复杂的多个索引以提高数据访问性能。HBase只有一个索引——行键,通过巧妙的设计,HBase所有的访问方法或者通过行访问,或者通过行键扫描,从而使得整个系统不会慢下来。
  • 数据维护:在关系数据库中,更新操作会用最新的当前值去替换记录中原来的旧值,

4.2 HBase应用场景

特点

  • 海量数据存储
  • 不需要完全拥有传统关系型数据库所具备的ACID特性
  • 高吞吐量
  • 需要在海量数据中实现高效的随机读取
  • 需要很好的性能压缩能力
  • 能够同时处理结构化和非结构化的数据

image-20220830164419053


4.3 HBase数据模型

4.3.1 数据模型基本概念

说明

  • 简单来说,应用程序式以表的方式在HBase存储数据
  • 表由行和列构成,所有列都是属于某一个列族的。
  • 行和列的交叉点称之为cell(单元格),cell是版本化的,其内容是不可分割的字节数组。
  • 表的行键也是一段字节数组,所以任何东西都可以保存进去,无论是字符串还是数字。
  • HBase的表都是按key排序的,排序方式是针对字节的
  • 所有的表都必须要有主键key。

:Hbase采用表来组织数据,表由行和列组成,列划分为若干个列族。

:每个Hbase表由若干行组成,每个行有一个行键(row key)。

列族:一个Hbase表被分组为许多的列族(Column Family)的集合,它是基本的访问控制单元。

列限定符(列):列族里的数据通过列来定位。

单元格:在Hbase表中,通过行、列族和列限定符确定一个单元格,单元格存储的数据没有数据类型,总被视为字节数组byte[]。

时间戳:每个单元格都保存着同一份数据的多个版本,这些版本用时间戳进行索引。

image-20220830165202694


4.3.2 数据存储视图

说明:在HBase中,列是可以为空的,因此表可以看成是一个稀疏的行集合。但在物理视图中,它并没有列的概念,其根据列族来存储,新的columns可以不仅过声明直接加入一个列族。换而言之,下面这个图在物理视角中,列是不存在的,所谓的列名都是概念而已,当我们要把Tom存储入表时,应该是以info.name.Tom存入表中的info列族。

image-20220830165202694


4.3.3 行存储和列存储

行存储:数据按行存储在底层文件系统中,且每一行会被分配固定的空间,如关系数据库的元组,元组都代表现实世界中的某个实例,按照行的方式来存储。

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

行存储缺点:单列查询时,会读取一些不必要的数据

image-20220830170843669

列存储:数据按列为单位进行存储在底层文件系统中,如非关系数据库HBase。

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

缺点:整行读取时,可能需要多次IO操作

误区说明:有很多人会误以为列存储是将元组按列的方式存储,实际并不是这个样子。表中元组实际上在列族数据库别无二致,不同的是,当我们需要找到某个人的某个电话时,我们需要现在数据库中找到该元组,并投影出它的电脑号码;但在列族数据库中,我们直接找到电话号码那一列全部拿出即可。


4.4 HBase架构

4.4.1 基本架构

说明

  • 主服务器HMaster负责管理和维护HBase表的分区信息,维护HRegionServer列表,分配Region负载均衡。
  • HRegionServer负责存储和维护分配给自己的Region,处理来自客户端的读写请求。
  • 客户端并不是从HMaster主服务器上读取数据,而是在获得Region的存储位置信息后,直接从HRegionServer上读取数据。
  • 客户端并不依赖HMaster,而是通过Zookeeper来获得Region位置信息,大多数客户端设置从来不喝HMaster通信,这种设计方式使得HMaster负载很小。

image-20220831082434961


4.4.2 存储架构

说明:按照架构层级可以分为:

  • Table:HBase中的表
  • Region:根据表的起始Region和结束Region划分区域
  • Store:根据列族存储相应的region数据。
  • MemStore:缓存区,常用于临时读和临时写
  • StoreFile:根据Store将region数据存储到物理表上
  • Block:物理表最终落实到HDFS的Block中

:HBase表最开始只有一个Region,后来不断分裂

Region:Region拆分速度操作非常快,接近瞬间,因为拆分之后的Region读取的仍然是原存储文件,直到分裂过程结束,把存储文件异步地写到独立的文件之后,才会读取新文件。


4.4.3 Region的定位

三级模式:在Hadoop早期版本中,HBase的架构为三级模式,即通过Zookeeper来存储root表(其中包含最开始的Region),root表中记录了若干个Meta表,Meta表存储了若干个用户Region;当需要一个region时,需要经过三级模式。

两级模式

  • Region分为元数据Region和用户Region两类
  • 元数据Region(MetaRegion)记录了每一个UserRegion的路由信息
  • 读写Region数据的路由,包括以下几步:
    1. 找寻MetaRegion地址
    2. 由MetaRegion找寻UserRegion地址

说明:为了加快访问速度,Hbase:meta表被保存在内存中。假设Hbase:meta表的每行在内存中大约占用1kb,并且每个Region限制为128MB,则两层架构可以保存的Region数目是128MB/1KB=2172^{17}217个Region。

image-20220831080929390


4.4.4 HMaster高可用

说明:Zookeeper可以帮助选举一个Master作为集群的总管,并保证在任何时刻总有唯一一个Master在运行,这就避免了Master的单点失效问题。主服务器Master主要负责表和Region的管理工作。具体职能如下:

  • 管理用户对表的增加、删除、修改、查询等操作
  • 实现不同Region服务器之间的负载均衡
  • 在Region分裂或合并后,负责重新调整Region的分布
  • 对发生故障失效的Region服务器上的Region进行迁移

4.4.5 RegionServer

说明:RegionServer服务器是HBase中最核心的模块,其负责维护分配自己的Region和响应用户的读写请求,并且会利用心跳机制把自己的状态报告给Zookeeper。


4.5 HBase关键流程

用户读写数据过程:用户写入数据时,被分配到相应Region服务器去执行;用户数据首先被写入到MemStore和Hlog中,只有当操作写入Hlog之后,commit()调用才会将其返回给客户端;若用户想要读取数据,Region服务器会首先访问MemStore缓存,如果找不到再到上面的StoreFile中寻找。

缓存的刷新:系统会周期性地把MemStore缓存里的内容刷写到磁盘的StoreFile文件中,清空缓存,并在Hlog里面写入一个标记;每次刷写都生成一个新的StoreFile文件,因此,每个Store包含多个StoreFile文件;每个HRegionServer都有自己的Hlog,每次启动都检查该文件,确认最近一次执行缓存刷新操作之后是否发生新的写入操作,如果发现更新,则先写入MemStore,再刷写到StoreFile,开始为用户提供服务。

StoreFile的合并:每次进行缓存的刷新时都会生成一个新的StoreFile,随着数量的增多挨个查找StoreFile会影响查找的速度。为此,调用Store.compact()可以把多个StoreFile合并为一个;合并操作比较耗费资源,一般不会随便调用,而是当数量达到了某个阈值才启动合并。

Store工作原理:Store是Region服务器的核心。多个StoreFile可以通过Store.compact()合并成一个,但StoreFile过大时又可以触发分裂操作,将一个父Region分裂为两个子Region。

Hlog工作原理:分布式环境必须要考虑系统出错,故在HBase中采用Hlog保证系统的恢复;在HBase系统中为每个Region服务器配置了一个Hlog文件,它是一种预写式日志,用户更新数据必须首先写入日志后,才能写入MemStore缓存,并且,只有当MemStoreH对应的log已经写入磁盘后,该缓存内容才能被刷写到磁盘;一旦RegionServer发生故障,Zookeeper会通过心跳机制检测到其状态,而后通知HMaster。HMaster首先会处理故障RegionServer上遗留的Hlog,根据Hlog上的记录和Region的对应关系对Hlog文件进行拆分,拆分后的Hlog文件分散到Region的目录下,Region服务器领取到对应的Hlog文件和Region后,Region服务器会根据Hlog重新做一遍数据操作。


4.6 HBase的特点

4.6.1 多File的影响

说明:随着File数量的增多,HBase读取的时延会变大。

image-20220831085552329


4.6.2 Compaction

说明:由于多File带来的影响,采用压缩(Compaction)变得尤为重要。Compaction的目的是为了减少同一个Region中同一个ColumnFamily下面的小文件的数目,从而提升读取的性能。

Compaction分为两种,即MinorMajor。Minor压缩是一种小范围的压缩,它的压缩数目有固定的区间限制,通常采用这种压缩是压缩一些连续时间范围的小文件,且选取压缩文件时遵循一定的算法;Major压缩则涉及该Region下整个列族下面所有的HFile文件。

提示:压缩的时候不能读写数据。

image-20220831090125327


4.6.3 OpenScanner

说明:OpenScanner的过程中,会创建两种不同的Scanner来读取Hfile、MemStore的数据,其中Hfile对应的为StoreFileScanner,而MemStore对应的Scanner为MemStoreScanner。


4.6.4 BloomFilter

说明:BloomFilter用来优化一些随机读取的场景,即通过get命令读取数据时的场景。它可以用来快速的判断一条用户数据在一个大的数据集合中是否存在。BloomFilter在判断一个数据是否存在时,拥有一定的误判率。但对于“用户数据 xxx 不存在”的判断结果是可信的;对于HBase的BloomFilter的相关数据,其被保存在HFile中。


4.7 HBase性能优化

4.7.1 行键

说明:行键是按照字典序存储,因此在设计行键时,要充分利用排序特点,将经常一起读取的数据存储到一块,将最近可能会被访问的数据放在一块。


4.7.2 构建二级索引

访问方式:访问HBase表中的行有三种方式:

  • 通过单个行键访问
  • 通过行键区间访问多个行
  • 全表扫描

说明:HBase只有一个针对行键的索引,为了提高访问速度我们可以构建二级索引,如:

  • 多个表索引
  • 多个列索引
  • 基于部分列值的索引

4.8 HBase常用shell命令

# 获取帮助
help
# 获取命令的详细信息
help 'status'
# 查看服务器状态
status
# 查看版本信息
version
# 查看所有表
list
# 创建表
create ‘表名称’, ‘列族名称 1’,‘列族名称 2’,‘列名称 N’
# 查看表的基本信息
desc ‘表名’
# 禁用表
disable 'Student'
# 检查表是否被禁用
is_disabled 'Student'
# 启用表
enable 'Student'
# 检查表是否被启用
is_enabled 'Student'
# 查看表是否存在
exists 'Student'
# 删除表前需要先禁用表
disable 'Student'
# 删除表
drop 'Student'
# 插入数据
put ‘表名’, ‘行键’,‘列族:列’,‘值’
# 添加列
alter ‘表名’, ‘列族名’
# 删除列族
alter ‘表名’, {NAME => ‘列族名’, METHOD => ‘delete’}
# 获取指定行中所有列的数据信息
get 'Student','rowkey3'
# 获取指定行中指定列族下所有列的数据信息
get 'Student','rowkey3','baseInfo'
# 获取指定行中指定列的数据信息
get 'Student','rowkey3','baseInfo:name'
# 删除指定行
delete 'Student','rowkey3'
# 删除指定行中指定列的数据
delete 'Student','rowkey3','baseInfo:name'
# 获取指定行中所有列的数据信息
get 'Student','rowkey3'
# 获取指定行中指定列族下所有列的数据信息
get 'Student','rowkey3','baseInfo'
# 获取指定行中指定列的数据信息
get 'Student','rowkey3','baseInfo:name'
# 查询整表数据
scan 'Student'
# 查询指定列簇数据
scan 'Student', {COLUMN=>'baseInfo'}
# 查询指定列的数据
scan 'Student', {COLUMNS=> 'baseInfo:birthday'}
# 采用BloomFilter指定条件过滤
scan 'Student', FILTER=>"ValueFilter(=,'binary:24')"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398407.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AOP技术基础

1、引言2、AOP技术基础 3、Java平台AOP技术研究4、.Net平台AOP技术研究2.1 AOP技术起源 AOP技术的诞生并不算晚,早在1990年开始,来自Xerox Palo Alto Research Lab(即PARC)的研究人员就对面向对象思想的局限性进行了分析。他们研…

TCP 协议的三次握手、四次分手

详细描述了 TCP 协议的连接和关闭的整个过程。解释了为什么 TCP 协议是面向连接的、可靠的数据传输协议。 TCP 在互联网上之间的通信交流,一般是基于 TCP (Transmission Control Protocol,传输控制协议) 或者 UDP (User Datagram Protocol,用…

[Bzoj4182]Shopping(点分治)(树上背包)(单调队列优化多重背包)

4182: Shopping Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 374 Solved: 130[Submit][Status][Discuss]Description 马上就是小苗的生日了,为了给小苗准备礼物,小葱兴冲冲地来到了商店街。商店街有n个商店,并且它们之间的道路构成了一…

Tiny框架2.0版火热推出

方法论 方法论决定了可以达到的高度 方法论,就是人们认识世界、改造世界的根本方法。 它是人们用什么样的方式、方法来观察事物和处理问题。概括地说,世界观主要解决世界“是什么”的问题,方法论主要解决“怎么办”的问题。 方法论是一种以解…

Java--Socket通信

下面内容是Java开发内容的高级知识点,需要对Java中的面向对象、IO、多线程、以及网络相关知识有一定的基础。(知识永远都有深度,本章节长期更新内容) 1、网络基础知识 网络通信的条件:1、两个通信的端都要有各自的IP地址作为唯一标识&#xf…

一幅长文细学华为MRS大数据开发(五)——MapReduce和Yarn

5 MapReduce和Yarn 摘要:本文中主要讲述大数据领域中最著名的批处理和离线处理计算框架——MapReduce,包括MapReduce的原理、流程、使用场景,以及Hadoop集群中负责统一的资源管理和调度的组件——Yarn。 作者:来自ArimaMisaki创作…

Tensorflow从入门到精通之——Tensorflow基本操作

前边的章节介绍了什么是Tensorflow,本节将带大家真正走进Tensorflow的世界,学习Tensorflow一些基本的操作及使用方法。同时也欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习、深度学习的知…

一幅长文细学Vue(七)——路由

7 路由 摘要:在本文中我们会谈及路由的知识点,了解前端路由工作的过程以及如何在Vue3中配置路由,知道怎么使用嵌套路由和实现动态路由匹配,以及使用编程式导航和导航守卫。 声明:为了文章的清爽性,在文章内…

Codeforces 913 二进制背包(柠檬水) 暴力贪心特殊背包(选题)

A B C 给你N(N<30)种水瓶每种水瓶有无限个 每个的体积是2^(i-1)价格是cost[i] 要求你花最少的钱弄出L体积的水 先从前到后扫一遍cost[i1]min(cost[i1],cost[i]*2) 再从后往前扫一遍cost[i]min(cost[i],cost[i1) 保证了价格的最优化 然后从0开始到30 如果二进制有当前体积的…

android baidupush

实战 QQ demo源码&#xff08;本例中有该应用&#xff09; 服务器端下载&#xff1a;http://download.csdn.net/download/knight_black_bob/9822551 android eclipse 版&#xff1a;http://download.csdn.net/download/knight_black_bob/9822553 android stdio 版本&#xff1…

jQuery源码分析--Event模块(1)

jQuery的Event模块提供了强大的功能&#xff1a;事件代理&#xff0c;自定义事件&#xff0c;自定义数据等。今天记录一下它实现的原理。 我们都知道&#xff0c;在js的原生事件中&#xff0c;有事件对象和回调函数这两样东西。但是事件对象是只读的&#xff0c;所以jQuery就用…

JSP内置对象(9个常用的内置对象)

为什么80%的码农都做不了架构师&#xff1f;>>> 2012-08-06 1.request对象 客户端的请求信息被封装在request对象中&#xff0c;通过它才能了解到客户的需求&#xff0c;然后做出响应。它是HttpServletRequest类的实例。 序号 方 法 说 明 1 object getAttribute(S…

用户可计算型出题程序

此次程序是对上次程序的再次开发&#xff0c;我将自己视作另一个在开发者&#xff0c;在对自己前面程序进行再次审视时&#xff0c;有了别样的感受&#xff0c;自己写的程序&#xff0c;一定要为别人(也有可能是自己)留一条活路。闲话不多说&#xff0c;进入大家最喜欢的**环节…

使用React、Node.js、MongoDB、Socket.IO开发一个角色投票应用的学习过程(三)

前篇 使用React、Node.js、MongoDB、Socket.IO开发一个角色投票应用的学习过程&#xff08;一&#xff09;使用React、Node.js、MongoDB、Socket.IO开发一个角色投票应用的学习过程&#xff08;二&#xff09;原文第十三步&#xff0c;Express API路由 第一个路由是用来创建角色…

匿名方法,lambad表达式,匿名类

其实lambad表达式就是“函数”或者说是“方法”写法的一个进化&#xff0c;越来越简化而已&#xff0c;如数学方法里的f(X)。 匿名方法&#xff1a;顾名思义&#xff0c;匿名方法就是没有名称的方法&#xff0c;但是有定义参数。 匿名方法最明显的好处就是可以降低另写一个方法…

Python3.1-标准库之Numpy

这系列用来介绍Python的标准库的支持Numpy部分。资料来自http://wiki.scipy.org/Tentative_NumPy_Tutorial&#xff0c;页面有许多链接&#xff0c;这里是直接翻译&#xff0c;所以会无法链接。可以大致看完该博文&#xff0c;再去看英文版。 1、先决条件 想要运行numpy&#x…

黑马Android全套视频无加密完整版

课程描述&#xff1a;java基础到javaweb开发&#xff0c;从基础入门到实战。安卓基础到实战。实体班近5个月的课程实录&#xff01;&#xff01;&#xff01;课程表&#xff1a;xml&dom_sax_dom4j编程tomcat与web程序结构与Http协议与HttpUrlConnectionjava web之servletja…

强大的CSS3动画库animate.css

今天要给大家介绍一款强大的CSS3动画库animate.css&#xff0c;animate.css定义了大概50多种动画形式&#xff0c;包括淡入淡出&#xff0c;文字飞入、左右摇摆动画等等。使用animate.css也非常简单&#xff0c;你可以给页面上的任意元素&#xff0c;特别是文字添加各种神奇的动…

有关系统环境变量的设置问题

不知道各位朋友有没有想过这样用的问题&#xff0c;我们在使用windows使用在cmd下运行Ping、Netstat等之类的命令时&#xff0c;为什么可以使用呢&#xff1f; 这些后面牵涉到哪些东西呢&#xff1f; 我们今天就来介绍下有关这方面的知识。我们现在以win8作为测试对象&#xff…

linux下安装配置jdk(解压版)

在linux下登录oracle官网&#xff0c;下载解压版jdk 传送门系统默认下载到“下载”目录中创建要将该文件解压的文件夹&#xff1a;其中 -p 参数代表递归创建文件夹&#xff08;可以创建多级目录&#xff09; 进入到下载目录&#xff0c;将下载好的jdk解压到指定目录配置环境…