分布式NoSQL列存储数据库Hbase_列族的设计(五)

2021-04-09 15:36:28 浏览数 (1)

分布式NoSQL列存储数据库Hbase_列族的设计(五)

知识点01:课程回顾

  1. Hbase存储原理
    • 存储架构
      • Hbase:对外提供分布式内存
        • Master:集群管理
        • RegionServer:数据管理
      • HDFS:提供分布式磁盘
        • DataNode
      • Zookeeper:实现辅助选举、实现元数据存储
    • 存储结构
      • Table:分布式表,一张表划分了多个Region
      • RegionServer:分布式集群节点,管理所有表的region
        • Region:每张表的每个分区,对表的数据进行划分
          • region的划分规则:按照范围划分,从-oo 到 oo进行有序划分
          • 数据的划分规则:按照Rowkey或者Rowkey前缀,Rowkey属于哪个范围,写入对应的region
          • Store:对分区内部的数据再次划分,按照列族进行划分Store
          • MemStore:内存区域,用于存储刚写入的数据,使用的RegionServer的JVM内存
          • 如果到达一定的阈值,就会写入HDFS,变成文件
          • StoreFile:逻辑上属于Store,物理上存储在HDFS【HFILE】
    • HDFS存储关系
      • Hbase目录:/hbase
      • Hbase数据:/hbase/data
        • NS目录
          • Table的目录
          • Region的目录
          • 列族的目录
  2. 热点问题
    • 现象:大量的读写请求全部集中在某个Region或者某个RegionServer上
    • 原因:数据分配的不均衡
      • 情况一:表只有一个分区
      • 情况二:表有多个分区,但是Rowkey是连续的,或者与分区的划分不匹配
        • Rowkey是连续,写入同一个Region
        • 分区都是按照数字划分的,但是Rowkey是字母开头
    • 解决
      • 实现预分区
        • 方式一:创建表时候:SPLITS => [10,30……]
        • 方式二:指定分区的个数,根据数字和字母的Hash组合
          • 应用:Rowkey的前缀是字母和数字组合
        • 方式三:Java API
      • 合理的设计Rowkey,根据Rowkey的前缀或者完整的Rowkey来划分分区
        • Rowkey的设计规则
        • 业务原则:尽量用最常用的查询条件作为Rowkey的前缀
          • 目的:尽量走索引查询
        • 唯一原则:每条Rowkey是不能重复
          • 目的:唯一标识一条数据
        • 组合原则:将最常用的几个查询条件组合构建Rowkey
          • 目的:尽量大部分查询都走索引
        • 散列原则:Rowkey整体或者前缀不能是连续的,需要构建随机的散列
          • 目的:避免热点问题
        • 长度原则:在满足业务需求情况下,越短越好
          • 目的:提高性能
          • Rowkey本身每列都会存储:存储占用的空间越大
          • Rowkey会构建索引:内存的占用越大,比较就越慢

知识点02:课程目标

知识点03:Hbase设计:列族的设计

知识点04:聊天系统案例:需求分析

知识点05:聊天系统案例:Hbase表设计

知识点06:聊天系统案例:环境准备

知识点07:聊天系统案例:模拟生成数据

  • 目标
    • 模拟产生用户聊天数据,将每条聊天数据写入Hbase表中
  • 路径
    • step1:读取Excel文件,读取指定表格
    • step2:从表格的每一列中随机生成一条数据,构建一条模拟数据
    • step3:将模拟数据封装在一个Msg对象中
  • 实现
    • 读取Excel文件 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XPxKWFGg-1616666919964)(20210322_分布式NoSQL列存储数据库Hbase(五).assets/image-20210322105117623.png)]
    • 随机取某一列的一个值 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9a9g0u0B-1616666919964)(20210322_分布式NoSQL列存储数据库Hbase(五).assets/image-20210322105145249.png)]
    • 随机生成一条数据 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hm39BwML-1616666919965)(20210322_分布式NoSQL列存储数据库Hbase(五).assets/image-20210322105206464.png)]
  • 总结 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GvWhnY47-1616666919965)(20210322_分布式NoSQL列存储数据库Hbase(五).assets/image-20210322103055968.png)]

知识点08:聊天系统案例:构建Rowkey

知识点09:聊天系统案例:测试写入代码

知识点10:聊天系统案例:查询需求分析

知识点11:聊天系统案例:测试查询代码

知识点12:聊天系统案例:查询问题

知识点13:二级索引

附录一:Maven 依赖

代码语言:javascript复制
    <repositories>
        <repository>
            <id>aliyun</id>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        </repository>
    </repositories>
    <properties>
        <hbase.version>2.1.2</hbase.version>
    </properties>
    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-client -->
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <version>${hbase.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-server</artifactId>
            <version>${hbase.version}</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <!-- Xml操作相关 -->
        <dependency>
            <groupId>com.github.cloudecho</groupId>
            <artifactId>xmlbean</artifactId>
            <version>1.5.5</version>
        </dependency>
        <!-- 操作Office库 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.0.1</version>
        </dependency>
        <!-- 操作Office库 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.0.1</version>
        </dependency>
        <!-- 操作Office库 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.0.1</version>
        </dependency>
        <!-- 操作JSON -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
        </dependency>
        <!-- phoenix core -->
        <dependency>
            <groupId>org.apache.phoenix</groupId>
            <artifactId>phoenix-core</artifactId>
            <version>5.0.0-HBase-2.0</version>
        </dependency>
        <!-- phoenix 客户端 -->
        <dependency>
            <groupId>org.apache.phoenix</groupId>
            <artifactId>phoenix-queryserver-client</artifactId>
            <version>5.0.0-HBase-2.0</version>
        </dependency>
    </dependencies>
代码语言:javascript复制
   <!-- 操作Office库 -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml-schemas</artifactId>
        <version>4.0.1</version>
    </dependency>
    <!-- 操作JSON -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.62</version>
    </dependency>
    <!-- phoenix core -->
    <dependency>
        <groupId>org.apache.phoenix</groupId>
        <artifactId>phoenix-core</artifactId>
        <version>5.0.0-HBase-2.0</version>
    </dependency>
    <!-- phoenix 客户端 -->
    <dependency>
        <groupId>org.apache.phoenix</groupId>
        <artifactId>phoenix-queryserver-client</artifactId>
        <version>5.0.0-HBase-2.0</version>
    </dependency>
</dependencies>

0 人点赞