Hbase的前世(仿照)--》BigTable(是一个分布式存储系统 BigTable起初用于解决典型的互联网搜索问题)
google 开发bigTable的目的:
•建立互联网索引
1 爬虫持续不断地抓取新页面,这些页面每页一行地存储到BigTable里
2 MapReduce计算作业运行在整张表上,生成索引,为网络搜索应用做准备
3 (查询)用户发起网络搜索请求--》 网络搜索应用查询建立好的索引,从BigTable得到网页 --》搜索结果提交给用户
Hbase 是一个高可靠、高性能、面向列、可伸缩的分布式数据,主要用来存储非结构化和半结构化的松散数据。
1 关系数据库已经流行很多年,并且Hadoop已经有了HDFS和MapReduce,为什么需 要HBase?
Hadoop可以很好地解决大规模数据的离线批量处理问题,但是,受限于Hadoop MapReduce编程框架的高延迟数据处理机制,使得Hadoop无法满足大规模数据实时 处理应用的需求 ,HDFS面向批量访问模式,不是随机访问模式
传统的通用关系型数据库无法应对在数据规模剧增时导致的系统扩展性和性能问题(单机限制) ,同时传统关系数据库在数据结构变化时一般需要停机维护;空列浪费存储空间
很多数据是半结构化数据, 需要半结构化数据存储和处理的高可扩展、低写入/查询延迟 的系统,例如,键值数据库、文档数据库和列族数据库(如BigTable和HBase等)
2 Hbase 与传统关系型数据库的区别:
Hbase | 关系型数据库 | |
数据类型 | 字符串 | 关系模型,具有丰富的数据类型和存储方式 |
数据操作 | 不存在复杂的表与表之间的关系 只有简单的插入、查询、删除、 清空 | 增删改成,多表连接 |
存储模式 | 列存储, 每个 列族都由几个文件保存,不同列族的文件是分离 | 行模式存储 |
数据索引 | HBase只有一个索引——行键 | 多个索引,以提高数 据访问性能 |
数据维护 | HBase中执行更新操作时,并不会删除数 据旧的版本,而是生成一个新的版本,旧有的版本仍然保留 | 更新操作会用最新的当前值去替换记录中原来 的旧值,旧值被覆盖后就不会存在 |
可伸缩性 | 在集群中增加或者减少硬件数量来实现性能的伸缩 | 很难实现横向扩展,纵向扩展的空间也比较有限 |
HBase是一个稀疏、多维度、排序的映射表,这张表的索引是行键、列族、列限 定符和时间戳 ,列族支持动态扩展,可以很轻松地添加一个列族或列,无需预先定义列的数量以 及类型,所有列均以字符串形式存储,用户需要自行进行数据类型转换
概念视图和物理视图
Hbase 的组件:
(1)库函数:链接到每个客户端
(2)一个Master主服务器 :分 配Region,负载均衡 (在Region分裂或合并后,负责重新调整Region的分布 – 对发生故障失效的Region服务器上的Region进行迁移 )
(3)许多个Region服务器 :处理来自客户端的读写请求,客户端并不是直接从Master主服务器上读取数据,而是在获得Region的存储位置信息后,直接从Region服务器上读取数据
region的定位:
ROOT-表只能有一个Region,通过root表--》META表--》region
客户端访问数据时的“三级寻址”
•为了加速寻址,客户端会缓存位置信息,同时,需要解决缓存失效问题
•寻址过程客户端只需要询问Zookeeper服务器,不需要连接Master服务器
(128MB/1KB) × (128MB/1KB) = 234个Region
Hbase的系统架构
1 用户的读写数据:
读数据:找到对应的region服务器--》 写memstore+ Hlog -->只有当操作写入Hlog之后,commit()调用才会将其返回给客户端
写数据:region--》MemStore找不到--》StoreFile
2. 缓存的刷新
周期性--》MemStore缓存里的内容刷写到磁盘的StoreFile --》Hlog里面写入一个标记
每次刷写都生成一个新的StoreFile文件,因此,每个Store包含多个 StoreFile文件
每个Region服务器都有一个自己的HLog 文件,,每次启动 都要确认最近一次执行缓存刷新操作之后是否发生新的写入操作,如果发现更新,则先写入MemStore,再刷写到StoreFile,最后删除旧 的Hlog文件
3. StoreFile的合并
•每次刷写都生成一个新的StoreFile,数量太多,影响查找速度 •调用Store.compact()把多个合并成一个 •合并操作比较耗费资源,只有数量达到一个阈值才启动合并
•Store是Region服务器的核心 •多个StoreFile合并成一个 •单个StoreFile过大时,又触发分裂操作,1个父Region被分裂成两个子 Region
Hlog的工作原理(Write Ahead Log)
用户更新数据必须首先写入日志后,才能写入MemStore缓存,并且 ,直到MemStore缓存内容对应的日志已经写入磁盘,该缓存内容才 能被刷写到磁盘
1 Zookeeper会实时监测每个Region服务器的状态,当某个Region服 务器发生故障时,Zookeeper会通知Master
2 Master首先会处理该故障Region服务器上面遗留的HLog文件,这个 遗留的HLog文件中包含了来自多个Region对象的日志记录
3 系统会根据每条日志记录所属的Region对象对HLog数据进行拆分, 分别放到相应Region对象的目录下,然后,再将失效的Region重新 分配到可用的Region服务器中,并把与该Region对象相关的HLog日 志记录也发送给相应的Region服务器
4 Region服务器领取到分配给自己的Region对象以及与之相关的HLog 日志记录以后,会重新做一遍日志记录中的各种操作,把日志记录中 的数据写入到MemStore缓存中,然后,刷新到磁盘的StoreFile文件 中,完成数据恢复
Long.MAX_VALUE - timestamp作为行键,HColumnDescriptor.setInMemory(true), HColumnDescriptor.setMaxVersions(int maxVersions)
HBase之上构建SQL引擎
1.Hive整合HBase
2.Phoenix
Phoenix具体是什么呢,其本质是用Java写的基于JDBC API操作HBase的开源SQL引擎
构建HBase二级索引
•Coprocessor提供了两个实现:endpoint和observer,endpoint相当于关系型数据库的 存储过程,而observer则相当于触发器
方案二:Solr+HBase