Hbase(1)hbase in action)
Hbase 命令
careate ‘表名’,’列簇名’ 创建表
list 查看所遇表
describe ‘表名’ 表描述
Hbase java
hbase.zookeeper.quorum–>zookeeper的地址
Hbase
1、数据检索:habse中行键是第一个坐标,下一个是列簇。列簇表示一组列,再下一个坐标是列限定符(column qualifier),三个坐标确定了一个单元(Cell),habse的数据作为value存储在单元里。
读路径:HBase读动作必须重新衔接持久化到硬盘上的HFile和内存中MemStore里的数据。Hbase在度操作上使用了LRU(最少最近使用算法)缓存技术,这种缓存也叫做BlockCache,和MemStore在一个JVM推理。BlockCache设计将频繁访问的数据从HFile里读入内存,避免读硬盘,每个列簇都有自己的BlockCache。BlockCache中的Block是Hbase从硬盘完成一次读取的数据单位,Hfile物理存放形式是一个Block的序列加Block的索引,这意味着从Hbase里读取一个Block需要先在索引上查找一次该Block然后从硬盘读出。Block是建立索引的最小数据单位。也是从硬盘读取的最小数据单位。Block大小按照列簇设定,默认是64k。如果主要用于随机查询,小一点的Block更好一些,Block变小会导致索引变大,进而消耗更多内存。如果是顺序扫描,一次读取多个Block,大一点的Block更好一些。Block变大意味着索引项表笑,索引变小,因此节省内存。从Hbase中读出一行,所限会检查MemStore等待修改的队列,然后检查BlockCache看包含该行的Block是否最近被访问过,最后访问硬盘上对饮的HFile。如图所示(索引放在内存,序列放在硬盘,先内存中读取Block索引,定位Block然后从硬盘读取Block序列定位数据)
2、数据写入:无论insert与update的其内部流程都是相同的,hbase接到命令后保存变化信息,或者写入失败时抛出异常,默认情况下,执行写入时会写入到两个地方:预写式日志(write-ahead log,也称HLog)和MemStore,只有当这两个地方的变化都写入并确认时,才认为写入成功。
MemStore是内存里的写入缓冲区,HBase中数据永久写入硬盘之前在这里累计。当MemStore填满后,其中的数据会刷写到硬盘,生成一个HFile。HFile是Hbase使用的底层存储格式。HFile对应于列簇,一个列簇可以有多个Hfile,但一个Hfile不能存储多个列簇的数据。在集群的每个节点上,每个列簇有一个MemStore。
MemStore的大小由hbase-site.xml属性hbase.hregion.memstore.flush.size来定义
3、宕机时未持久化数据写入规则:hbase会先将数据写入预写式日志(HLOG、WAL)之后写入MemStore,WAL是底层文件系统的一个文件,直到WAL新纪录成功写入后,写动作被认为陈功完成,防止数据只写入MemStore发生宕机未持久化产生数据丢失。如果Hbase服务器宕机,没有从MemStore里刷写到Hfile的数据将通过回放WAL来恢复,你不需要手工执行,Hbase内部机制中有恢复流程部分来处理。每台Hbase有一个WAL,这台服务器上的所有表(和他们的列簇)共享这个WAL。使用put.setWriteToWAL(false);可以指定不写入WAL但宕机时有可能会丢失数据。
删除数据:合并Hbase的后台工作
Delete命令并不立即删除内容。实际上,它只是给记录打上删除标记,将针对此内容的一条新“墓碑”(tombstone)记录写入进来,作为删除的标记。墓碑记录用来标志删除的内容不能在Get和Scan命令中返回结果。因为HFile文件是不能改变的,直到执行一次大合并(major compaction),这些墓碑记录才会被处理,被删除记录占用的空间才会释放。
合并分为两种:大合并(major compaction)和小合并(minocrco mpcation)。两者将会重整存储在HFile里的数据。
小合并把多个小HFile合并生成一个大HFile,因为读出一条完整的行可能引用很多文件,限制HFile的数据量对于度性能很重要,执行合并时,HBase读出已有的多个HFile的内容,把记录写入一个新的文件。然后把新文件设置为激活状态,删除构成这个新文件的所有老文件。HBase根据文件的号码和大小决定合并哪些文件。小合并设计出发点是轻微影响HBase的性能,所以设计的HFile的数量上有上限。这些都是可以设置的。
大合并将处理给定region的一个列簇的所有HFile。大合并完成后,这个列簇的所有HFile合并成一个文件,可以从Shell中手工促发整个表(或者指定region)的大合并,这个动作相当耗费资源(消耗磁盘IO与网络IO(跨region)),不要经常使用。另易方面,小合并是轻量级的,可以频繁发生。大合并是Hbase清理被删除记录的唯一机会。因为我们不能保证被删除的记录和墓碑标记记录在一个HFile里面。HBase可以确保on故事访问到两种记录。
有时间版本的数据
Hbase除了是无模式(no schmea)数据库以外,还是有时间版本(versioned)概念的数据库.时间版本是访问特定单元时的最后一个条件。当新建、删除、修改时都会留下新时间版本。当没有设定时间版本时使用当前时间(毫秒),如果一个单元的版本超过了最大数量,多出的记录在下一次大合并时会扔掉。Hbase默认只存储3个版本,这可以基于列簇来设置。
数据模型:hbase放弃了一些关系型数据库具有的特性,特别是HBase不能实施关系约束constraint)并且不支持多行事务(multirow transaction)
逻辑模型:Hbase是有序的Map<rowkey,Map<ColumnFamily,Map<ColumnQualifier,Map<Version,Data>>>>。按照字典(asc)以及时间(desc)最新的时间版本排在稍晚的时间版本之前。
物理模型:
与关系型数据库一样,HBase中的表由行和列组成。HBase中列按照列簇分组,这种分组表现在映射的映射逻辑模型中是其中一个层次。列簇的表现在物理模型中,每个列簇在硬盘上有自己的HFile集合。这种物理上的隔离允许在列簇底层HFile层面上分别进行管理。进一步考虑合并,每个列簇的HFile都是独立管理的。
HBase的记录按照键值对存储在HFile里。HFile自身是二进制文件,不是直接可读的,存储在硬盘上HFile里的Mark用户数据如图所示,注意。在HFile里Mark这行使用了多条记录,每个列限定符和时间版本有自己的记录,另外文件里没有空记录,如果没有数据HBase不会存储任何东西。因此列簇的存在是面向列的,就像其他列式数据库一样。一行中一个列簇的数据不一定存放在同一个HFile里。Mark的info数据可能分散在多个HFile里。唯一的要求是,一行中列簇的数据需要物理存放子一起。
表扫描
stratRow
endRow
Scan缓存
在HBase的设置扫描每次RPC调用得到一批行数据。这可以在Scanner上使用setCaching(int)设置,也可以在hbasesite.xml配置文件里使用HBase.client.scanner.caching属性来设置.如果缓存值设置为n,每次RPC调用SCanner返回n行,然后这些数据缓存在客户端.,如果设置过高会导致客户端与HBase的交互出现较长暂停,这会导致HBase端的超时。ResultScanner接口也有一个next(int)调用,在内部机制中,ResultScanner使用了多次RPC调用来满足这个请求,每次RPC调用返回的行数只取决于你为Scanner设置的缓存值。
Filter
原子操作
HBase操作库里的最后一个命令是列值递增(Increment Column Value),该命令不用先读出HBase单元就可以改变存储其中的值。数据操作发生在HBase服务器上,而不是在你的客户端,所以速度快。当其他客户端也在访问同一个单元时,这样避免了出现紊乱的状态,你可以把ICV(Inerment Column Value)看成是递增类型。
行键值希望是均匀分布的,诸如MD5或SHA1等散列算法通常用来实现这种均衡分布。
ACID语义
(Atomicity 原子性)要么全部完成,要么全部不完成
(Consistency一致性)系统从一个有效状态带入另一个有效状态的操作属性,如果操作使系统出现不一致,操作不会被执行或者被回退。
Isolation 隔离性 隔离性意味着两个操作的执行数不干扰的,例如,同时在一个对象上不会出现两个写动作,写动作会一个接一个发生,而不会同时发生。
Durability 持久性是我们早前讨论过的,它意味着数据一旦写入,确保可以读回并且不会在系统正常操作一段时间后丢失。
CAP
Consistency一致性
Availability可用性
Partition Tolerance一致容忍性
分隔容忍(Partition tolerance)(系统中任意信息的丢失或失败不会影响系统的继续运作)
分布式HBASE
region server 一张表由多个region组成,regionServer托管region。region尽量与HDFSDataNode配置在同一台屋里机上。region大小可以由hbase-site中的Hbasehregion.max.filesize决定,当一个region超过此大小时,写入更多数据是它会切分成两个region。
如何找到region
当region切分时,当regionServer宕机时,或有新的regionServer添加进来时,会发生region分配。HBase表中有俩个特殊的表,-ROOT-和.META.,用来查找各中表的region位置在哪里。-ROOT-和.META.就像HBase中其他表一样也会切分成region
-ROOT-和.META.都是特殊表,但是-ROOT-比.META.更特殊一些,-ROOT-永远不会切分超过一个region,.META.和其他表一样可以按照需要切分成许多region。当客户端段要访问某行时,它先找到-ROOT-表,查找什么地方可以找到负责某行的region。ROOT-
指向.META.表的region,那里有这个答案。META表由入口地址促成,客户端应用使用这个入口地址判断那一个regionserver托管带查找的region。这个查找过程就像一个三层分布式B+树,-root-表是b+树的root节点,-meta-region是root节点的叶子节点,用户表的region是meta region的叶子节点
如何找到ROOT表
HBASE与MAPREDUCE
发表评论