(一)数据采集
- 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会构建索引:内存的占用越大,比较就越慢