NoSQL笔记——Hbase(一)
目录
一.Hbase简介
1.什么是Hbase?
HBase是一个开源的NoSQL数据库,参考google的BigTable建模,使用Java语言实现,运行于HDFS文件系统上,为Hadoop提供类似BigTable的服务,可以存储海量稀疏的数据,并具备一定的容错性、高可靠性及伸缩性。
具备NoSQL数据库的特点:(1)不支持SQL的跨行事务 (2)不满足完整性约束条件 (3)灵活的数据模型
2.Hbase的特性(5个)
(1)容量巨大
数据规模:百亿行,百万列!!!
在限定某个列的情况下对于单表存储百亿或更多的数据都没有性能问题,并且自身能够周期性地将较小文件合并成大文件以减少对磁盘的访问
(2)列存储
列存储的优势(点击跳转那位博主讲的更详细)大致包容如下:
在OLTP场景,更多的基于实体的维护和查询,但是在OLAP场景,则是更多地从实体特征角度进行数据处理(统计),所以在OLAP的场景下,如果还是使用行式存储,会导致大量的无谓的遍历,比如想要对某个列进行所有数据的统计,因为是行式存储,需要遍历所有的实体的所有的属性;如果列式存储,则只需要按照列进行查询即可,因为列式存储是以列一个物理存储单元,所以遍历只要遍历相应列的物理存储文件即可。
(3)稀疏性
对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
(4)扩展性
纵向扩展:不断优化主服务器的性能,提高存储空间和性能
横向扩展:不断向集群添加服务器来提供存储空间和性能
HBase是横向扩展的,理论上无限横向扩展
(5)高可靠性
基于HDFS的多副本机制,WAL(Write-Ahead-Log)预写机制 ,Replication 机制。
二.HDFS的原理
1.HDFS是什么?
HDFS即Hadoop分布式文件储系与统管(理Hadoop Distributed File System)
提供高可靠性和高吞吐量的文件存储服务
通过软件设计来保证系统的可靠性
具有容错性,高可靠性,高可扩展性,高吞吐率。
2.HDFS基本架构
HDFS采用了主从 (Master/Slave)结构模型,一个HDFS集群包括一个名称节点 (NameNode)和若干个数据节点(DataNode)
基本组件:NameNode(Master),SecondaryNameNode,DataNode(Slave)
3.HDFS的块
块是文件存储处理的逻辑单元 ,HDFS的文件被分成块进行存储 ,HDFS块的默认大小是128MB。
块可以自己设置,不能太大,也不宜太小。
4.分块的好处
(1)支持大规模的文件存储,文件大小不受单点存储容量限制。
(2)简化了系统设计,每个节点存储多少个文件块很容易计算。
(3)适合数据备份,每个分块冗余的备份存储到多个节点。
(4)利于负载均衡。
5.HDFS中的NameNode
(1)负责存储文件的元数据,目录,文件,权限,文件分块,副本存储等信息
(2)与客户端交互提供元数据的访问,不进行涉及文件数据读写
(3)与datanode交互,分配全局的数据存储节点
6.两个核心的数据结构:FsImage和EditLog
FsImage(镜象文件):用于维护文件系统树以及文件树中所有的文件和文件夹的元数据。
EditLog(事务日志):记录了所有针对文件的创建、删除、重命名等操作。
7.NameNode启动执行了什么操作?
加载FsImage到内存,只读状态,修改元数据操作记录在EditLog当中, EditLog文件定期合并,形成新的fsimage来替代旧的fsimage文件。
8.定期的合并edits和fsimage文件
9.HDFS中DataNode
(1)负责存储数据块
(2)负责为客户端提供数据块的读写服务
(3)响应NameNode的相关指令
(4)发送心跳信息
*10.HDFS中的读写流程
(1)读流程
- 打开分布式文件:调用分布式文件 DistributedFileSystem.open( ) 方法;
- 寻址请求:从 NameNode 处得到 DataNode 的地址,DistributedFileSystem使用 RPC 方式调用了NameNode,NameNode 返回存有该副本的DataNode 地址,DistributedFileSystem 返回了一个输入流对象(FSDataInputStream),该对象封装了输入流 DFSInputStream;
- 连接到DataNode:调用输入流 FSDataInputStream.read( ) 方法从而让DFSInputStream 连接到 DataNodes;
- 从 DataNode 中获取数据:通过循环调用 read( ) 方法,从而将数据从 DataNode 传输到客户端;
- 读取另外的 DataNode 直到完成:到达块的末端时候,输入流 DFSInputStream 关闭与 DataNode 连接, 寻找下一个 DataNode;
- 完成读取,关闭连接:即调用输入流 FSDataInputStream.close( );
(2)写流程
- 发送创建文件请求:调用分布式文件系统 DistributedFileSystem.create( )方法;
- NameNode 创建文件记录:分布式文件系统 DistributedFileSystem 发送 RPC 请求给 NameNode,NameNode 检查权限后创建一条记录,返回输出流 FSDataOutputStream,封装了输出流 DFSOutputDtream;
- 客户端写入数据:输出流 DFSOutputDtream 将数据分成一个个的数据包,并写入内部队列。DataStreamer 根据 DataNode 列表来要求 NameNode 分配适合的新块来存储数据备份。 一组 DataNode 构成管线(管线的 DataNode 之间使用 Socket 流式通信);
- 使用管线传输数据:DataStreamer 将数据包流式传输到管线第一个DataNode,第一个 DataNode 再传到第二个DataNode,直到完成;
- 确认队列:DataNode 收到数据后发送确认,管线的 DataNode 所有的确认组成一个确认队列。所有 DataNode 都确认,管线数据包删除;
- 关闭:客户端对数据量调用 close( ) 方法。将剩余所有数据写入DataNode管线,联系NameNode并且发送文件写入完成信息之前等待确认;
- NameNode确认:
- 故障处理:若过程中发生故障,则先关闭管线,把队列中所有数据包添加回去队列,确保数据包不漏。为另一个正常 DataNode 的当前数据块指定一个新的标识,并将该标识传送给 NameNode,一遍故障 DataNode 在恢复后删除上面的不完整数据块。从管线中删除故障 DataNode 并把余下的数据块写入余下正常的 DataNode。NameNode 发现复本两不足时,会在另一个节点创建一个新的复本。
在数据的读取过程中难免碰到网络故障,脏数据,DataNode 失效等问题,这些问题 HDFS 在设计的时候都早已考虑到了。下面来介绍一下数据损坏处理流程:
- 当 DataNode 读取 block 的时候,它会计算 checksum。
- 如果计算后的 checksum,与 block 创建时值不一样,说明该 block 已经损坏。
- Client 读取其它 DataNode上的 block。
- NameNode 标记该块已经损坏,然后复制 block 达到预期设置的文件备份数 。
- DataNode 在其文件创建后验证其 checksum
11.HDFS容错
HDFS具有较高的容错性,可以兼容廉价的硬件,它把硬件出错看作一种常态,而不是异常,并设计了相应的机制检测数据错误和进行自动恢复,主要包括以下几种情形:
(1)名称节点出错
(2)数据节点出错
(3)数据出错
1、NameNode出错:用Secondary NameNode备份的fsimage恢复
2、DataNode出错:DataNode与NameNode通过“心跳” 报告状态,当DataNode失效后,副本数减少,而NameNode会定期检查各节点的副本数量, 检查出问题后会启动数据冗余机制。
3、数据出错:数据写入同时保存总和校验码,读取时校验。
三.Hbase数据模型
1.Hbase的相关概念
(1)表( table ):HBase采用表来组织数据;
(2)行( row ):每个表都由行组成,每个行由行键( row key )来标识,行键可以是任意字符串;
(3)列族( column family ):一个table有许多个列族,列族是列的集合,属于表结构,也是表的基本访问控制单元;
(4)列标识(column qualifier):属于某一个Column Family:Column Qualifier形式标识,每条记录 可动态添加
(5)时间戳( timestamp ):时间戳用来区分数据的不同版本;
(6)单元格( cell ):在table中,通过行、列族、列、时间戳来确定一个cell,cell中存储的数据没有数据类型,是字节数组byte[] ,
通过<RowKey,Column Family: Column Qualifier,Timestamp>元 组来访问单元格
2.逻辑模型
3.物理模型
关系型数据库特点:
(1)表结构预先定义;
(2)每列的数据类型不同;
(3)空值占用存储空间
HBase特点:
(1)只需定义表名和列族
(2)可以动态添加列族和列
(3)数据都是字符串类型的
(4)空值不占用存储空间
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· spring官宣接入deepseek,真的太香了~