版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第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=newGet(Bytes.toBytes("row1"));//定义get对象Resultresult=table.get(get);//通过table对象获取数据System.out.println("Result:"+result);//很多时候我们只需要获取“值”这里表示获取data:1列族的值byte[]valueBytes=result.getValue(Bytes.toBytes("data"),Bytes.toBytes("1"));//获取到的是字节数组//将字节转成字符串StringvalueStr=newString(valueBytes,"utf-8");System.out.println("value:"+valueStr);5.6HBase编程实践5.6.2HBase常用JavaAPI及示例(5)扫描表中的数据1. Scanscan=newScan();2. ResultScannerscanner=table.getScanner(scan);3. try{4. for(ResultscannerResult:scanner){5. System.out.println("Scan:"+scannerResult);6. byte[]row=scannerResult.getRow();7. System.out.println("rowName:"+newString(row,"utf-8"));8. }9. }finally{10. scanner.close();11. }5.6HBase编程实践5.6.2HBase常用JavaAPI及示例(6)删除表TableNametableName=TableName.valueOf("test");admin.disableTable(tableName);//禁用表admin.deleteTable(tableName);//删除表本章小结本章简要介绍了NoSQL数据库HBase的发展现状和应用场景,详细介绍了HBase的数据模型、系统架构、表的结构设计以及HBase的读写流程等基本理论知识,最后介绍了HBase的shell编程命令和主要的JavaAPI使用。通过本章的学习,主要掌握HBase的基本理论知识,并能够解决简单的对数据CRUD的操作。第六章分布式计算框架MapReduce《大数据技术基础教程》学习目标/Target了解MapReduce简介
理解MapReduce计算模型理解MapReduce工作原理掌握MapReduce编程实践章节概述/
SummaryMapReduce是Hadoop的一个核心组成框架,使用该框架编写的应用程序能够以一种可靠的、容错的方式并行处理大型集群(数千个节点)上的大量数据(TB级别以上),也可以对大数据进行加工、挖掘和优化等处理。目录/Contents010203MapReduce简介MapReduce计算模型MapReduce工作原理04MapReduce编程实践MapReduce简介11.1MapReduce简介Hadoop的MapReduce核⼼技术起源于⾕歌在2004年发表的关于MapReduce系统的论⽂介绍。Hadoop实现了Google的MapReduce编程模型,提供了简单易用的编程接口,也提供了它自己的分布式文件系统HDFS,与Google不同的是,Hadoop是开源的,任何人都可以使用这个框架来进行并行编程。MapReduce将复杂的、运行于大规模集群上的并行计算过程高度地抽象到了两个函数:Map和Reduce。概念“Map(映射)”和“Reduce(归约)”,以及它们的主要思想,都是从函数式编程语言里借来的,同时包含了从矢量编程语言里借来的特性。MapReduce计算模型22.1MapReduce计算模型在Hadoop中,用于执行计算任务(MapReduce任务)的机器有两个角色:一个是JobTracker,一个是TaskTracker,前者用于管理和调度工作,后者用于执行工作。每次计算任务都可以分为两个阶段,Map阶段和Reduce阶段。其中,Map阶段接收一组键值对模式<key,Value>的输入并产生同样是键值对模式的另一个或一批<key,Value>的中间输出;Reduce阶段负责接收Map产生的中间输出<key,Value>,然后对这个结果进行处理并输出结果。2.1MapReduce计算模型MapReduce工作原理33.11.x架构MapReduce1.x采用Master/Slave架构,由全局唯一的Jobtracker和多个TaskTacker组成,并且在Client中提供一系列的api供编程和管理使用。3.11.x架构MapReduce的完整流程为:第一步:读取文件,解析成为<key,value>对;第二步:自定义map逻辑接收<k1,v1>,转换成为新的<k2,v2>输出;第三步:分区Partition。将相同key的数据发送到同一个reduce里面去;第四步:排序,map阶段分区内的数据进行排序;第五步:combiner。调优过程,对数据进行map阶段的合并;第六步:将环形缓冲区的数据进行溢写到本地磁盘小文件;第七步:归并排序,对本地磁盘溢写小文件进行归并排序;3.11.x架构MapReduce的完整流程为:第九步:reduceTask启动线程拉取属于自己分区的数据;第十步:从mapTask拉取回来的数据继续进行归并排序;第十一步:进行groupingComparator分组操作;第十二步:调用reduce逻辑,写出数据;第十三步:通过outputFormat进行数据输出,写到文件,一个reduceTask对应一个文件。3.22.x架构(YARN架构)3.22.x架构(YARN架构)①用户编写客户端应用程序,向YARN提交应用程序,提交的内容包括ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等。②YARN中的ResourceManager负责接收和处理来自客户端的请求。接到客户端应用程序请求后,ResourceManager里面的调度器会为应用程序分配一个容器。同时,ResourceManager的应用程序管理器会与该容器所在的NodeManager通信,为该应用程序在该容器中启动一个ApplicationMaster(即图6-5中的“MRAppMstr”)。③ApplicationMaster被创建后会首先向ResourceManager注册,从而使得用户可以通过ResourceManager来直接查看应用程序的运行状态。接下来的步骤4~7是具体的应用程序执行步骤。3.22.x架构(YARN架构)④ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager申请资源。⑤ResourceManager以“容器”的形式向提出申请的ApplicationMaster分配资源,一旦ApplicationMaster申请到资源后,就会与该容器所在的NodeManager进行通信,要求它启动任务。⑥当ApplicationMaster要求容器启动任务时,它会为任务设置好运行环境(包括环境变量、JAR包、二进制程序等),然后将任务启动命令写到一个脚本中,最后通过在容器中运行该脚本来启动任务。⑦各个任务通过某个RPC协议向ApplicationMaster汇报自己的状态和进度,让ApplicationMaster可以随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。3.22.x架构(YARN架构)⑧应用程序运行完成后,ApplicationMaster向ResourceManager的应用程序管理器注销并关闭自己。若ApplicationMaster因故失败,ResourceManager中的应用程序管理器会监测到失败的情形,然后将其重新启动,直到所有的任务执行完毕。MapReduce编程实践44.1MapReduce程序编写步骤(1)Maven项目的pom.xml文件的配置(2)新建Mapper类4.1MapReduce程序编写步骤(3)新建Reducer类(4)新建程序执行主类(5)提交程序到集群4.2MapReduce编写单词统计程序4.2MapReduce编写单词统计程序4.2MapReduce编写单词统计程序4.2MapReduce编写单词统计程序4.2MapReduce编写单词统计程序4.2MapReduce编写单词统计程序本章小结本章主要介绍了分布式计算框架MapReduce,它是Hadoop的一个核心组成框架,概念“Map(映射)”和“Reduce(归约)”以及它们的主要思想,都是从函数式编程语言里借用而来的,同时也包含了从矢量编程语言里借来的特性。MapReduce极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。包括MapReduce简介、MapReduce计算模型、MapReduce工作原理、MapReduce编程实践。通过本章的学习,希望大家能够熟悉MapReduce的相关内容,后续我们将基于本章介绍的内容进行大数据技术的进一步学习。第7章数据仓库Hive《大数据技术基础教程》学习目标/Target了解数据仓库Hive的架构原理、数据类型和数据模型掌握数据仓库Hive的DML和DDL的基本操作掌握数据仓库Hive
JDBC的基本操作章节概述/
SummaryHive是Hadoop中的一个重要子项目,它利用MapReduce编程技术,实现了部分SQL语句,提供了类SQL的编程接口。Hive的出现极大地推进了Hadoop在数据仓库方面的发展。hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,本章将简要介绍Hive简介、Hive架构原理、Hive数据类型及应用、Hive数据模型、DDL数据库语言应用、HiveJDBC编程实践。目录/Contents01020304Hive简介Hive架构原理Hive数据类型及应用Hive数据模型05DDL数据库语言应用06DML数据库语言应用07HiveJDBC访问Hive简介7.17.1Hive简介7.1.1Hive概论Hive是一个基于Hadoop的开源数据仓库工具,用于存储和处理海量结构化数据。它是Facebook2008年8月开源的一个数据仓库框架,它提供了一个被称为Hive查询语言(简称HiveOL或HOL)的SOL语言,来查询存储在Hadoop集群中的数据。7.1Hive简介7.1.1Hive概论Hive不支持OLTP(联机事务处理)所需的关键功能,而更接近成为一个OLAP(联机分析技术)工具。但是由于Hadoop本身的时间开销很大,并且Hadoop所被设计用来处理的数据规模非常大,因此提交查询和返回结果是可能具有非常大的延时的,所以Hive并没有满足OLAP中的“联机”部分,至少目前并没有满足。7.1Hive简介7.1.1Hive概论由于大多数的数据仓库应用程序是使用基于SQL的关系型数据库实现的,所以Hive降低了将这些应用程序移植到Hadoop上的障碍。用户如果懂得SQL,那么学习使用Hive将会很容易。如果没有Hive,那么这些用户就需要去重新学习新的语言和新的工具后才能进行生产。7.1Hive简介7.1.2Hive的优缺点由于Hive使用类SQL查询语法,最大限度的实现了和SQL标准的兼容,大大降低了传统数据分析人员学习的曲线使用JDBC接口/ODBC接口,开发人员更易开发应用Hive以MR作为计算引擎、HDFS作为存储系统,为超大数据集设计的计算和扩展能力具有统一的元数据管理(Derby、MySql等),并可与Pig、Presto等共享Hive还支持用户自定义函数,用户可以根据自己的需求来实现自己的函数Hive的优点7.1Hive简介7.1.2Hive的优缺点由于Hive基于MR计算引擎,涉及到过多的磁盘I/O,因此hive的延迟比较高,比较适用用大量数据的统计分析,主要用于离线统计分析,对于实时要求不高的场合。Hive的HQL表达能力有限,导致迭代式算法无法表达,同时由于MapReduce数据处理流程的限制,Hive不能胜任数据挖掘方面的工作。一般而言,Hive自动生成的MapReduce作业,通常情况下不够智能化,因而效率比较低,调优比较困难,粒度较粗。Hive的缺点7.1Hive简介7.1.3Hive和传统数据库比较Hive和数据库除了拥有类似的查询语言,再无类似之处。Hive构架原理7.27.2Hive构架原理作为基于Hadoop的主要数据仓库解决方案,HiveSQL是主要的交互接口,实际的数据保存在HDFS文件中,真正的计算和执行则由MapReduce完成,而它们之间的桥梁是Hive引擎。7.2Hive构架原理7.2.1用户接口shell/CLI,jdbc/odbc,webuicommandlineinterfaceCLI,shell终端命令行,采用交互式使用hive命令行与hive进行交互JDBC/ODBC,是hive基于JDBC提供的客户端,用户通过它连接至hiveserver服务WebUI,通过浏览器访问hive7.2Hive构架原理7.2.2元数据Metastore表所属数据库(默认是default)、表的拥有者、表名及表的注释、字段及字段的注释、列/分区字段、表的类型(是否是外部表)、表数据所在目录等。而表里面具体的内容则在HDFS里,很多框架比如Atlas就是监控元数据库matestore中的表信息来实现元数据管理。元数据默认存储在自带的derby数据库(小巧但是很多缺点,比如不支持并发连接,可以理解为轻量级的MySQL数据库)中,一般都采用MySQL存储Metastore(即换成用MySQL来存元数据)。7.2Hive构架原理7.2.3驱动器:DriverHive通过给用户提供的一系列交互接口,接收到用户的指令(SQL),使用自己的Driver,结合元数据(MetaStore),将这些指令翻译成MapReduce,提交到Hadoop中执行,最后,将执行返回的结果输出到用户交互接口。7.2Hive构架原理7.2.3驱动器:Driver(1)解析器(SQLParser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。(2)编译器(PhysicalPlan):将AST编译生成逻辑执行计划。Hive的数据存储在HDFS中,大部分的查询由MapReduce完成7.2Hive构架原理7.2.3驱动器:Driver(3)优化器(QueryOptimizer):对逻辑执行计划进行优化。(4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。Hive数据类型及应用7.37.3Hive数据类型及应用离线分析系统7.3.1数据类型(1)简单类型HIVEMySQLJAVA长度例子TINYINTTINYINTbyte1byte有符号整数2SMALINTSMALINTshort2byte有符号整数20INTINTint4byte有符号整数20BIGINTBIGINTlong8byte有符号整数20BOOLEAN无boolean布尔类型,true或者falseTRUEFALSEFLOATFLOATfloat单精度浮点数3.14159DOUBLEDOUBLEdouble双精度浮点数3.14159STRINGVARCHARstring字符系列。可以指定字符集。可以使用单引号或者双引号。‘nowisthetime’“forallgoodmen”TIMESTAMPTIMESTAMP
时间类型
BINARYBINARY
字节数组
Hive基本数据类型7.3Hive数据类型及应用离线分析系统7.3.1数据类型(2)复杂类型STRUCT:和C语言中的struct类似,都可以通过“点”符号访问元素内容。例如,如果某个列的数据类型是STRUCT{firstSTRING,lastSTRING},那么第1个元素可以通过字段.first来引用,例如struct<street:string,city:string>。7.3Hive数据类型及应用离线分析系统7.3.1数据类型(2)复杂类型MAP:MAP是一组键-值对元组集合,使用数组表示法可以访问数据。例如,如果某个列的数据类型是MAP,其中键->值对是’first’->’John’和’last’->’Doe’,那么可以通过字段名[‘last’]获取最后一个元素,例如map<string,int>。7.3Hive数据类型及应用离线分析系统7.3.1数据类型(2)复杂类型ARRAY数组:是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。例如:数组值为[‘John’,‘Doe’],那么第2个元素可以通过数组名[1]进行引用。7.3Hive数据类型及应用离线分析系统7.3.1数据类型(3)案例分析1)某表有如用JSON格式来表示其数据结构的内容。2)基于上述数据结构,我们在Hive里创建对应的表,并导入数据。创建本地测试文件test.txt,内容如下:wukong,bingbing_lili,xiaobai:18_xiaohei:19,huaguoshan_jiangsu_10010zhubajie,caicai_susu,xiaohong:18_xiaolan:19,lianyundong_gaolaozhuang_100117.3Hive数据类型及应用离线分析系统7.3.1数据类型(3)案例分析3)Hive上创建测试表test,具体的代码如下:createtabletest(namestring,friendsarray<string>,childrenmap<string,int>,addressstruct<street:string,city:string,email:int>)rowformatdelimitedfieldsterminatedby','collectionitemsterminatedby'_'mapkeysterminatedby':'linesterminatedby'\n';7.3Hive数据类型及应用离线分析系统7.3.1数据类型(3)案例分析4)导入文本数据到测试表0:jdbc:hive2://hadoop105:10000>loaddatalocalinpath'/opt/module/hive-3.1.2/datas/test.txt'intotabletest;5)访问三种集合列里的数据,以下分别是ARRAY,MAP,STRUCT的访问方式。0:jdbc:hive2://hadoop105:10000>selectfriends[1],children['xiaobai'],address.cityfromtestwherename="wukong";7.3Hive数据类型及应用离线分析系统7.3.2类型转化隐式类型转换规则如下:任何整数类型都可以隐式地转换为一个范围更广的类型,如TINYINT可以转换成INT,INT可以转换成BIGINT。所有整数类型、FLOAT和STRING类型都可以隐式地转换成DOUBLE。TINYINT、SMALLINT、INT都可以转换为FLOAT。BOOLEAN类型不可以转换为任何其它的类型。7.3Hive数据类型及应用离线分析系统7.3.2类型转化可以使用CAST操作显示地进行数据类型转换:0:jdbc:hive2://hadoop105:10000>select'1'+2,cast('1'asint)+2;Hive的数据模型7.47.4Hive的数据模型Hive中包含以下数据模型:Table、Partition、Bucket、ExternalTable。(1)表(Table)Hive中的Table和关系型数据库中的Table,在概念上是类似的,每一个Table在Hive中都有一个相应的HDFS中的目录存储数据。例如,一个表pvs,它在HDFS中的路径为:/wh/pvs,其中,wh是在hive-site.xml中由${hive.metastore.warehouse.dir}指定的数据仓库的目录,所有的Table数据(不包括ExternalTable)都保存在这个目录中。7.4Hive的数据模型Hive中包含以下数据模型:Table、Partition、Bucket、ExternalTable。(2)分区(Partition)Partition类似于关系型数据库中的Partition列的密集索引,但是Hive中Partition的组织方式和数据库中的有很大不同。在Hive中,表中的一个Partition对应于表下的一个目录,所有的Partition的数据都存储在对应的目录中。分区表实际上就是对应一个HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过WHERE子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多。7.4Hive的数据模型Hive中包含以下数据模型:Table、Partition、Bucket、ExternalTable。(3)分桶表(Bucket)分区提供一个隔离数据和优化查询的便利方式。不过,并非所有的数据集都可形成合理的分区。对于一张表或者分区,Hive可以进一步组织成桶,也就是更为细粒度的数据范围划分。分桶是将数据集分解成更容易管理的若干部分的另一个技术。分区针对的是数据的存储路径;分桶针对的是数据文件。7.4Hive的数据模型Hive中包含以下数据模型:Table、Partition、Bucket、ExternalTable。(4)外部表(ExternalTable)ExternalTable指向已经在HDFS中存在的数据目录,它可以创建Table和Partition,表中数据假设是用Hive兼容的格式。它和Table在元数据的组织上是相同的,而实际数据的存储则有较大的差异。Table的创建过程和数据加载过程是两个过程(但这两个过程可以在同一个语句中完成)。在加载数据的过程中,实际数据会被移动到数据仓库目录中;之后对数据的访问将会直接在数据仓库目录中完成。删除表时,表中的数据和元数据将会被同时删除。DDL数据库定义语言应用7.57.5DDL数据库定义语言应用1.创建数据库2.查看数据库7.5DDL数据库定义语言应用3.切换数据库4.删除数据库hive>dropdatabaseifexistsDATABASES;7.5DDL数据库定义语言应用5.创建表创建一个外部表,表有字段emp,ename,job,mgr,hiredate等信息。hive>createexternaltableifnotexistsdefault.emp(empnoint,enamestring,jobstring,mgrint,hiredatestring,saldouble,commdouble,deptnoint)rowformatdelimitedfieldsterminatedby'\t';7.5DDL数据库定义语言应用6.查看所有表7.查看表信息7.5DDL数据库定义语言应用8.查看拓展描述信息9.删除表hive>droptableemp;DML数据操作语言应用7.67.6DML数据操作语言应用Load语法结构LOADDATA[LOCAL]INPATH'filepath'[OVERWRITE]INTOTABLEtablename[PARTITION(partcol1=val1,partcol2=val2...)]说明:Load操作只是单纯的复制/移动操作,将数据文件移动到Hive表对应的位置。filepath:相对路径,例如:project/data1绝对路径,例如:/user/hive/project/data1包含模式的完整URI,例如:hdfs://namenode:9000/user/hive/project/data17.6DML数据操作语言应用LOCAL如果指定了LOCAL,那么:load命令会去查找本地文件系统中的filepath。如果发现是相对路径,则路径会被解释为相对于当前用户的当前路径。load命令会将filepath中的文件复制到目标文件系统中。目标文件系统由表的位置属性决定。被复制的数据文件移动到表的数据对应的位置。如果没有指定LOCAL关键字,如果filepath指向的是一个完整的URI,hive会直接使用这个URI。否则:如果没有指定schema或者authority,Hive会使用在hadoop配置文件中定义的schema和authority,
指定了Namenode的URI。如果路径不是绝对的,Hive相对于/user/进行解释。Hive会将filepath中指定的文件内容移动到table(或者partition)所指定的路径中。7.6DML数据操作语言应用LOCAL创建一张表hive(default)>createtablestudent(idstring,namestring)rowformatdelimitedfieldsterminatedby'\t';加载本地数据(LOCAL关键字)hive(default)>loaddatalocalinpath'/home/hadoop/Downloads/dates/students.txt'intotabledefault.student;7.6DML数据操作语言应用OVERWRITE如果使用了OVERWRITE关键字,则目标表(或者分区)中的内容(如果有)会被删除,然后再将filepath指向的文件/目录中的内容添加到表/分区中。如果目标表(分区)已经有一个文件,并且文件名和filepath中的文件名冲突,那么现有的文件会被新文件所替代。7.6DML数据操作语言应用OVERWRITE加载HDFS文件系统数据hive(default)>loaddatainpath'/user/atguigu/hive/student.txt'intotabledefault.student;加载数据覆盖表中已有的数据hive(default)>loaddatainpath'/user/atguigu/hive/student.txt'overwriteintotabledefault.student;7.6DML数据操作语言应用Insert将查询结果插入Hive表语法结构:Standardsyntax:INS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 仓库作业隐患排查与整改计划
- 2024年度铝合金船舶制造材料采购协议3篇
- 2025年BIM工程师之BIM工程师考试题库带答案(能力提升)
- 2024年度消防电源设备供应安装合同2篇
- 2025版新教材高考物理全程一轮总复习课时分层作业30机械振动
- 4 认识空气 教学实录-2023-2024学年科学一年级下册冀人版
- 2024年乳胶漆环保认证采购合同范本3篇
- 2024年桶装水电子商务平台建设合同
- 2024版城市供水项目特许经营权合同3篇
- 2024版反担保合同:适用于跨境电商物流企业信用风险共担协议6篇
- 气相色谱检测器FID-培训讲解课件
- 新教材人教A版高中数学选择性必修第一册全册教学课件
- 《HSK标准教程1》-HSK1-L8课件
- 幼儿园小班绘本:《藏在哪里了》 课件
- 上册外研社六年级英语复习教案
- 替班换班登记表
- 社会保险法 课件
- 阿利的红斗篷 完整版课件PPT
- 桥梁工程挡土墙施工
- 供应商质量问题处理流程范文
- 实验室生物安全手册(完整版)资料
评论
0/150
提交评论