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中存储文件。

posted @ 2016-09-05 12:25  鎏鑫岁月  阅读(185)  评论(0编辑  收藏  举报