HBASE
一、HBase相关概念
HFile是HBase专用的HDFS文件格式。域服务器中的HFile实现负责从HDFS读取HFile,以及将HFile写入到HDFS。
分布式的HBase实例依赖于处在运行状态的Zookeeper集群。
默认情况下,HBase管理一个Zookeeper集群(HBase将Zookeeper进程的启动和停止作为启动/停止自身进程的一部分。)
由于HBase主控节点可能会被重新分配,因此客户端启动时会向Zookeeper查询HBase主控节点和-Root-表的当前位置。
HBase使用一种自动分片和分发方案来应对大量数据。(与HDFS基于块的设计和快速数据访问相比)
HBase数据的所有组件--键、列族名和更名--均被其当成求解析的字节数组。这意味着所有内部值的比较及排序,均以字典顺序进行。
HBase使用列族进行基于访问模式的数据分割。定义了保存和访问HBase数据的方式。每个列族都保存在一个单独的HFILE中。
建议为每种数据访问类型创建一个列族(即应该把通常一起读/写的数据放入相同的列族)。
在表创建过程中会定义一系列列族(可以修改)。不同的列族也可以使用不同的压缩机制。
HBase中可以设置多个列族,每个列族可以有多个qualifier,相当于不同的列。
每个列与键的对应值的更新,就是新版本的写入。默认情况下,HBase为给定列的值保存最近3个版本(自动删除更老的版本)。版本深度可以在建表时设定,版本的默认实现是数据插入的时间戳,但可以设定其它方式。
Delete删除,HBase不会就地修改数据,而是创建墓碑标识来完,在主要合并的时,这些值才被清理掉
处理数据时,可以为Get和Scan配置过滤器
HBase使用HDFS作为持久化机制,因此它从不覆盖数据(HDFS不支持更新),所以每次memstore写入磁盘时,它并不覆盖已有的存储文件,而是创建新文件。为避免存储文件过多,HBase实现了一个称为合并的处理过程。
次要合并:收集多个较小的相邻存储文件并将它们重写为一个。次要合并不会删除已执行Delete操作或已经过期的数据单元,只有主要合并才会。
主要合并:主要合并运行之后,每个存储上将只有一个存储文件,通常会提升性能。合并不会实现域合并。
HBase使用了布隆过滤器,允许进行行或行/列级别的检查,这种过滤在键较稀疏时很有用,布隆过滤器在文件持久化时生成,并保存在每个文件的尾部。
二、HBase结构设计
1、一般性原则,将每个表的列族数限定为不超过10-15(HBase将每个列族保存在独立文件中,因此大量的列族会导致需要读取和合并多个文件)
列族名会显式地与每个列名保存在一起(eg:info:name),因此应该最小化列族的大小。如果列中数据量小的话,通常推荐用单个字母名字,不然列族名就占了很大的空间了,损失了有效空间利用率。
2、Htable的实现是单线程的。如果需要多线程的访问HBase,那么每个线程必须创建自己的HTable类实例。解决办法使用HTalbePool类
3、Scan对象,扫描的起始键与结束键,起始键是包含在扫描范围内的,而结束键没有
4、可以使用Get,多重Get(Get的列表),Scan实现读操作。
5、scan.setCatching(HBASECASHING) (其中HBASECASHING指定需要缓存的行数),设置缓存值可以提升性能,缓存的大小显著依赖于对数据进行的处理。
(指数据处理的预读到缓存里吧,即在上一批数据处理完成之前,预读下一批数据,当处理数据耗时较多时,可能出现超时异常,eg:UnkonwnScannerException)
6、过滤器并不会提升性能,因为对表的扫描它会读取每条记录,并测试是否满足过滤条件,返回给客户端那些满足过滤条件的数据,有助于提高网络利用率。
7、所有对管理功能的访问均通过HBaseAdmin类完成,它提供广泛的API,检查表是否存在且启用,再到创建和删除表。
还可以基于HTableDescriptor创建表,该类允许操作特定表的参数,包括表名、最大文件尺寸等。它还包含了一个HCloumnDescriptor类的列表,其中每个HCloumnDescriptor类对应一个列族,允许设定列族参数名称、最大版本数、布隆过滤器。
8、由于表的分裂是相当昂贵的操作,所以在预先知道键数量的情况下,HBaseAdmin类允许使用方法创建预分裂表。
admin.createTable(desc,splitKeys);
admin.createTable(desc,startkey,endkey,nregions);
第一个方法需要表描述符和键的字节数组,其中每个键指定域的起始键。
第二个方法需要表描述符、起始键和结束键以及域的数量。
9、HBase自有客户端:HTable
StumbleUpon公司另外一种HBase Api实现:异步HBase,其核心是HBaseClient,不仅线程安全还支持任何HBase表的访问(与之相比较的HTable,每个实例仅仅支持一个表)
该实现允许以完全异步/非阻塞的方式访问HBase,对于Put操作明显的提高了吞吐量
三、比较
1、HDFS可以用于保存基本上是顺序访问的海量数据,而HBase的主要优势是快速访问数据。但二者没有一个能独立解决一个常见的业务问题--快速访问大的(MB或GB大小)数据条目。这种情况一般是在HBase中存储元数据,在HDFS中存储文件。