第一章
1.1 海量数据的黎明:
- RDBMS 结构化数据 传统关系型数据库 科德十二定律 [Codd's 12 rules]
- 满足新的工作负载提出的 列式存储[column-oriented] 大规模并行处理[Massively Parallel Processing , MPP]
1.2 关系数据库系统的问题:
1. 分区[sharding] 重分区[reshard] 虚拟分区[virutal shard]
2. 传统关系型数据库在业务发展中出现的 单库 读写分离 缓存 分库分表的业务扩展过程
1.3 非关系型数据库Not-Only-SQL
- NoSQL 是Eric Evans 针对Johan Oskarsson 提出的"为新兴的数据存储空间"命名
- 一致性模型
- 严格一致性: 数据变化是原子的
- 顺序一致性
- 因果一致性
- 最终一致性
- 弱一致性
- nosql 维度
- 存储模型
- 一致性模型
- 物理模型
- 读/写性能
- 辅助索引
- 故障处理
- 压缩
- 负载均衡
- 原子操作的读-修改-写
- 加锁 等待和死锁
- 可扩展性
- 数据库的范式化和反范式
1.4 Hbase结构
- SortedMap<RowKey,List<SortedMap<Column,List<Value,Timestamp>>>>
(Table,RowKey,Family,Column,Timestamp)->Value
- 自动分区
- HBase中扩展和负载均衡的基本单元为region
- 以行键排序的连续存储的区间
- region太大 系统会拆分 太小会合并
- region大小超过配置值的时候 中行键才分region
- 每一个region只能在一台服务器 一台服务器可以分多个region
- 每台服务器region的最佳加载数量10~1000 每个region的最佳大小是1GB~2GB
- 存储API
- API提供建表 删表 增加列族和删除列族的操作
- 提供修改表和列族元数据的功能[如 压缩 设置块大小]
- 对给定的行键值进行增加 删除 查找的功能
- 对单个行键下存储的原子读-修改-写[read-modify-write]序列
- 在服务器的地址空间中执行来自客户端的代码[协处理器 coprocessor] 用于实现轻量级批处理作业 使用表达式并基于各种操作来分析或汇总数据
- 实现
- 数据存储在存储文件(sore file) HFile 存储的是经过排序的键值映射结构
- HFile内部是由连续的块组成,块的索引信息存在文件的尾部
- 加载文件的时候,索引的信息将被优先加载到内存中
- 每个块的默认大小为64KB
- 存储文件提供一个设定起始和终止行键范围的API 用于扫描特定的值
- 存储文件通常保存在HDFS里
- 每次更新数据
- 优先记录 提交日志(commit log ,在Hbase叫write-ahead log,WAL) 奔溃时数据恢复
- 将数据写入内存中的memstore中,一旦内存保存的写入数据的累计大小超过阈值,将会刷入到HFile中
- 移出内存后,系统会丢弃对应的提交日志,只保留未持久化到磁盘的提交日志
- memstore 中的数据已经按照行键排序,持久化到硬盘中的时候用新的memstore获取更新数据,将旧的memstore转换成文件
- 因为存储文件时不可改变的,所有无法通过移出某个键/值对来简单地删除值 可行的解决方法是 做删除标记(delete marker 墓碑标记)
- 读回数据是文件和内存的数据合并的结果
- memsote不断写入磁盘会产生越来越多的HFile,Hbase会做[LSM树架构]
- minor合并(minor compaction) 多路归并 小文件合成大文件
- maja
- 压缩合并(majar compaction) 将一个region中一个列族的若干个HFile重写成为一个新的HFile 能合并扫描所有的键值对,顺序重写数据 忽略做删除标记的数据 对于那些超过版本号限制的数据以及生存时间到期的数据,在重写数据的时候就不再写入磁盘了
- HBse中有3个主要的组件:客户端 主服务器 region服务器
- 主服务器负责利用ZK为region服务器分配region,负载均衡将繁忙服务器的region移动到负载较轻的服务器上
- 主服务器不存储数据,只提供负载均衡和集群管理 元数据管理[建表 和建列族]
- region服务器提供region的读写,拆分超过配置大小的region接口。
- 客户端与region服务器通信,处理相关的操作
- HBase : Hadoop 数据库
第二章
2.1 快速启动指南
- 下载HBase
- 修改conf/hbase-site.xml
- 添加 <configuration><property><name>hbase.rootdir</name><value>file://path/hbase</value></property></config
- /bin/start-hbase.sh
- /bin/hbase shell
- create 'testtable','colfam1'
- list 'testtable'
- put 'testtable','myrow-1','colfam1:q1','value-1'
- scan 'testtable'
- get 'testtable','myrow-1'
- delete 'testtable','myrow-2','colfam1:q2'
- scan 'testtable'
- disable 'testtable'
- drop 'testtable'
- exit
- bin/stop-hbase.sh
2.2 必备条件[商用]
- java运行时环境
- 64位操作系统
- 大于4G的内存空间
- HDFS环境
- CPU master,slave 双四核CPU 2.GHz - 2.5GHz
- 拥有800TB存储空间的集群中每个java进程的典型内存配置
- NameNode 8GB [每100T的数据或者每100万个文件大约会占用NameNode堆1GB的内存]
- SecondaryNameNode 8GB [在内存中重做NameNode的EditLog 因此配置需要和NameNode一样]
- JobTracker 2GB [适度]
- HbaseMaster 4GB[轻量级负载 适度]
- DataNode 1GB [适度]
- TaskTracker 1GB[适度]
- Hbase RegionServer 12GB [大部分可用内存,同时为操作系统(缓冲区缓存)和任务进程留下足够的空间]
- Task Ateempts 1GB [剩余内存除以允许的任务最大单机进程数]
- Zookeeper 1GB[适度
- master 24GB [运行NameNode SecondaryNameNode JobTracker HbaseMaster]
- Slave 24GB(及以上) [DataNode TaskTracker HbaseRegionServer]