大数据技术基础教程 课件 第5章 分布式数据库HBase_第1页
大数据技术基础教程 课件 第5章 分布式数据库HBase_第2页
大数据技术基础教程 课件 第5章 分布式数据库HBase_第3页
大数据技术基础教程 课件 第5章 分布式数据库HBase_第4页
大数据技术基础教程 课件 第5章 分布式数据库HBase_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章分布式数据库HBase《大数据技术基础教程》学习目标/Target掌握HBase的数据模型和系统架构掌握HBase的读写流程掌握HBase相关的shell命令和API编程章节概述/

SummaryHBase是目前非常热门的一款分布式KV(KeyValue,键值)数据库系统,无论是互联网行业,还是其他传统IT行业都在大量使用。尤其是近几年随着国内大数据理念的普及,HBase凭借其高可靠、易扩展、高性能以及成熟的社区支持,受到越来越多企业的青睐。许多大数据系统都将HBase作为底层数据存储服务本章将简要介绍HBase简介、HBase数据模型、HBase系统架构、HBase数据读写流程和HBase编程实践。目录/Contents01020304HBase简介HBase数据模型HBase系统架构HBase读写流程05HBase编程实践HBase简介5.15.1HBase简介5.1.1Hbase的发展及现状2003年Google在SOSP会议上发表了大数据历史上第一篇公认的革命性论文——《GFS:TheGoogleFileSystem》2004年,Google又发表了另一篇非常重要的论文——《MapReduce:SimplefiedDataProcessingonLargeClusters》2006年,Google发布了第三篇重要论文——《BigTable:ADistributedStorageSystemforStructuredData》,用于解决Google内部海量结构化数据的存储以及高效读写问题5.1HBase简介5.1.1Hbase的发展及现状Google的三篇论文论证了在大量廉价机器上存储、处理海量数据(结构化数据、非结构化数据)是可行的,遗憾的是,Yahoo并没有给出开源方案。2004年,DougCutting和MikeCafarella在为他们的搜索引擎爬虫(Nutch)实现分布式架构的时候看到了Google的上述两篇论文。他们在之后的几个月里按照论文,实现出一个简易版的HDFS和MapReduce,这也就是Hadoop的最早起源。5.1HBase简介5.1.2Hbase应用场景Facebook用户交互数据淘宝TLog小米云服务用户行为数据存储HBase数据模型5.25.2HBase数据模型5.2.1HBase逻辑视图NameSpace:命名空间,类似于关系型数据库的database概念,每个命名空间下有多个表,HBASE有两个自带的命名空间,分别是HBASE和default,HBASE中存放的是HBASE内置的表(系统内建表,包含namespace和meta表:存的是用户表或系统表位置信息),default表是用户默认的使用的命名空间(用户建表时未指定namespace的表都创建在此)。Region(表的切片):HBase表的分片,HBase表会根据RowKey值被切分成不同的region存储在RegionServer中,在一个RegionServer中可以有多个不同的region。5.2HBase数据模型5.2.1HBase逻辑视图table:表,一个表包含多行数据。row:行,在HBase表里,每一行数据代表一个数据对象,每一行都有一个行键(RowKey)来进行唯一标识(不可分割的字节数组,且按照字典排序[ASCII码]由低到高存储),每一行都有一个rowkey和多个column(列)组成。在HBase中针对行键建立索引,提高检索数据的速度。5.2HBase数据模型5.2.1HBase逻辑视图column:列,与关系型数据库中的列不同,HBase中的column由columnfamily(列簇)以及qualifier(列名)两部分组成,两者中间使用":"相连。比如contents:html,其中contents为列簇,html为列簇下具体的一列。columnfamily在表创建的时候需要指定,用户不能随意增减。一个columnfamily下可以设置任意多个qualifier,因此可以理解为HBase中的列可以动态增加,理论上甚至可以扩展到上百万列。5.2HBase数据模型5.2.1HBase逻辑视图Store:每一个region有一个或多个store组成,至少有一个store,hbase会把一起访问的数据放在一个store里面,即为每个ColumnFamily建一个store(即有几个ColumnFamily,也就有几个Store)。一个Store由一个memStore、0或多个StoreFile组成。5.2HBase数据模型5.2.1HBase逻辑视图timestamp:时间戳,每个cell在写入HBase的时候都会默认分配一个时间戳作为该cell的版本,当然,用户也可以在写入的时候自带时间戳。HBase支持多版本特性,即同一rowkey、column下可以有多个value存在,这些value使用timestamp作为版本号,版本越大,表示数据越新。cell:单元格,由五元组(row,column,timestamp,type,value)组成的结构,其中type表示Put/Delete这样的操作类型,timestamp代表这个cell的版本。这个结构在数据库中实际是以KV结构存储的,其中(row,column,timestamp,type)是K,value字段对应KV结构的V。5.2HBase数据模型5.2.1HBase逻辑视图HBase引入了列簇的概念,列簇下的列可以动态扩展。另外,HBase使用时间戳实现了数据的多版本支持5.2HBase数据模型5.2.1HBase逻辑视图HBase是一个多维、稀疏、排序的表。多维:HBase中的Map与普通Map最大的不同在于,key是一个复合数据结构,由多维元素构成,包括rowkey、columnfamily、qualifier、type以及timestamp。稀疏:在其他数据库中,对于空值的处理一般都会填充null,而对于HBase,空值不需要任何填充。这个特性为什么重要?因为HBase的列在理论上是允许无限扩展的,对于成百万列的表来说,通常都会存在大量的空值,如果使用填充null的策略,势必会造成大量空间的浪费。因此稀疏性是HBase的列可以无限扩展的一个重要条件。5.2HBase数据模型5.2.1HBase逻辑视图HBase是一个多维、稀疏、排序、分布式存储的表。排序:构成HBase的KV在同一个文件中都是有序的,但规则并不是仅仅按照rowkey排序,而是按照KV中的key进行排序—先比较rowkey,rowkey小的排在前面;如果rowkey相同,再比较column,即columnfamily:qualifier,column小的排在前面;如果column还相同,再比较时间戳timestamp,即版本信息,timestamp大的排在前面。这样的多维元素排序规则对于提升HBase的读取性能至关重要,在后面读取章节会详细分析。分布式:构成HBase的所有Map并不集中在某台机器上,而是分布在整个集群中。5.2HBase数据模型5.2.2HBase物理视图与大多数数据库系统不同,HBase中的数据是按照列簇存储的,即将数据按照列簇分别存储在不同的目录中。列簇anchor的所有数据存储在一起形成5.2HBase数据模型5.2.2HBase物理视图与大多数数据库系统不同,HBase中的数据是按照列簇存储的,即将数据按照列簇分别存储在不同的目录中。列簇contents的所有数据存储在一起形成:5.2HBase数据模型5.2.3行式存储、列式存储、列簇式存储为什么HBase要将数据按照列簇分别存储?行式存储:行式存储系统会将一行数据存储在一起,一行数据写完之后再接着写下一行,最典型的如MySQL这类关系型数据库5.2HBase数据模型5.2.3行式存储、列式存储、列簇式存储为什么HBase要将数据按照列簇分别存储?列式存储:列式存储理论上会将一列数据存储在一起,不同列的数据分别集中存储,最典型的如Kudu、ParquetonHDFS等系统(文件格式)5.2HBase数据模型5.2.3行式存储、列式存储、列簇式存储为什么HBase要将数据按照列簇分别存储?列簇式存储:从概念上来说,列簇式存储介于行式存储和列式存储之间,可以通过不同的设计思路在行式存储和列式存储两者之间相互切换。比如,一张表只设置一个列簇,这个列簇包含所有用户的列。HBase中一个列簇的数据是存储在一起的,因此这种设计模式就等同于行式存储。再比如,一张表设置大量列族,每个列簇下仅有一列,很显然这种设计模式就等同于列式存储。HBase系统架构5.35.3HBase系统架构离线分析系统HBase体系结构借鉴了BigTable论文,是典型的Master-Slave模型。系统中有一个管理集群的Master节点以及大量实际服务用户读写的RegionServer节点。除此之外,HBase中所有数据最终都存储在HDFS系统中,这与BigTable实际数据存储在GFS中相对应;系统中还有一个ZooKeeper节点,协助Master对集群进行管理。5.3HBase系统架构5.3.1ClientHBase客户端(Client)提供了Shell命令行接口、原生JavaAPI编程接口、Thrift/RESTAPI编程接口以及MapReduce编程接口。HBase客户端支持所有常见的DML操作以及DDL操作,即数据的增删改查和表的日常维护等。其中Thrift/RESTAPI主要用于支持非Java的上层业务需求,MapReduce接口主要用于批量数据导入以及批量数据读取。5.3HBase系统架构5.3.2ZookeeperZooKeeper(ZK)也是ApacheHadoop的一个顶级项目,基于Google的Chubby开源实现,主要用于协调管理分布式应用程序。在HBase系统中,ZooKeeper扮演着非常重要的角色。实现Master高可用管理系统核心元数据

参与RegionServer宕机恢复。实现分布式表锁5.3HBase系统架构5.3.3HMasteHBase集群中有若干台计算机,其中有一台是“主机(Master)”,其余的都是“从机(Slaver)”。一般在生产系统中,还会有一台“备用主机(backupmaster)”。这个HMaster进程,就是运行在“主机”上的。准确的说,应该是HMaster在哪一台计算机上运行,哪一台计算机就是“主机”.

分发Region

监控HRegionServer

管理元数据5.3HBase系统架构5.3.4HRegeionServeRegionServer主要用来响应用户的IO请求,是HBase中最核心的模块,由WAL(HLog)、BlockCache以及多个Region构成.WAL(HLog):HLog在HBase中有两个核心作用:其一,用于实现数据的高可靠性,HBase数据随机写入时,并非直接写入HFile数据文件,而是先写入缓存,再异步刷新落盘。为了防止缓存数据丢失,数据写入缓存之前需要首先顺序写入HLog,这样,即使缓存数据丢失,仍然可以通过HLog日志恢复;其二,用于实现HBase集群间主从复制,通过回放主集群推送过来的HLog日志实现主从复制。5.3HBase系统架构5.3.4HRegeionServeRegionServer主要用来响应用户的IO请求,是HBase中最核心的模块,由WAL(HLog)、BlockCache以及多个Region构成.BlockCache:HBase系统中的读缓存。客户端从磁盘读取数据之后通常会将数据缓存到系统内存中,后续访问同一行数据可以直接从内存中获取而不需要访问磁盘。对于带有大量热点读的业务请求来说,缓存机制会带来极大的性能提升。5.3HBase系统架构5.3.4HRegeionServeRegion:数据表的一个分片,当数据表大小超过一定阈值就会“水平切分”,分裂为两个Region。Region是集群负载均衡的基本单位。通常一张表的Region会分布在整个集群的多台RegionServer上,一个RegionServer上会管理多个Region,当然,这些Region一般来自不同的数据表。HBase表结构设计5.45.4HBase表结构设计5.4.1命名空间设计针对hbase使用较多数据量较大的业务,可以将数据放在单独的namespace中单独管理,入库的时候tablename使用namespace:tablename的方式来处理。针对hbase使用较少数据量较少的业务,可以将数据放在default的namespace中统一管理,入库的时候直接单独使用tablename方式来处理。5.4HBase表结构设计5.4.2rowkey设计rowkey设计根本上还是需要解决或者避免可能出现的各种问题getorscan?如何避免数据热点?如何优化HBase硬盘占用量?对于时序数据,如何能快速的取到最新一条?5.4HBase表结构设计5.4.2rowkey设计table预分区

按照Hash对table进行预分区

按照业务标识字段进行预分区Rowkey尽可能设计的短

Rowkey最大长度64kb,但是实际应用中一般为10-100bytes5.4HBase表结构设计5.4.3列族设计列族是设计是在建表阶段需要完成的,也是表属性需要集中配置的维度,主要有下面的内容供参考:(1)VERSIONS(2)BLOOMFILTER(3)TTL(TimeToLive)(4)COMPRESSION&DATA_BLOCK_ENCODING(5)BLOCKSIZE(6)DFS_REPLICATION(7)IN_MEMORY5.4HBase表结构设计5.4.4列设计由于HBase是弱schema的结构,所以列相关的配置不在建表时指定,而是在数据写入的时候自动指定。而HBase的稀疏存储更是支持业务上定义大量的列,然后查询的时候指定列名进行精确查询,取到需要的数据。这种设计很符合HBase的特点以及设计理念。但是按照上文所说,HBase底层是按照cell存储的,cell的越多,rowkey以及columnfamily的冗余存储就越大,浪费了缓存资源和硬盘资源,所以给出的建议是在充分发挥HBase的特点的同时尽量减少列的数量。HBase数据读写流程5.55.5HBase数据读写流程5.5.1HBase数据写流程(1)客户端处理阶段:客户端将用户的写入请求进行预处理,并根据集群元数据定位写入数据所在的RegionServer,将请求发送给对应的RegionServer。(2)Region写入阶段:RegionServer接收到写入请求之后将数据解析出来,首先写入HLog,再写入对应Region列簇的MemStore。(3)MemStoreFlush阶段:当Region中MemStore容量超过一定阈值,系统会异步执行flush操作,将内存中的数据写入文件,形成HFile。5.5HBase数据读写流程5.5.1HBase数据写流程HBase写入流程5.5HBase数据读写流程5.5.2HBase数据读流程首先从ZooKeeper中读取-ROOT-表所在的RegionServer然后从该HRegionServer中根据请求的TableName,RowKey读取.META.表所在的HRegionServer最后从该HRegionServer中读取.META.表的内容而获取此次请求需要访问的HRegion所在的位置,然后访问该HRegionServer获取请求的数据三层寻址5.5HBase数据读写流程5.5.2HBase数据读流程(1)用户通过查找zk(zookeeper)的/hbase/meta-region-server节点查询哪台RegionServer上有hbase:meta表。(2)客户端连接含有hbase:meta表的RegionServer。Hbase:meta表存储了所有Region的行键范围信息,通过这个表就可以查询出你要存取的rowkey属于哪个Region的范围里面,以及这个Region又是属于哪个RegionServer。5.5HBase数据读写流程5.5.2HBase数据读流程(3)获取这些信息后,客户端就可以直连其中一台拥有你要存取的rowkey的RegionServer,并直接对其操作。(4)客户端会把meta信息缓存起来,下次操作就不需要进行以上加载HBase:meta的步骤了。HBase编程实践5.65.6HBase编程实践5.6.1HBase常用shell命令HBaseShell常用命令命名描述语法help‘命名名’查看命令的使用描述help‘命令名’whoami我是谁whoamiversion返回hbase版本信息versionstatus返回hbase集群的状态信息statustable_help查看如何操作表table_helpcreate创建表create‘表名’,‘列族名1’,‘列族名2’,‘列族名N’alter修改列族添加一个列族:alter‘表名’,‘列族名’删除列族:alter‘表名’,{NAME=>‘列族名’,METHOD=>‘delete’}5.6HBase编程实践5.6.1HBase常用shell命令HBaseShell常用命令命名描述语法describe显示表相关的详细信息describe‘表名’list列出hbase中存在的所有表listexists测试表是否存在exists‘表名’put添加或修改的表的值

put‘表名’,‘行键’,‘列族名’,‘列值’put‘表名’,‘行键’,‘列族名:列名’,‘列值’scan通过对表的扫描来获取对用的值scan‘表名’扫描某个列族:scan‘表名’,{COLUMN=>‘列族名’}扫描某个列族的某个列:scan‘表名’,{COLUMN=>‘列族名:列名’}查询同一个列族的多个列:scan‘表名’,{COLUMNS=>[‘列族名1:列名1’,‘列族名1:列名2’,…]}get获取行或单元(cell)的值get‘表名’,‘行键’

get‘表名’,‘行键’,‘列族名’count统计表中行的数量count‘表名’5.6HBase编程实践5.6.1HBase常用shell命令HBaseShell常用命令命名描述语法incr增加指定表行或列的值incr‘表名’,‘行键’,‘列族:列名’,步长值get_counter获取计数器get_counter‘表名’,‘行键’,‘列族:列名’delete删除指定对象的值(可以为表,行,列对应的值,另外也可以指定时间戳的值)删除列族的某个列:delete‘表名’,‘行键’,‘列族名:列名’deleteall删除指定行的所有元素值deleteall‘表名’,‘行键’truncate重新创建指定表truncate‘表名’enable使表有效enable‘表名’is_enabled是否启用is_enabled‘表名’disable使表无效disable‘表名’is_disabled是否无效is_disabled‘表名’drop删除表drop的表必须是disable的5.6HBase编程实践5.6.2HBase常用JavaAPI及示例HBase提供了丰富的JavaAPI接口供用户使用,可以通过HBaseJavaAPI完成和HBaseShell相同的功能。(1)连接HBaseJava连接HBase需要两个类:HBaseConfiguration和ConnectionFactory

Configurationconfig=HBaseConfiguration.create();

//使用create()静态方法就可以得到Configuration对象通过ConnectionFactory(连接工厂)的方法我们就能获取到Connection(连接对象)了。具体用法:Connectionconnection=ConnectionFactory.createConnection(config);//config为前文的配置对象5.6HBase编程实践5.6.2HBase常用JavaAPI及示例(2)创建表TableNametableName=TableName.valueOf("test");//定义表名//TableDescriptor对象通过TableDescriptorBuilder构建;TableDescriptorBuildertableDescriptor=TableDescriptorBuilder.newBuilder(tableName);ColumnFamilyDescriptorfamily=ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("data")).build();//构建列族对象tableDescriptor.setColumnFamily(family);//设置列族admin.createTable(tableDescriptor.build());//创建表5.6HBase编程实践5.6.2HBase常用JavaAPI及示例(3)添加数据Tabletable=connection.getTable(tableName);//获取Table对象try{byte[]row=Bytes.toBytes("row1");//定义行Putput=newPut(row);//创建Put对象byte[]columnFamily=Bytes.toBytes("data");//列簇byte[]qualifier=Bytes.toBytes(String.valueOf(1));//列byte[]value=Bytes.toBytes("张三丰");//值put.addColumn(columnFamily,qualifier,value);table.put(put);//向表中添加数据}finally{//使用完了要释放资源table.close();}5.6HBase编程实践5.6.2HBase常用JavaAPI及示例(4)获取指定行的数据Getget=newGe

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论