目录
Google的三驾马车
谈到Hadoop的起源,就不得不提Google的三驾马车:Google FS、MapReduce、BigTable。虽然Google没有公布这三个产品的源码,但是他发布了这三个产品的详细设计论文,奠定了风靡全球的大数据的基础!
GFS —2003 HDFS的理论基础 MapReduce—2004 MapReduce的理论基础 BigTable—2006 Hbase的理论基础
Hadoop与Hbase
什么是HBase
HBase(Hadoop Database)是一个开源的、面向列大数据存(Column-Oriented)、适合存储海量非结构化数据或半结构化数据的、具备高可靠性、高性能、可灵活储与管理扩展伸缩的、支持实时数据读写的非关系型分布式数据库。使用Java语言实现,运行在HDFS之上,将HDFS作为底层文件存储系统。
HBase 是非关系型数据库,它不具备关系型数据库的一些特点,例如,它不要求数据之间有严格的关系,同时它允许在同一列的不同行中存储不同类型的数据。
HBase的发展历程
Apache HBase最初是Powerset公司为了处理自然语言搜索产生的海量数据而开展的项目
HBase特性
容量巨大
HBase的单表可以有百亿行,百万列,可以在横向和纵向两个维度对数据进OPTION行插入,具有很大弹性。
在限定某个列的情况下对于单表存储百亿或更多的数据都没有性能问题,并且自身能够周期性地将较小文件合并成大文件以减少对磁盘的访问
类存储
HBase是面向列(族)存储的,并且列(族)拥有独立索引,对数据的权限控制也是从列族层面来实现的。
稀疏性
稀疏: 对于为空(null)大数据存的列,并不占用存储空间,因此,表可以设计的非常稀疏。
扩展性
纵向扩展:不断优化主服务器的性能,提高存储空间和性能
横向扩展:不断向集群添加服务器来提供存储空间和性能
HBase是横向扩展的,理论上无限横向扩展
高可靠性
- 基于HDFS的多副本机制
- WAL(Write-Ahead-Log)预写机制
- Replication 机制
WAL(Write-Ahead-Log)预写日志是在 HBase 服务器处理数据插入和删除的过程中用来记录操作内容的日志,保证了数据写入时不会因集群异常而导致写 入数据的丢失;而 Replication 机制是基于日志操作来做数据同步的。
Hadoop
Hadoop是一个分布式的基础架构,实现分布式的存储和分布式的计算,分别对应hadoop的两个核心设计--HDFS和Mapreduce,HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。
HDFS
- HDFS即Hadoop分布式文件系统(储与管理Hadoop Distributed File System)
- 提供高可靠性和高吞吐量的文件存储服务
- HDFS可以运行在低成本的硬件之上,通过软件设计来保证系统的可靠性
- 具有容错性,高可靠性,高可扩展性,高吞吐率。
HDFS基本架构
HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。Namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。它也负责确定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。
HDFS-块
- 块是文件存储处理的逻辑单元
- HDFS的文件被分成块进行存储
- HDFS块的默认大小是64MB
分块的好处:
- 支持大规模的文件存储,文件大小不受单点存储容量限制。
- 简化了系统设计,每个节点存储多少个文件块很容易计算。
- 适合数据备份,每个分块冗余的备份存储到多个节点。
- 利于负载均衡,当某个节点处于繁忙状态时,客户端还可以从其他 节点获取这个块的副本。
块大小可自行设置,不能太大,也不宜过小。块太大,不利于副本的存储,块太小导致块数量过多,计算过程中占有的内存多
HDFS-NameNode
- NameNode,也叫做名称节点。
- NameNode是主服务器,负责存储文件的储与管理元数据
- 元数据指的是目录,文件,权限等信息;
- 文件分块,副本存储等信息(比如一个文件对应哪些块,每块存储节点的位置)
- Namenode在数据访问时给客户端提供元数据信息,当客户端发起数据请求时,仅仅从NameNode中获取文件的元数据信息,具体的数据传输不经过NameNode,而是直接与具体的DataNode进行交互
- 与Datanode交互,分配全局的数据存储节点
- 两个核心的数据结构:fsimage和editlog
- fsimage(映象文件):用于维护文件系统树以及文件树中所有的文件和文件储与管理 夹的元数据
- editlog(事务日志):记录了所有针对文件的创建、删除、重命名等操作
- NameNode启动
- 在Namenode启动时,fsimage文件的内容会加载到内存中,之后一直处于只读状态,当需要修改元数据时,比如系统中新建了文件等,不能直接修改fsimage文件,而是将这些修改事务写到editlog文件中,editlog文件会定期的合并,形成新的fsimage文件来替代旧的fsimage文件,这个合并工作由另一个组件SecondaryNameNode来完成。
HDFS-SecondaryNameNode
作用:定期的合并editslog和fsimage文件,合并过程会周期性的进行
- Checkpiont:合并的时间点,默认3600秒,或editlog文件达到64M。
HDFS-DataNode
- 分布式文件系统中的每一个文件,都被切分成若干个数据块,每一个数据块都被存储在不同的服务器上,此服务器称之为数据服务器,这就是DataNode(数据节点)
- 负责存储数据块
- 负责为客户端提供数据块的读写服务
- 响应NameNode的相关指令,比如完成数据块的复制、删除等
- 定期发送心跳信息给NameNode,告知NameNode当前节点存储的文件块信息
HDFS-读文件机制
HDFS-写文件机制
HDFS-副本机制
- 默认副本数为3
- 跨越多个机架
- 默认副本策略:在HDFS默认3个副本情况下,会把第一个副本放到机架的一个节点上,第二副本放在同一个机架的另一个节点上,第三个节点放在不同的机架上。这种策略减少了跨机架副本的个数,提高了数据块的写性能,也允许一个机架出故障的情况。
HDFS-容错
- HDFS具有较高的容错性,可以兼容廉价的硬件,它把硬件出错看作一种常态,而不是异常,并设计了相应的机制检测数据错误和进行自动恢复,主要包括以下几种情形:
- 名称节点出错
- 数据节点出错
- 数据出错
- NameNode出错:用Secondary NameNode备份的fsimage恢复
- DataNode出错:DataNode与NameNode通过“心跳”报告状态,当DataNode失效后,副本数减少,而NameNode会定期检查各节点的副本数量, 检查出问题后会启动数据冗余机制。
- 数据出错:在文件被创建时,客户端就会对每一个文件块进行信息摘录,并保存总和校验码,读取时校验。
小结
HDFS:储与管理可以存储大容量的数据文件容错性,故障监测机制,随时发现集群故障节点高可扩展性
HBase系统架构
HBase是一个高可靠、高性能、面向列、可伸缩的分布式数据库,底层基大数据存储与管理于Hadoop的HDFS来存储数据。 HBase的系统架构包括客户端、Zookeeper服务器、HMaster服务器、和RegionServer服务器这些组件。HBase集群也是主从模式,HMaster是主服务器,regionServer是从服务器,在集群中可允许有多个regionserver。
同时regionserver上有多个region,region是HBase中数据的物理分片。HBase的底层是HDFS的数据节点,HBase中的数据最终是存储在HDFS上的。
客户端
- HBase系统的入口
- 客户端是任务的发起者;它是整个储与管理HBase系统的入口,使用者直接通过客户 端来操作Hbase。
- 通信功能
- 客户端与HMaster进行管理类操作的通信;在获取RegionServer的信息后,直接与RegionServer进行数据读写类操作。
- 客户端的多种形式
- HBase 自带的HBase shell使用Java语言来实现的客户端
ZooKeeper
协调的任务:
- Master选举:通过选举机制保证同一个时刻只有一个HMaster处于活跃状态。
- 系统容错:每个RegionServer在加入集群时都需要到Zookeeper中进行注册,创 建一个状态节点,Zookeeper会实时监控每个RegionServer的状态。
- Region元数据管理:Region元数据被存储在Meta表中。Meta表是存在Zookeeper中。每次客户端发起新的请求时,需要查下Meta表来获取Region的位置。另外HMaster的地址也由zookeeper告知客户端。
- Region状态管理:HBase 集群中region 会经常发生变更,变更的原因可能是系 统故障,或者是配置修改,还有region 的分裂和合并。只要region 发生变化,就 需要集群的所有节点知晓,否则就会出现异常。
HMaster
HMaster是HBase集群中的主服务器,负责监控集群中的所有大数据存RegionServer,并且是所有元数据更改的接口储与管理. HMaster主要负责表和region的管理工作
- 管理用户对表的增、删、改、查操作
- 管理RegionServer的负载均衡,调整region的分布
- Region的分配和移除
- 在RegionServer宕机或下线后,负责迁移RegionServer上的Region到其他的RegionServer上
HMaster故障不影响当前客户端对数据的访问。但需尽快恢复,避免后续操作的正确性。
RegionServer
RegionServer主要负责响应用户的请求,向HDFS中读写数据。一般在分布式集群当中,RegionServer大数据存储与管理运行在DataNode服务器上,实现数据的本地性。每个RegionServer包含多个region,它负责的功能有:
- 处理客户端读写请求。
- 处理分配给它的region。
- regionserver接收到客户端的写数据操作后,将数据缓存至 HDFS中。
- 处理Region分片:切片在运行过程中变得过大的Region。
- 执行压缩。
Hbase相关概念
- 表( table ):HBase采用表来组织数据;同一个表的数据通常是相关的。
- 行( row ):每个表都由行组成,每个行由行键( row key )来标识,行键可以是任意字符串;数据存储时,按照行键的字典顺序排序。在检索时,可以通过单个row key来访问数据。
- 列族( column family ):一个table有许多个列族,列族是列的集合,属于表结构,也是表的基本访问控制单元;列族支持动态扩展,用户可以很轻松的添加一个列族或列,无须预定义列的数量以及类型。
- 列标识(column qualifier):列族中的数据通过列标识column qualifier来进行定位,通常以Column Family:Column Qualifier来确定列族中的某列,注意列族与列表之间用冒号来隔开。另外列标识是可以根据需要动态添加的。
- 时间戳( timestamp ):时间戳用来区分数据的不同版本;即每个单元格保存着同一份数据的多个版本,默认情况下,每一个单元格中的数据插入时都会用时间戳来进行版本标识。读取单元格数据时,如果时间戳没有被指定,则默认返回最新的数据,写入新的单元格数据时,如果没有设置时间戳,默认使用当前时间。
- 单元格( cell ):在table中,通过行、列族、列、时间戳来确定一个单元格,单元格中存储的数据没有数据类型,以二进制字节来存储,每个单元格保存着同一份数据的多个版本,不同时间版本的数据按照时间的顺序排序,最新时间的数据排在最前面。通过<RowKey,Column Family: Column Qualifier,Timestamp>元组来访问单元格。
逻辑模型
关系型数据库特点:
- 表结构预先定义;
- 同一列的数据类型相同;
- 空值占用存储空间
HBase特点:
- 只需要定义表名和列族可以动态添加列族和列
- 数据都是字符串类型
- 空值不占用存储空间
物理模型
实际存储方式
表中的数据按照行键的字典序分成多个region存在不同的regionserver上