学习HBase,应该选择哪个版本

OpenTSDB是一种基于HBase编写的分布式、可扩展的时间序列数据库OpenTSDB可以用来处理一种通用需求:存储、索引和服务从大规模计算机系统(网络设备、操作系统、应用系统)采集来的參数数据,并且使这些数据易于访问和可视化

因为OpenTSDB解决了基础架构监控的普遍性问题,对于我们这本注重实战的书而言它是一个了不起嘚项目如果你开发过生产系统,你会知道基础架构监控的重要性如果你没有这种经验,也不要担心我们会告诉你的。OpenTSDB存储的数据是時间序列数据(time series)这也是一个有趣的地方。传统关系型模型不大适合高效处理时间序列数据的存储和查询关系型数据库厂商为解决这種问题经常会依靠一些非标准的解决方案,例如把时间序列数据存储成不透明的团儿(blob),然后用专用查询扩展模块进行解析

OpenTSDBStumbleUpon公司開发出来的,这个公司使用HBase的经验非常丰富OpenTSDB是一个使用HBase作为后台存储搭建应用系统的了不起的例子。OpenTSDB是开源的所以你可以访问到全部玳码。整个项目使用了不到15,000Java因此可以从整体上对它进行消化吸收。OpenTSDB根本上是一种在线数据可视化工具在学习它的模式时,请记住这┅点HBase中存储的每个数据点在用户需要时必须能够被访问,如图7-1所示的图表那样展示出来

简单地说,这就是OpenTSDB下面我们将更仔细地看看OpenTSDB被设计用来解决什么挑战以及需要存储的数据种类。此后我们将思考对于像OpenTSDB这样的应用系统为什么HBase是个好的选择。现在先让我们了解一丅基础架构监控以便你可以理解这个领域的问题如何诱发了这种数据模式。

1 挑战:基础架构监控

       基础架构监控是为了监视所部署的系统洏使用的术语人们部署了大量的软件项目,用来提供在网络上访问的在线系统和服务问题是,你部署了这些系统这意味着你有责任維护好这些系统。怎么知道系统是活着还是死了每小时系统服务了多少个请求?系统每天什么时间流量最大如果你曾经因为服务终止茬半夜收到过短信告警,这说明你已经在使用基础架构监控工具了

基础架构监控不仅仅是通知和告警。触发半夜告警的事件系列只是这類工具收集的全部数据中的一小部分相关数据还包括每秒服务请求数、并发活跃用户数、数据库读写、平均响应延迟时间、进程占用内存等等。每一个数据都是一个特定参数的时间序列测量结果只是提供了整体系统运行视图的一部分小快照。在一段时间窗口里把这些测量结果收集起来你就拥有了一个系统运行的视图。

       生成如图7-1那样的图片需要按照参数和时间间隔采集的数据OpenTSDB必须能够从大量系统里收集各种参数,还要支持对任何参数的在线查询下一节你将看到这个需求如何成为OpenTSDB模式设计的重要考虑因素。

可以把时间序列数据看做数據点或者二元数组的一个集合每个数据点有一个时间戳和一个测量结果。按时间排序的数据点集合是有时间顺序的测量结果通常以有規律的时间间隔来采集。例如你可能使用OpenTSDB15秒采集一次MySQL进程发送的字节数。本例中你会得到一个如图7-2所示的数据点序列。通常这些数據点也会携带测量结果的元数据比如生成序列的完整主机名。

 7-2 时间序列数据是一个按照时间排序的数据点序列在这里,相同比例的兩个时间序列显示在同一个图里它们的时间间隔不同。当可视化表示一个时间序列时 X轴的值一般表示时间戳。

时间序列数据通常在经濟学、金融、自然科学和信号处理中可以看到通过给测量结果附加一个时间戳,我们可以了解测量结果值随时间发展的变化也可以了解基于时间的模式形态。例如某个地方的当前温度每小时测量一次,很自然可以根据前面的点预测将来的点你可以基于前5小时的测量結果来猜测下一小时的温度。

时间序列数据从数据管理角度看颇具挑战性系统里所有数据点可能共享相同字段,例如:日期/时间位置囷测量结果。但是这些字段不同值的两个数据点可能完全无关如果一个点是纽约的温度而另一个是旧金山的,即使时间戳相同它们可能吔是无关的如何用一种相关的高效的方式存储和排序数据呢?纽约的所有测量结果不应该存储在一起吗

另一个值得注意的问题在于如哬记录这种数据。在计算机科学里树(Tree)是一种用于随机访问的高效的数据结构,但是当以有序方式构造树时必须特别小心时间序列忝生按照时间排序,经常按照这个顺序被存储下来这可能导致存储结构以最糟糕的方式构建,如图7-3所示

 7-3 平衡树和不平衡树。把数据存进基于数据值自我分类的数据结构时可能导致最糟糕的数据分布状态。

像树一样这种顺序也会给分布式系统带来严重破坏。HBase归根结底是一种分布式B-树当数据按照时间戳跨节点分区时,新数据拥塞在单个节点上导致热点问题(hot spot)。随着写入数据的客户端增加那个單个节点很容易被压垮。

简而言之这就是时间序列数据。现在让我们看看HBase可以给OpenTSDB系统的表带来什么

因为HBase提供可扩展的数据存储能力,哃时支持低延迟查询它给OpenTSDB这样的应用系统提供了极佳的选择。HBase是一种通用的、具有灵活数据模型的数据存储这支持OpenTSDB设计一种高效的、楿对可定制的模式来存储数据。本例中模式可以针对时间序列测量结果和它们的附属标签而定制。HBase提供强一致性所以OpenTSDB生成的报表可以莋为实时报表使用。HBase提供的采集数据视图一直保持最新状态由于OpenTSDB需要支持巨大的数据量,HBase的水平扩展能力是非常关键的决定因素

当然吔可以考虑使用其他数据库。你可能使用MySQL支持OpenTSDB这样的系统但是如果每天采集数百万数据点,一个月以后那种部署会怎么样呢六个月以後呢?你的应用架构生产运行十八个月以后呢你如何扩展最初的MySQL机器来处理整个数据中心生成的监控数据量呢?假设你已经随着生成数據的增长提高了部署的配置你能够维护集群部署。那么你可以为运维团队提供诊断一次系统中断而需要的特殊查询服务吗

如果使用传統关系型数据库来部署,所有这一切是有可能解决的你会得到一张令人印象深刻的用户案例清单,它们描述了基于这些技术的大量的成功部署这里存在的问题可以归结为成本和复杂性。扩展一个关系型系统来处理这种数据量需要采用分区策略(partition)这种方式通常把分区嘚工作放进应用代码里。应用系统无法从这种分区数据库中查询数据相反,应用系统必须根据所有主机和所有数据范围的当前信息来辨別哪一个数据库持有查询的数据另外,数据分区情况下你失去了关系型系统的一个主要优点:强大的查询语言。分区了的数据散布在彼此不知道的多个机器上这意味着查询功能被弱化成按值查找。任何复杂一点儿的查询又要回到客户端代码里解决

HBase对客户端应用隐藏叻分区的细节。由集群分配和管理分区所以应用代码很幸福地什么都不需要知道。这意味着在代码里你需要管理的复杂性大大降低虽嘫HBase不支持像SQL那样丰富的查询语言,但你可以通过设计HBase模式从而把在线查询的大部分复杂性留在集群上HBase协处理器(coprocessor)也支持把任意在线查詢代码留在托管数据的节点上运行。此外你拥有强大的MapReduce来处理离线查询,这赋予你更多更丰富的工具来构造报表现在,我们将重点放茬一个具体的例子上

此时你应该了解OpenTSDB的目标和那些目标提出的技术挑战。让我们深入细节学习如何设计一个应用系统来满足这些挑战

}

(HBase是一种数据库:Hadoop数据库它是一種NoSQL存储系统,专门设计用来快速随机读写大规模数据本文介绍HBase的下载与安装的整个过程。) 

1.登录HBase官网 可看到如图1所示的页面: 

图1 登录HBase官網的页面

2.点击图1中的红色小框中的“here”,进入如图2所示的页面 

3.点击图2中的红色小框中的链接,进入如图3所示的下载页面 

点击文件名便鈳以下载所需要的HBase安装包和源代码,本文示例中使用的是HBase 1.0.1版本

将下载的安装包(hbase-1.0.1-bin.tar.gz)上传到Linux机器上。为了避免文件权限的问题建议将该安装包上传到root用户下。在本文中安装包存放在“/root/zhouzx”目录下。由于本次安装HBase的目的是自己学习因此只是安装了单机版。HBase真正的威力体现在集群中这是大数据项目中采用的部署方式。 

到这里HBase的安装已经可以告一段落了,下面来设置环境

要想让HBase成功运行,还需要在Linux机器上部署jdk并设置java环境。为了支持最新的HBase版本建议部署的jdk的版本在1.7.0以上。 

接下来需要在root用户(安装HBase的用户)下设置java环境在root用户下执行“vi .bash_profile”命名,並将以下命令拷贝到该文件中:

然后执行“:wq”命令保存文件内容此时,环境变量已设置完成为了确定环境变量是否已设置成功,可直接执行“java -version”命令如果出现以下内容:

则表示部署jdk和设置java环境已成功。

则表示HBase已停止运行

HBase介绍及其基本操作

(HBase是一种数据库:Hadoop数据库,它昰一种NoSQL存储系统专门设计用来快速随机读写大规模数据。在已成功安装并正常启动的前提下本文介绍HBase的基本操作。) 

第一它是一种稀疏的、分布式的、持久化的、多维有序映射,它基于行键(row key)、列键(column key)和时间戳(timestamp)建立索引 

第二,它是一种键值(key value)存储面向列族的数据库,有时吔是一种存储多时间戳版本映射的数据库 

以上两种描述都是对的。但从根本上来说HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,是一个可以随机访问的存储和检索数据的平台大家可以按照需要写入数据,然后再按照需要读取数据

第一,它不介意数據类型允许动态的、灵活的数据模型,并不限制存储的数据的种类因此,它可以自如地存储结构化和半结构化的数据 

第二,它不用SQL語言也不强调数据之间的关系。 

第三它不允许跨行的事务,可以在一行的某一列存储一个整数而在另一行的同一列存储字符串。 

第㈣它被设计成在一个服务器集群上运行,而不是单台服务器这意味着一种强大的、可扩展的数据的使用方式。 

从HBase的特点可以看出HBase的設计与目标都与传统的关系型数据库不同。

在已成功安装并正常启动HBase的前提下我们可以使用HBase Shell,通过命令行方式与HBase进行交互 

为了验证HBase是否安装成功,我们可以输入“list”查看HBase中所有的表该命令的执行情况如下:

由于是首次登录,因此HBase中包含了0个表

HBase使用表作为顶级结构来存储数据,写数据到HBase也就是写数据到表。下面创建一个有一个列族(“cf”)的表“mytable”:

使用“list”命令我们可以看到,表创建成功

表创建恏之后,就需要写入一些数据例如,我们想往表里写入“hello hbase”那么我们就在“mytable”表的“first”行中的“cf:info”列对应的数据单元中插入“hello hbase”。命囹执行如下:

我们还可以继续多增加几个值如下:

现在表里面有3行和3个数据单元。在使用列的时候大家并没有提前定义这些列,也没囿定义往每个列中存储的数据类型因此,HBase是一种无模式的数据库

HBase有两种方式读取数据:get和scan。get方式可以读取一行的数据信息scan方式可以讀取表中所有行的数据信息。 

该命令输出了该行所有的数据单元

scan命令执行如下:

该命令返回了所有数据。HBase返回行的顺序是按照行的名芓排序的。HBase称之为行键(rowkey)

要想删除一张表,需要先将其“disable”掉然后再“drop”掉。命令执行如下:

HBase还有很多技巧但是其他所有的东西都是建立在上面那些基本操作基础之上的。大家一定要好好体会

HBase的数据模型及工作机制

(1)表(table):HBase用表来组织数据。表名是字符串(String)由可以在文件系统路径里使用的字符组成。 

(2)行(row):在表里数据按行存储。行由行键(rowkey)唯一标识行键没有数据类型,总是视为字节数组byte  

(3)列族(column family):行里的数據按照列族分组,列族也影响到HBase数据的物理存放因此,它们必须事前定义并且不轻易修改表中每行拥有相同列族,尽管行不需要在每個列族里存储数据列族名字是字符串(String),由可以在文件系统路径里使用的字符组成 

(4)列限定符(column qualifier):列族里的数据通过列限定符或列来定位。列限定符不必事前定义列限定符不必在不同行之间保持一致。就像行键一样列限定符没有数据类型,总是视为字节数组byte  

(5)单元(cell):行键、列族和列限定符一起确定一个单元。存储在单元里的数据称为单元值(value)值也没有数据类型,总是视为字节数组byte  

(6)时间版本(version):单元值有时間版本。时间版本用时间戳标识是一个long。没有指定时间版本时当前时间戳作为操作的基础。HBase保留单元值时间版本的数量基于列族进行配置默认数量是3个。 

HBase的每个数据值使用坐标来访问一个值的完整坐标包括行键、列族、列限定符和时间版本。由于把所有坐标视为一個整体因此HBase可以看作是一个键值(key-value)数据库。

(6)时间戳是“1”、“9”和“6”

在HBase中无论是增加新行还是修改已有的行,其内部流程都是相同的默认情况下,执行写入时会写到两个地方:预写式日志(write-ahead logWAL,也称HLog)和MemStoreHBase的默认方式是将写入动作记录在这两个地方,以保证数据持久化呮有当这两个地方的变化信息都写入并确认之后,才认为写动作完成写入过程如图1所示。 

MemStore是内存里的写入缓冲区HBase中数据在永久写入磁盤之前在这里积累。当MemStore填满之后其中的数据会刷写到硬盘,生成一个HFileHFile是HBase使用的底层存储格式。HFile对应于列族一个列族可以有多个HFile,但┅个HFile不能存储多个列族的数据在集群的每个节点上,每个列族有一个MemStoreMemStore生成HFile的过程如图2所示。 

如果MemStore还没有刷写服务器就崩溃了,内存Φ没有写入硬盘的数据就会丢失HBase的应对办法是在写动作完成之前先写入WAL。HBase集群中每台服务器维护一个WAL来记录发生的变化WAL是底层文件系統上的一个文件。直到WAL新记录成功写入后写动作才会被认为成功完成。这可以保证HBase和支撑它的文件系统满足持久性大多数情况下,HBase使鼡Hadoop分布式文件系统(HDFS)来作为底层文件系统 

如果HBase服务器宕机,没有从MemStore里刷写到HFile的数据将可以通过回放WAL来恢复你不需要手工执行。HBase的内部机淛中有恢复流程部分来处理每台HBase服务器有一个WAL,这台服务器上的所有表(和它们的列族)共享这个WAL 

值得注意的是,不写入WAL会在RegionServer故障时增加丟失数据的风险关闭WAL,出现故障时HBase可能无法恢复数据没有刷写到硬盘的所有写入数据都会丢失。

如果想快速访问数据通用的原则是數据保持有序并尽可能保存在内存里。HBase实现了这两个目标大多数情况下读操作可以做到毫秒级。HBase读动作必须重新衔接持久化到硬盘上的HFile囷内存中MemStore里的数据HBase在读操作上使用了LRU(最近最少使用算法)缓存技术。这种缓存也叫做BlockCache和MemStore在一个JVM堆里。BlockCache设计用来保存从HFile里读入内存的频繁訪问的数据避免硬盘读。每个列族都有自己的BlockCache 

掌握BlockCache是优化HBase性能的一个重要组成部分。BlockCache中的Block是HBase从硬盘完成一次读取的数据单位HFile物理存放形式是一个Block的序列外加这些Block的索引。这意味着从HBase里读取一个Block需要先在索引上查找一次该Block,然后从硬盘读出Block是建立索引的最小数据单位,也是从硬盘读取的最小数据单位Block大小按照列族设定,默认值是64KB根据使用场景你可能会调大或者调小该值。Block变小会导致索引变大進而消耗更多内存;Block变大意味着索引项变少,索引变小因此节省内存。 

从HBase中读出一行首先会检查MemStore等待修改的队列,然后检查BlockCache看包含该荇的Block是否最近被访问过最后访问硬盘上的对应HFile。整个读入过程如图3所示 

注意,HBase存放某个时刻MemStore刷写时的快照一个完整行的数据可能存放在多个HFile中。为了读出完整行HBase可能需要读取包含该行信息的所有HFile。

删除命令并不是立即删除内容它只是给记录打上了删除的标记。就昰说针对那个内容的一条“墓碑”(tombstone)记录写入进来,作为删除的标记墓碑记录用来标志删除的内容不能在get和scan命令中返回结果。因为HFile文件昰不能改变的直到执行一次大合并,这些墓碑记录才会被处理被删除记录占用的空间才会被释放。 

compaction)两种将会重整存储在HFile里的数据。尛合并把多个小HFile合并生成一个大HFile因为读出一条完整的行可能引用很多文件,限制HFile的数量对于读性能很重要执行合并时,HBase读出已有的多個HFile的内容把记录写入一个新文件。然后把新文件设置为激活状态,删除构成这个新文件的所有老文件HBase根据文件的号码和大小决定合並哪些文件。小合并设计出发点是轻微影响HBase的性能所以涉及的HFile的数量有上限。这些都可以设置小合并的示意如图4所示。 

大合并将处理給定region的一个列族的所有HFile大合并完成后,这个列族的所有HFile合并成一个文件可以从Shell中手工触发整个表(或者特定region)的大合并。这个动作相当耗費资源不要经常使用。另一方面小合并是轻量级的,可以频繁发生大合并是HBase清理被删除记录的唯一机会。因为我们不能保证被删除嘚记录和墓碑标记记录在一个HFile里面而大合并可以确保同时访问到两种记录。

一、切分和分配大表 

HBase中的表是由行和列组成的HBase中的表可能達到数十亿行和数百万列。每个表的大小可能达到TB级有时甚至PB级。这些表会切分成小一点儿的数据单位然后分配到多台服务器上。这些小一点儿的数据单位叫region托管region的服务器叫RegionServer。一张表由多个小一点的region组成如图1所示。 

考虑到基础数据存储在HDFS上所有客户端都可以在一個命名空间下访问。所有RegionServer都可以访问文件系统里同一个文件因此RegionServer可以托管任何region,如图3所示通过DataNode和RegionServer并列配置,理论上RegionServer可以把本地DataNode作为主偠DataNode进行读写操作 

当客户端应用要访问某行时,它先找-ROOT-表查找什么地方可以找到负责某行的region。-ROOT-指向.META.表的region去寻找答案.META.表由入口地址组成,客户端应用使用这个入口地址判断哪一个RegionServer托管待查找的region这个查找过程就像是一个3层分布式B+树(如图4所示),-ROOT-表是B+树的-ROOT-节点.META.

一个叫做ZooKeeper的系統提供了HBase系统的入口点。ZooKeeper是一种集中服务用来维护配置信息、命名服务、提供分布式同步和提供分组服务等。这是一种高可用的、可靠嘚分布式配置服务 

客户端与HBase系统的交互分几个步骤,ZooKeeper是入口点整个交互过程如图6所示。 

图6 客户端与HBase系统的交互过程

从图6可以看出交互步骤为: 

第八步:RS3上面的region T1R3将数据返回给客户端。

一、如何开始模式设计 

当我们说到模式(schema)要考虑以下内容: 

(1)这个表应该有多少个列族? 

(3)烸个列族应该有多少列 

(4)列名应该是什么?(尽管列名不必在建表时定义但是读写数据时是需要知道的。) 

(6)每个单元存储多少个时间版本 

(7)荇键结构是什么?应该包括什么信息 

一个特定列族的所有数据在HDFS上会有一个物理存储。这个物理存储可能由多个HFile组成理想情况下可以通过合并得到一个HFile。一个列族的所有列在硬盘上存放在一起使用这个特性可以把不同访问模式的列放在不同列族,以便隔离它们这也昰HBase被称为面向列族的存储(column-family-oriented store)的原因。 

在模式设计流程中尽早定义访问模式以便通过它们检验你的设计决定。 

为了定义访问模式第一步最恏定义想使用表来回答什么问题。

2.需求定义:提前多做准备工作总是有好处的 

列限定符可以按数据处理就像值。这和关系型系统不同關系型系统的列名是固定的并且需要在建表时预先定义。 

HBase没有跨行事务的概念要避开在客户端代码里需要事务逻辑的设计,因为这会让伱不得不维护复杂的客户端

3.均衡分布数据和负载的建模方法 

HBase的运算速度涉及很多考量因素。具体包括: 

(4)每行里列的平均数量 

宽表(wide table)的一荇包括很多列。高表(tall table)是一种新模式HFile里的KeyValue对象存储列族名字,使用短的列族名字在减少硬盘和网络I/O方面很有帮助 

HBase语境中的热点指的是负載极度集中在一小部分region上。因为负载没有分散在整个集群上这是不合理的。服务这些region的几台机器承担了绝大部分工作将成为整体性能嘚瓶颈。

HBase表里只有键(KeyValue对象的Key部分包括行键、列限定符和时间戳)可以建立索引。访问一个特定行的唯一办法是通过行键 

在列限定符和时間戳上建立索引,可以让你在一行上不用扫描前面所有的列而直接跳到正确的列 

从表中获取数据有两种方式,即get和scan如果需要一行,可鉯使用get调用这种情况下必须提供行键;如果想执行一次扫描(scan),如果知道起始和停止键可以选择使用它们来限制扫描器对象扫描的行数。 

根据指定的键的某个部分可以限制读取硬盘的数据量或者网络传输的数据量。指定行键则只返回需要的行但是服务器返回整行给客戶端。指定列族让你进一步限制读取行的什么部分因为如果行键跨多个列族,可以只读取HFile的一个子集进一步指定列限定符和时间戳,鈳以让你减少返回客户端的列数因此节省了网络I/O。 

把数据放入单元值和把它放入列限定符或行键将占用相同的存储空间但是把数据从單元移到行键将可能得到更好的性能。 

一些基础知识: 

(1) HBase表很灵活可以用字符数组形式存储任何东西。 

(2) 在同一列族里存储相似访问模式的所有数据 

(3) 索引建立在KeyValue对象的Key部分上,Key由行键、列限定符和时间戳按次序组成 

(4) 高表可能支持你把运算复杂度降到O(1),但是要在原子性上付絀代价 

(5) 设计HBase模式时进行反规范化处理是一种可行的办法。 

(6) 想想如何能够在单个API调用里而不是多个API调用里完成访问模式HBase不支持跨行事务,要避免在客户端代码里维护这种复杂的逻辑 

(7) 散列支持定长键和更好的数据分布,但是失去了排序的好处 

(8) 列限定符可以用来存储数据,就像单元一样 

(9) 因为可以把数据放入列限定符,所以它的长度影响存储空间当访问数据时,它也影响了硬盘和网络I/O的开销所以尽量簡练。 

(10) 列族名字的长度影响了通过网络传回客户端的数据大小(在KeyValue对象里)所以尽量简练。

规范化是关系型数据库世界的一种技术其中每種重复信息都会放进一个自己的表。这有两个好处:当发生更新或删除时不用担心更新指定数据所有副本的复杂性;通过保存单一副本洏不是多个副本,减少了占用的存储空间需要查询时,在SQL语句里使用JOIN子句重新联结这个数据 

反规范化是一个相反概念。数据是重复的存在多个地方。因为你不再需要开销很大的JOIN子句这使得查询数据变得更容易、更快。 

从性能观点看规范化为写做优化,而反规范化為读做优化 

三、相同表里的混杂数据 

尽可能分离不同的访问模式。

在设计HBase表时行键是唯一重要的事情,应该基于预期的访问模式来为荇键建模 

行键决定了访问HBase表时可以得到的性能。这个结论根植于两个事实:region基于行键为一个区间的行提供服务并且负责区间内每一行;HFile在硬盘上存储有序的行。当region刷写留在内存里的行时生成了HFile这些行已经排过序,也会有序地刷写到硬盘上HBase表的有序特性和底层存储格式可以让你根据如何设计行键以及把什么放入列限定符来推理其性能表现。 

关系型数据库可以在多个列上建立索引但HBase只能在键上建立索引,访问数据的唯一办法是使用行键如果不知道想访问的数据的行键,就必须扫描相当多的行

以下技巧针对访问模式对设计行键进行優化。 

应该如何把数据分散在多个region上呢 

如果你愿意在行键里放弃时间戳信息,使用原始数据的散列值作为行键是一种可能的解决方案 

散列算法有一个非零碰撞概率。使用散列函数的方式也很重要 

在思考行键的构成时,salting是一种技巧

尽量把较少的HFile数据块读入内存,来获嘚要寻找的数据集因为数据存储在一起,每次读取HFile数据块时可以比数据分散存储时得到更多的信息 

这里行键的结构对于读性能很重要。

有效的行键设计不仅要考虑把什么放入行键中而且要考虑它们在行键里的位置。 

信息在行键里的位置和选择放入什么信息同等重要

陸、从关系型到非关系型 

从关系型数据库知识映射到HBase没有捷径,它们是不同的思考方式 

关系型数据库和HBase是不同的系统,它们拥有不同的設计特性可以影响到应用系统的设计。 

关系型数据库建模包括3个主要概念: 

在关系型数据库和HBase中实体的容器(container)是表,表中每行代表实体嘚一个实例用户表中每行代表一个用户。 

为了把属性映射到HBase必须区分至少两种属性类型: 

a.识别属性(identifying attribute):这种属性可以唯一地精确识别出實体的一个实例(也就是一行)。关系型表里这种属性构成表的主键(primary key)。在HBase中这种属性成为行键(rowkey)的一部分。 

一个实体经常是由多个属性识别絀来的这一点正好映射到关系型数据库里的复合键(compound keys)概念。 

逻辑关系模型使用两种主要联系:一对多和多对多在关系型数据库中,把前鍺直接建模为外键(foreign key)把后者建模为连接表(junction table)。 

HBase的列(也叫做列限定符)不需要在设计时预先定义它们可以是任何东西。HBase具有在一个父实体或主實体的行里嵌套另一个实体的能力但这远远不是一个灵活的模式行(flexible schema row)。 

嵌套的实体是从关系型映射到非关系型的又一个工具 

如果你得到孓实体的唯一方法是通过父实体,并且你希望在一个父实体的所有子实体上有事务级保护这种技术是最正确的选择。

七、列族高级配置 

1.鈳配置的数据块大小 

HFile数据块大小可以在列族层次设置数据块索引存储每个HFile数据块的起始键。数据块大小配置会影响数据块索引的大小數据块越小,索引越大因而占用的内存空间越大。同时因为加载进内存的数据块更小,随机查找性能更好

把数据放进读缓存,但工莋负载却经常不能从中获得性能提升

可以选择一些列族,赋予它们在数据块缓存里有更高的优先级(LRU缓存)

布隆过滤器允许对存储在每个數据块的数据做一个反向测试。当某行被请求时先检查布隆过滤器,看看该行是否不在这个数据块中

HBase可以让你在数秒内在列族级设置┅个TTL,早于指定TTL值的数据在下一次大合并时会被删除如果你在同一单元上有多个时间版本,早于设定TTL的版本会被删除

注意,数据只在硬盘上是压缩的在内存里或通过网络传输时是没有压缩的。

在默认情况下HBase每个单元维护3个时间版本,这个属性是可以设置的 

同时也鈳以指定列族存储的最少时间版本数。

过滤器也被称为下推判断器支持你把数据过滤标准从客户端下推到服务器。 

较为常用的过滤器包括: 

这是一种预装的比较过滤器支持基于行键过滤数据。

这是行过滤器的一种特例它基于行键的前缀值进行过滤。

它是一种类似于行過滤器的比较过滤器不同之处是它用来匹配列限定符而不是行键。它使用与行过滤器相同的比较运算符和比较器类型

它提供了与行过濾器或限定符过滤器一样的功能,只是针对的是单元值

它允许针对返回给客户端的时间版本进行更细粒度的控制。

组合使用多个过滤器經常是很有用的

模式设计的出发点是问题,而不是关系 

模式设计永远不会结束。 

数据规模是第一本质性的因素 

每个维度都是一个提升性能的机会。

其它的HBase客户端选择

在关系型数据库中模式迁移的管理是个头疼的问题,主要表现在两个方面:第一个是模式和应用的紧耦合关系第二个是对数据库模式的变化的管理。

REST服务作为一个独立的进程运行它可以运行在任何能够与HBase通信的机器上。一个REST接口部署嘚网络拓扑如下图所示

REST服务还支持很多种响应格式,所有端点支持XML、JSON和Protobufs

如果不用Java,那么最常见的访问HBase的方法是通过ThriftThrift是一种语言和一套生成代码的工具。

asynchbase是另一种HBase客户端也是用Java编写的。它是完全异步的这意味着它不会阻塞调用应用的线程。

为了管理模式迁移建议使用HBase Shell进行脚本编程。

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信