我是靠谱客的博主 搞怪云朵,最近开发中收集的这篇文章主要介绍Spark实战—— (2.1) HBase表格结构、物理存储结构与系统架构,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

      • 1. HBase简介
        • 1.1 HBase是什么?
        • 1.2 列式存储与行式存储
      • 2. HBase表格结构
      • 3. HBase物理存储结构
      • 4. HBase系统架构
        • 4.1 重要文件
        • 4.2 架构
        • 4.3 Region定位
      • Reference

1. HBase简介

1.1 HBase是什么?

HBase,即Hadoop DataBase,是Hadoop的一个子项目,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,是Google Bigtable的开源实现。

HBase在Hadoop生态中的位置如下[1]——

  • 使用HDFS作为其分布式存储系统,提供了高可靠的底层存储支持
  • 使用MapReduce来处理海量数据,提供了高性能的计算能力
  • 使用Zookeeper提供协同/协调服务,提供了稳定服务和failover机制(故障切换)

1.2 列式存储与行式存储

上面说到HBase是基于列列式数据库,而常用的关系数据库则是行式数据库,此处对两个概念做简单区分。

行式存储是指数据以为单位进行存储,同一的数据在存储介质中连续,如Oracle、Mysql、Sql Server

列式存储是指数据以为单位进行存储,同一的数据在存储介质中连续,如HBase、HP vertica等分布式数据库

行式存储适合处理OLTP,对实时性要求较高的应用,如ATM系统——

  • INSERT/UPDATE容易,适合随机数据的增加和删除
  • 适合需要获取行中所有属性的查询操作
  • 数据量很大时且没有索引时,需要大量IO(如只需要查询两列,但仍然要把每一行都读出来)
  • 建立索引等提高性能的操作花时间、占空间

列式存储适合处理OLAP,实时性要求不高,但数据量大——

  • 每一列都可以作为索引进行查询
  • 查询时只有涉及的列被读取
  • 各列独立存储,可根据每一列的实际情况进行压缩,节省存储空间
  • 查询时对各个列并行查询,再进行组合(查询示意图如下)
  • INSERT/UPDATE比较麻烦,不适合需要频繁更新的应用

2. HBase表格结构

HBase的表格中涉及到几个概念,用一个例子来解释,这一部分看了很多博客,其中HBase概念及表格设计解释得很通俗,可以看一下。

HBase中一个可能的表格如下,包括:

  • RowKey:行键,类似关系表中的主键,是用来表示唯一一行记录的主键,按字典序排列
  • Column:列,类似关系表中的列,在下图中的列就是Gender,Age,Province,City
  • ColumnFamily:列族,是列的集合,不同的列族存储在不同文件中,引入这个概念是因为HBase查询中,很多情况下不需要一行中所有的列
  • Cell:单元格,由【RowKey、Column】确定的单元格,如下图中的Male,20...
  • TimeStamp:数据修改时加入的时间戳,下图中作为单独一列,实际上这个值是存放在单元格中的,见下面的例子

HBase的表数据内部用Map实现[5],如上图用字典/JSON形式可表示如下:

{"Mike":{
    "BasicInfo":{
        "Gender":{"T1":"Male"}, 
        "Age":{"T1":"20"}
    },
    "AddressInfo":{
        "Province":{"T1":"GuangDong"},
        "City":{"T1":"Guangzhou"}
    }
 },
 "Amy":{
     "BasicInfo":{
         "Gender":{"T2":"Female"}, 
         "Age":{"T2":"18"}
     },
     "AddressInfo":{
         "Province":{"T2":"GuangDong"},
         "City":{"T2":"Shenzhen"}
     }
 }
}

假设将Mke的Age改为21,在HBase中会保留数据的若干版本,由时间戳区分,可把表格看成如下形式:

用字典/JSON形式表示如下,可以看到实际上只在第四行发生了改变,即在Age中增加了一个键值对

{"Mike":{
    "BasicInfo":{
        "Gender":{"T1":"Male"}, 
        "Age":{"T1":"20", "T3":"21"}
    },
    "AddressInfo":{
        "Province":{"T1":"GuangDong"},
        "City":{"T1":"Guangzhou"}
    }
 },
 "Amy":{
     "BasicInfo":{
         "Gender":{"T2":"Female"}, 
         "Age":{"T2":"18"}
     },
     "AddressInfo":{
         "Province":{"T2":"GuangDong"},
         "City":{"T2":"Shenzhen"}
     }
 }
}

所以实际上,上述表在HBase中的逻辑表示如下,一个单元格包含数据的若干个版本,是【时间戳:值】的列表

综上,在HBase中,一个表就是一个高维、稀疏、有序的Map表。

关于HBase的基于的列式存储,实际上说基于列族更合适——

  • 在HBase中不同的列族存储在不同文件中,同一列族的数据在存储介质上连续
    比如上面的表,在HBase中存储大致如下:
Mike - BasicInfo:Gender - T1:Male
Mike - BasicInfo:Age - T1:20
Mike - BasicInfo:Age - T3:21
Amy - BasicInfo:Gender - T2:Female
Amy - BasicInfo:Age - T2:18
Mike - AddressInfo:Province - T1:GuangDong
Mike - AddressInfo:City - T1:Guangzhou
Amy - AddressInfo:Province - T2:GuangDong
Amy - AddressInfo:City - T2:Shenzhen

3. HBase物理存储结构

对HBase的表,物理存储结构如下:

  1. 一个表由很多行Row组成,按照RowKey的字典序排列
  2. 在行的方向上,一个表会被划分为Region,即一个Region是若干行
    • 一开始只有一个Region,当Region增大到一个阈值时,等分为两个Region
    • Region是分布式存储的最小单元,即一个Region不会拆分到不同节点上
  3. Region由一个或多个Store组成,每个Store存储一个ColumnFamily
  4. Store由一个MemStore若干个StoreFile组成
  5. StoreFileHFile的轻量级封装,HFile就是实际的存储文件,存储着键值对(HFile内部结构可参考HBase基本概念与基本使用)

4. HBase系统架构

4.1 重要文件

HBase里有几个重要的文件,简单介绍如下:

  1. HLog,每次写操作都会在HLog中记录,当有节点宕机时可以恢复
  2. META表,记录所有的Region的元数据,即位置等信息,当Region数量很多时,META表也会分成多个Region
  3. ROOT表,记录META表所有Region的元数据,ROOT表始终只有一个Region,ROOT表的位置保存在zookeeper中,如下[4]

4.2 架构

HBase的架构如下[4]

Client

  1. 使用HBase RPC机制与HMaster和HRegionServer进行通信

HMaster

  1. 为HRegionServer分配Region
  2. 负责HRegionServer的负载均衡
  3. 当有HRegionServer失效或Region等分时,决定将Region分配到哪些节点
  4. GFS的垃圾回收

HRegionServer

  1. 维护Master分配的Region,处理对这些Region的IO请求
  2. 切分在运行过程中变得过大的Region

zookeeper

  1. (运行多个HMaster,)使用master选举机制保证有且只有一个HMaster
  2. 存储ROOT表的位置
  3. 实时监控HRegionServer的状态(HRegionServer将自己注册到zookeeper),将上线下线通知给HMaster

4.3 Region定位

在查询过程中,需要根据RowKey定位到Region的位置,具体定位方式如下:

  1. Client从zookeeper中获取ROOT表的位置
  2. Client查ROOT表,获取META表的位置(网络通信)
  3. Client查META表,找到RowKey所在Region的位置(网络通信)
  4. Client访问具体的Region,获取数据(网络通信)

如上,在没有缓存的情况下,需要三次网络通信。

实际上,访问ROOT表和META表时会进行缓存,查询时会先在缓存中寻找Region、META表或ROOT表。

当所有缓存都丢失/被覆盖时,需要6次网络通信,前三次用于发现三个缓存都丢失,后三次即为上述的三次。

关于HBase的读写细节,可以参考Hadoop相关知识整理系列之一:HBase基本架构及原理。

以上,对HBase表格的逻辑结构、表格的物理存储结构与HBase的系统架构做了简单介绍,主要是对HBase框架有一个整体的理解,更为细节的部分可以参考在下面的一些博客中。

Reference

  1. 《百度百科》- HBase
  2. 几张图看懂列式存储(转)
  3. 数据库为什么会分为“行式存储”和“列式存储”呢?
  4. Hadoop相关知识整理系列之一:HBase基本架构及原理
  5. HBase概念及表格设计
  6. HBase基本概念与基本使用

最后

以上就是搞怪云朵为你收集整理的Spark实战—— (2.1) HBase表格结构、物理存储结构与系统架构的全部内容,希望文章能够帮你解决Spark实战—— (2.1) HBase表格结构、物理存储结构与系统架构所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(84)

评论列表共有 0 条评论

立即
投稿
返回
顶部