分布式NoSQL列存储数据库Hbase

(一)数据采集

- Flume:实时数据采集:采集文件或者网络端口
- Sqoop:离线数据同步:采集数据库的数据

(二)数据存储

- HDFS:分布式离线文件存储系统
- Hive:离线数据仓库
- 将HDFS上的文件映射成了表的结构,让用户可以通过数据库和表的形式来管理大数据

(三)数据计算

- MapReduce+YARN:分布式离线数据计算
- Hive:通过SQL进行分布式计算
- 将SQL语句转换为MapReduce程序,提交给YARN运行

(四)HBASE诞生

 随着大数据的发展,大数据的应用场景越来越多,有了实时性的需求
 HDFS、MapReduce:都只能实现离线的处理以及计算
 想做实时推荐
- 实时的采集用户的数据,实时分析,根据用户画像给用户推荐合适的商品
- 实时采集:Flume
- 实时存储:存储读写的性能在毫秒级别
- 实时计算:计算处理的性能在毫秒级别

	- 需要一项技术能实现大量的数据实时数据读写
   - HDFS已经满足不了:HDFS解决离线大数据存储读写

(五) 总而言之

- Hbase能实现基于海量数据的随机实时的数据存储及读写
- 与MySQL区别:Hbase实现大数据存储
- 与HDFS区别:Hbase性能更好,更快

(六)Hbase功能

- Hbase是一个分布式的NoSQL数据库,能实现随机实时的大量数据的读写

- 大数据存储:分布式 + HDFS

- 实时数据读写

#(存储结构)

(七)存储关系

hbase

- 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的目录
        - 列族的目录

(八)热点问题

- 现象:大量的读写请求全部集中在某个Region或者某个RegionServer上

- 原因:数据分配的不均衡

  - 情况一:表只有一个分区
  - 情况二:表有多个分区,但是Rowkey是连续的,或者与分区的划分不匹配
    - Rowkey是连续,写入同一个Region
    - 分区都是按照数字划分的,但是Rowkey是字母开头
    
    - 解决
- 实现预分区

  - 方式一:创建表时候:SPLITS => [10,30……]
  - 方式二:指定分区的个数,根据数字和字母的Hash组合
    - 应用:Rowkey的前缀是字母和数字组合
  - 方式三:Java API

- 合理的设计Rowkey,根据Rowkey的前缀或者完整的Rowkey来划分分区

  - Rowkey的设计规则

  - ==业务原则==:尽量用最常用的查询条件作为Rowkey的前缀

    - 目的:尽量走索引查询

  - ==唯一原则==:每条Rowkey是不能重复

    - 目的:唯一标识一条数据

  - ==组合原则==:将最常用的几个查询条件组合构建Rowkey

    - 目的:尽量大部分查询都走索引

  - ==散列原则==:Rowkey整体或者前缀不能是连续的,需要构建随机的散列

    - 目的:避免热点问题

  - ==长度原则==:在满足业务需求情况下,越短越好

    - 目的:提高性能

      - Rowkey本身每列都会存储:存储占用的空间越大

      - Rowkey会构建索引:内存的占用越大,比较就越慢

猜你喜欢

转载自blog.csdn.net/qq_45769990/article/details/115086316