您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > 细细品味Hadoop_Hadoop集群(第11期副刊)_HBase之旅
细细品味Hadoop——Hadoop集群(第11期副刊)精华集锦csAxp虾皮工作室年7月3日创建时间:2012/3/21修改时间:2012/3/21修改次数:0Hadoop集群(第11期副刊)——HBase之旅(TaobaoQATeam)1、HTable基本概念1.1引言团队中使用HBase的项目多了起来,对于业务人员而言,通常并不需要从头搭建、维护一套HBase的集群环境,对于其架构细节也不一定要深刻理解(交由HBase集群维护团队负责),迫切需要的是快速理解基本技术来解决业务问题。最近在XX项目轮岗过程中,尝试着从业务人员视角去看HBase,将一些过程记录下来,期望对快速了解HBase、掌握相关技术来开展工作的业务人员有点帮助。我觉得作为一个初次接触HBase的业务开发测试人员,他需要迫切掌握的至少包含以下几点:深入理解HTable,掌握如何结合业务设计高性能的HTable掌握与HBase的交互,反正是离不开数据的增删改查,通过HBaseShell命令及JavaApi都是需要的掌握如何用MapReduce分析HBase里的数据,HBase里的数据总要分析的,用MapReduce是其中一种方式掌握如何测试HBaseMapReduce,总不能光写不管正确性吧,debug是需要的吧,看看如何在本机单测debug吧本系列将围绕以上几点展开,篇幅较长,如果是HBase初学者建议边读边练,对于HBase比较熟练的,可以选读下,比如关注下HBase的MapReduce及其测试方法。1.2从一个示例说起传统的关系型数据库想必大家都不陌生,我们将以一个简单的例子来说明使用RDBMS和HBase各自的解决方式及优缺点。以博文为例,RDBMS的表设计如下:为了方便理解,我们以一些数据示例下:河北工业大学——软件工程与理论实验室整理:虾皮1创建时间:2012/3/21修改时间:2012/3/21修改次数:0上面的例子,我们用HBase可以按以下方式设计:同样为了方便理解,我们以一些数据示例下,同时用红色标出了一些关键概念,后面会解释。河北工业大学——软件工程与理论实验室整理:虾皮2创建时间:2012/3/21修改时间:2012/3/21修改次数:01.3一些HTable基本概念Rowkey行主键,HBase不支持条件查询和Orderby等查询,读取记录只能按Rowkey(及其range)或全表扫描,因此Rowkey需要根据业务来设计以利用其存储排序特性(Table按Rowkey字典序排序如1,10,100,11,2)提高性能。ColumnFamily(列族)在表创建时声明,每个ColumnFamily为一个存储单元。在上例中设计了一个HBase表blog,该表有两个列族:article和author。Column(列)HBase的每个列都属于一个列族,以列族名为前缀,如列article:title和article:content属于article列族,author:name和author:nickname属于author列族。Column不用创建表时定义即可以动态新增,同一ColumnFamily的Columns会群聚在一个存储单元上,并依Columnkey排序,因此设计时应将具有相同I/O特性的Column设计在一个ColumnFamily上以提高性能。TimestampHBase通过row和column确定一份数据,这份数据的值可能有多个版本,不同版本的值按照时间倒序排序,即最新的数据排在最前面,查询时默认返回最新版本。如上例中rowkey=1的author:nickname值有两个版本,分别为1317180070811对应的“一叶渡江”和1317180718830对应的“yedu”(对应到实际业务可以理解为在某时刻修改了nickname为yedu,但旧值仍然存在)。Timestamp默认为系统当前时间(精确到毫秒),也可以在写入数据时指定该值。Value每个值通过4个键唯一索引,tableName+RowKey+ColumnKey+Timestamp=value,例如上例中{tableName=’blog’,RowKey=’1’,ColumnName=’author:nickname’,Timestamp=’1317180718830’}索引到的唯一值是“yedu”。存储类型TableName是字符串RowKey和ColumnName是二进制值(Java类型byte[])Timestamp是一个64位整数(Java类型long)value是一个字节数组(Java类型byte[])。存储结构即HTable按Rowkey自动排序,每个Row包含任意数量个Columns,Columns之间按Columnkey自动排序,每个Column包含任意数量个Values。理解该存储结构将有助于查询结果的迭代。可以简单的将HTable的存储结构理解为:河北工业大学——软件工程与理论实验室整理:虾皮3创建时间:2012/3/21修改时间:2012/3/21修改次数:01.4话说什么情况需要HBase半结构化或非结构化数据对于数据结构字段不够确定或杂乱无章很难按一个概念去进行抽取的数据适合用HBase。以上面的例子为例,当业务发展需要存储author的email,phone,address信息时RDBMS需要停机维护,而HBase支持动态增加。记录非常稀疏RDBMS的行有多少列是固定的,为null的列浪费了存储空间。而如上文提到的,HBase为null的Column不会被存储,这样既节省了空间又提高了读性能。多版本数据如上文提到的根据Rowkey和Columnkey定位到的Value可以有任意数量的版本值,因此对于需要存储变动历史记录的数据,用HBase就非常方便了。比如上例中的author的Address是会变动的,业务上一般只需要最新的值,但有时可能需要查询到历史值。超大数据量当数据量越来越大,RDBMS数据库撑不住了,就出现了读写分离策略,通过一个Master专门负责写操作,多个Slave负责读操作,服务器成本倍增。随着压力增加,Master撑不住了,这时就要分库了,把关联不大的数据分开部署,一些join查询不能用了,需要借助中间层。随着数据量的进一步增加,一个表的记录越来越大,查询就变得很慢,于是又得搞分表,比如按ID取模分成多个表以减少单个表的记录数。经历过这些事的人都知道过程是多么的折腾。采用HBase就简单了,只需要加机器即可,HBase会自动水平切分扩展,跟Hadoop的无缝集成保障了其数据可靠性(HDFS)和海量数据分析的高性能(MapReduce)。1.5小结本文主要介绍了一些HTable的基本概念,通过示例和图解及与RDBMS的对比以方便加深理解,读完此文应该对HTable的设计和结构及什么时候应该使用HBase有一定的认识,在下篇文章中将通过操作练习来加深这方面的知识。河北工业大学——软件工程与理论实验室整理:虾皮4创建时间:2012/3/21修改时间:2012/3/21修改次数:02、通过HBaseShell与HBase交互2.1引言HBase提供了丰富的访问接口。HBaseShellJavaclietnAPIJython、GroovyDSL、ScalaRESTThrift(Ruby、Python、Perl、C++…)MapReduceHive/Pig其中HBaseShell是常用的便捷方式,我们将结合本系列上一篇文章的理论分析来实践一把,依然采用blog表示例。首先你需要一个HBase的环境,如果需要自己搭建可以参考:://hbase.apache.org/book/notsoquick.html如果你在windows环境下配置cygwin及ssh遇到问题可以参考:=106332.2基本操作进入HBaseshell控制台bin/hbaseshell河北工业大学——软件工程与理论实验室整理:虾皮5创建时间:2012/3/21修改时间:2012/3/21修改次数:0看来控制台是靠jruby语言解析的。输入“help”可以快速扫描下支持那些命令。创建表create'blog','article','author'知识点回顾:ColumnFamily是schema的一部分,而Column不是。这里的article和author是ColumnFamily。增加记录put'blog','1','article:title,'HeadFirstHBase'put'blog','1','article:content','HBaseistheHadoopdatabase.Useitwhenyouneedrandom,realtimeread/writeaccesstoyourBigData.'put'blog','1','article:tags','Hadoop,HBase,NoSQL'put'blog','1','author:name','hujinjun'put'blog','1','author:nickname',’一叶渡江’知识点回顾:Column完全动态扩展,每行可以有不同的Columns。根据RowKey查询get'blog','1'知识点回顾:HTable按RowKey字典序(1,10,100,11,2)自动排序,每行包含任意数量的Columns,Columns按ColumnKey(article:content,article:tags,article:title,author:name,author:nickname)自动排序。更新练习1)查询下更新前的值:get‘blog’,’1’,’author:nickname’河北工业大学——软件工程与理论实验室整理:虾皮6创建时间:2012/3/21修改时间:2012/3/21修改次数:02)更新nickname为‘yedu’:put‘blog’,’1’,’ahthor:nickname’,’yedu’3)查询更新后的结果:get‘blog’,’1’,’author:nickname’知识点回顾:查询默认返回最近的值。3)查询nickname的多个(本示例为2个)版本值:get'blog','1',{COLUMN='author:nickname',VERSIONS=2}知识点回顾:每个Column可以有任意数量的Values,按Timestamp倒序自动排序。4)如何只查询到以前的旧版本呢,需要借助Timestamp:get'blog','1',{COLUMN='author:nickname',TIMESTAMP=1317180070811}河北工业大学——软件工程与理论实验室整理:虾皮7创建时间:2012/3/21修改时间:2012/3/21修改次数:0知识点回顾:TabelName+RowKey+Column+Timestamp=Value删除记录1)delete只能删除一个column:delete'blog','1','author:nickname'2)删除RowKey的所有column用deleteall:deleteall‘blog’,’1’删除表练习完毕,把练习表删了吧,删除之前需要先disable:disable‘blog’drop‘blog’2.3小结本文演示了通过HBaseshell创建、删除表及对记录的增删改查,可以参照操作结果对回顾的知识点进一步理解掌握,在本系列下一篇文章中讲演示如何通过Javaapi来与HBase交互。3、通过JavaApi与HBase交互3.1引言HBase提供了JavaApi的访问接口,掌握这个就跟
本文标题:细细品味Hadoop_Hadoop集群(第11期副刊)_HBase之旅
链接地址:https://www.777doc.com/doc-3128386 .html