大数据平台简介_第1页
大数据平台简介_第2页
大数据平台简介_第3页
大数据平台简介_第4页
大数据平台简介_第5页
已阅读5页,还剩205页未读 继续免费阅读

下载本文档

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

文档简介

大数据平台简介目录Hadoop生态系统Hadoop主流厂商HDFSMapReduceHiveSparkHadoop生态系统Hadoop1.0V2.0Hadoop生态系统Ambari(安装部署工具)Zookeeper(分布式协调服务)HBase(分布式协数据库)Oozie(作业流调度系统)HDFS(分布式存储系统)YARN(分布式计算框架)MapReduce(离线计算)Tez(DAG计算)Spark(内存计算)HivePigMahoutSqoop(数据库TEL工具)Flume(日志收集)…………HDFS-HadoopDistributedFileSystemYarn-资源管理器MapReduce-分布式并行计算框架“你数一号书架,我数二号书架。我们人数多,数书就更快。这就是map;最后我们到一起,把所有人的统计数加在一起,就是reduce。”Spark-新一代大数据处理计算引擎YoucanrunSparkusingitsstandaloneclustermode,onEC2,onHadoopYARN,oronApacheMesos.AccessdatainHDFS,Cassandra,HBase,Hive,Tachyon,andanyHadoopdatasource.HBase-NoSQL数据库Hive-hadoop的数据仓库Pig-大规模数据分析平台Pig是一个基于Hadoop的大规模数据分析平台,它提供的SQL-LIKE语言叫PigLatin,该语言的编译器会把类SQL的数据分析请求转换为一系列经过优化处理的MapReduce运算。Pig为复杂的海量数据并行计算提供了一个简单的操作和编程接口。Apachepig是用来处理大规模数据的高级查询语言,配合Hadoop使用,可以在处理海量数据时达到事半功倍的效果,比使用Java,C++等语言编写大规模数据处理程序的难度要小N倍,实现同样的效果的代码量也小N倍。A=LOAD'a.txt'AS(col1:chararray,col2:int,col3:int,col4:int,col5:double,col6:double);B=GROUPABY(col2,col3,col4);C=FOREACHBGENERATEgroup,AVG(A.col5),AVG(A.col6);DUMPC; Mahout-机器学习算法库Mahout是ApacheSoftwareFoundation(ASF)旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。Mahout包含许多实现,包括聚类、分类、推荐过滤、频繁子项挖掘。此外,通过使用ApacheHadoop库,Mahout可以有效地扩展到云中。Zookeeper-分布式协调服务Sqoop-Hadoop与关系数据库间的数据同步工具Flume-分布式日志采集工具Amari-Hadoop集群安装部署监控工具Hadoop主流厂商大数据领域的三驾马车ClouderaHortonworksMapRClouderaDistributionHadoop(CDH)HortonworksDataPlatform(HDP)MapRConvergedDataPlatformHadoop主流厂商比较开源开源管理开源管理架构创新完全开源收取服务费工具不开源收取License费用重构了底层内核收取License费用云服务集团软件集团浪潮大数据平台产品HDP云海InsightHDIndataHDHDFS相关背景资料Hadoop:一个分布式系统基础架构,由Apache基金会开发。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力高速运算和存储。Distributed:分布式计算是利用互联网上的计算机的CPU的共同处理能力来解决大型计算问题的一种计算科学。Filesystem:文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构;即在磁盘上组织文件的方法。也指用于存储文件的磁盘或分区,或文件系统种类。Hadoop和HDFS的关系Hadoop是一个以一种可靠、高效、可伸缩的方式进行处理的,能够对大量数据进行分布式处理的系统框架。HDFS是Hadoop兼容最好的标准级文件系统,因为Hadoop是一个综合性的文件系统抽象,所以HDFS不是Hadoop必需的。所以可以理解为hadoop是一个框架,HDFS是hadoop中的一个部件。HDFS背景介绍随着数据量越来越大,

在一个操作系统管辖的范围存不下了,

那么就

分配到更多的操作系统管理的磁盘中,

但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。分布式文件系统:一种允许文件通过网络在多台主机上分享的文件系统,可以让多个机器上的多个用户分享文件和存储空间。集群通透性:DFS让实际上是通过网络来访问文件的动作,由用户和程序看来,就像访问本地的磁盘一般。分布式文件系统特点RootsplitBlock···Block目录1目录2···File节点节点节点HDFS是什么HDFS是HadoopDistributeFileSystem的简称,也就是Hadoop的一个分布式文件系统。HDFS被设计成适合运行在通用硬件(commodityhardware)上的分布式文件系统。HDFS是一个高度容错性的系统,适合部署在廉价的机器上HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用HDFS可以实现流的形式访问(streamingaccess)文件系统中的数据对外部客户机而言,HDFS就像一个传统的分级文件系统。可以创建、删除、移动或重命名文件,等等。对于用户来说,可以直接看成是一个巨大的硬盘。HDFS特点GB、TB、甚至PB级数据;百万规模以上的文件数量;10K+节点规模适合大数据处理

HDFS使应用程序流式地访问它们的数据集。所以它重

视数据吞吐量,而不是数据访问的反应速度。流式文件访问

HDFS被设计成适合进行批量处理,而不是用户交互式

处理;移动计算而非数据;数据位置暴露给计算框架适合批处理通过多副本提高可靠性;提供了容错和恢复机制可构建廉价机器上数据自动保存多个副本;副本丢失后,自动恢复高容错性一次性写入,多次读取;保证数据一致性简化一致性模型

HDFS在设计的时候就考虑到平台的可移植性。这种特

性方便了HDFS作为大规模数据应用平台的推广可移植性HDFS的局限性

不支持多用户对同一文件进行操作,而且写操作只

能在文件末尾完成,即追加操作。并发写入、文件随机修改由于HDFS是为高数据吞吐量应用而设计的,必然

以高延迟为代价。不适合低延迟与高吞吐率的数据

访问,比如毫秒级不适合低延迟数据访问

HDFS中元数据(文件的基本信息)存储在namenode的内存中,而namenode为单点,小文

件数量大到一定程度,namenode内存就吃不消了

;寻道时间超过读取时间无法高效存储大量小文件HDFS现在遇到的主要问题分布后的文件系统有个无法回避的问题,因为文件不在一个磁盘导致读取访问操作的延时,这个是HDFS现在遇到的主要问题HDFS调优是使用时最应该注意的。现阶段,HDFS的配置是按照高数据吞吐量优化的,可能会以高时间延时为代价。但万幸的是,HDFS是具有很高弹性,可以针对具体应用再优化。总体架构图HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和一定数目的Datanode组成,他们以管理者-工作者模式工作。总体架构图-Client切分文件;访问或通过命令行管理HDFS;与NameNode交互,获取文件位置信息;与DataNode交互,读取和写入数据。HDFS的基本结构之

NameNodeNamenode是一个中心服务器,负责管理文件系统的命名空间协调客户端对文件的访问Namenode执行文件系统的命名空间操作,例如打开、关闭、重命名文件和目录记录每个文件数据块在各个Datanode上的位置和副本信息HDFS元数据持久化NameNode存有HDFS的元数据:主要由FSImage和EditLog组成。FSImage是元数据镜像文件保存整个文件系统的目录树数据块映射关系:文件与数据块映射关系,DataNode与数据块映射关系EditLog是元数据操作日志,记录每次保存fsimage之后到下次保存之间的所有hdfs操作NameNodeFileSystemImageEditLog命名空间操作记录,如打开、关闭、创建、删除、重命名文件和目录HDFS元数据持久化checkpoint:NameNode启动后,它会从磁盘中读取FsImage及EditLog,应用EditLog中所有的事务到存在于内存中的FsImage文件对象,然后将版本较新的这个FsImage文件写入磁盘,之后EditLog就可以被删除了。一个checkpoint只发生在NameNode启动的时候。Blockreport:当一个DataNode启动时,它会扫描本地文件系统,生成所有HDFS数据块的一个列表,然后向NameNode发送一个报告。HDFS的基本结构之

DataNodeDatanode一般是一个节点一个,负责所在物理节点的存储管理,是文件系统中真正存储数据的地方一个文件被分成一个或多个数据块,这些块存储在一组Datanode上Datanode负责处理文件系统客户端的读写请求。在Namenode的指挥下进行block的创建、删除和复制周期性的向Namenode汇报其存储的数据块信息数据组织数据块(block):大文件会被分割成多个block进行存储,block大小默认为128MB。比磁盘块大很多,目的是减少寻址开销。并不是设置块越大越好。每一个block会在多个datanode上存储多份副本,默认是3份。与其他文件系统不一样,HDFS中每个小于块大小的文件不会占据整个块的空间。HDFS128

MB128

MB128

MB128

MB数据复制大文件在集群中跨机器存储每个文件存储成一系列的数据块,除了最后一个,所有的数据块都是同样大小的为了容错,文件的所有数据块都会有副本。每个文件的数据块大小和副本系数都是可配置的Namenode全权管理数据块的复制,它周期性地从集群中的每个Datanode接收心跳信号和块状态报告副本策略HDFS采用机架感知(rackawareness)的副本存放策略来提高数据的可靠性、可用性和网络带宽的利用率。将第一个副本放在本地节点,将第二个副本放到本地机架上的另外一个节点,而将第三个副本放到不同机架上的节点。文件的副本不是均匀地分布在机架当中,这种方式提高了写的性能,并且不影响数据的可靠性和读性能(选择读取最近的副本)Node大数据集群Rack1Rack2DataNodeDataNodeHDFS稳健性故障的类型:NameNode故障,DataNode故障和网络中断数据磁盘故障,心跳及重新复制DataNode因为故障而不可用拷贝过程失败DataNode上的磁盘坏掉副本数量会被增加NameNode启动block重新复制:NameNodeDataNodeDeadDataNodeDataNodeHeartBeatsHDFS稳健性数据完整性HDFS客户端应用实现了对文件内容的校验和。HDFS写入的时候计算出校验和,然后每次读的时候再计算校验和。元数据磁盘故障NameNode在HDFS集群中属于单点故障。没有namenode,文件系统会崩溃,文件系统上的所有文件将丢失(无法读出,因为无法定位元数据块的位置)HA高可用架构:NameNode热备HA架构解决的问题NameNode单点故障HDFS只有一个NameNode节点,当NameNode崩溃后,整个HDFS集群随之崩溃,直到Namenode重启或者其他Namenode接入HDFSHA:为了解决NameNode的单点故障,为NameNode保存一个热备,两个独立的机器作为NameNode:ActiveNamenode、StandbyNamenode。任何时刻,只有一个Namenode处于Active状态,另一个处于standby状态(passive,备份);ActiveNamenode用于接收Client端请求,Standy节点作为slave保持集群的状态数据以备快速failover.HA架构图写入读出DataNodeDataNodeDataNode....NameNodeactiveNameNodestandbyQJM/NFSZookeeperFCZookeeperFC监控NN状态管理HA状态监控NN状态管理HA状态ZookeeperHeartbeatHeartbeatHA架构-快速failoverDatanodes上需要同时配置这两个Namenode的地址,同时和它们都建立心跳链接,并把block位置发送给它们,这样Standbynode持有集群中blocks的最新位置当ActiveNN失效时,StandbyNN切换成ActiveNNNameNodeactiveDataNodeDataNodeDataNodeDataNodeNameNodestandbyHeartBeats共享数据两种HA方案对比QJMvsNFS共同点都是热备方案都是一个activeNamenode(NN)和一个standbyNN使用Zookeeper(ZK)

quorum和ZKFC来实现自动失效恢复。在失效恢复时都需要配置fencing方法来fenceactiveNN二者共享数据方式不同参与HA的不同角色HDFSwithNFSHDFSwithQJMNamenodeNamenodeHANFS(共享数据变更存储)JournalNodeZookeeperZookeeperZKFailoverControllerprocessZKFailoverControllerprocessHA方案-NFS实现机制activeNN和standbyNN需要共享一个存储目录。activeNN会把数据变更日志保存在该目录内,standbyNN则监视更新,并保持数据同步。为了快速切换NN,DataNode(DN)需要知道两个NN的地址,并把块信息和心跳包发送给active和standby这两个NN。此外,为了保证activeNN挂了以后不再有新数据写入,Fencing逻辑在确认activeNN挂了以后会切断所有与原activeNN的连接。HAwithNFS局限性目前只支持一个数据变更共享目录,导致HA能力受限于该目录为了防止共享目录的单点失效,对共享目录有额外的要求,比如冗余的硬盘、网络和电源等。NFS共享目录所在的设备要求是高可靠性。NFS方式部署更为复杂。HA方案-QJMStandbyNode与ActiveNode保持同步这两个Node都与一组称为JNS的互相独立的进程保持通信(JournalNodes)。当ActiveNode上更新了namespace,它将记录修改日志发送给JNS的多数派。Standbynoes将会从JNS中读取这些edits,并持续关注它们对日志的变更。StandbyNode将日志变更应用在自己的namespace中,即在failover发生之前,Standy持有namespace应该与Active保持完全同步。JournalNodeJournalNodeJournalNodeJournalNodeNameNodeactiveNameNodestandby向JournalNodes写数据从JournalNodes读数据HA方案-QJM硬件资源

Namenode机器:两台配置对等的机器,它们分别运行Active和StandbyNodeJouralNode机器:运行JouralNodes的机器。JouralNode守护进程相当的轻量级,它们可以和hadoop的其他进程部署在一起,比如Namenodes、jobTracker、ResourceManager等。不过为了形成多数派(majority),至少需要3个JouralNodes,因为edits操作必须在多数派上写入成功。当然JNS的个数可以>3,且通常为奇数(3,5,7),这样可以更好的容错和形成多数派。如果你运行了N个JNS,那么它可以允许(N-1)/2个JNS进程失效并且不影响工作。HDFS可访问性HDFS支持以文件和目录的形式组织用户数据。它提供了一个命令行接口(FSShell)让用户与HDFS中的数据进行交互通过原生的

FileSystemJavaAPI接口来访问浏览器的方式访问HDFS中的实例文件http://nn_host:port/默认的http端口是50070读文件ClientJVMDataNodeDataNodeDataNodeNameNodeHDFSClientDistributedFileSystemFSDataInputStream1:open2:获取文件数据块所在的DataNode节点位置3:read7:complete6:close4:read5:read写文件ClientJVMDataNodeDataNodeDataNodeNameNodeHDFSClientDistributedFileSystemFSDataInputStream1:creat3:write7:complete6:close5:ackpacket2:creat4:writepacket4545回收存储空间文件的删除与恢复HDFS会为每一个用户创建一个回收站目录:/user/用户名/.Trash/,每一个被用户通过Shell删除的文件/目录,它会先被重命名到目录/trash下的一个文件.只要被删除的文件还在/trash目录中,用户就可以还原它。目前默认策略是删除/trash中保留时间超过6小时的文件该功能只限于用户在客户端的脚本操作,当用户写程序调用HDFS的API时,NameNode并不会把删除的文件或目录放入回收站Trash中减少副本系数当副本系数被降低时,NameNode会选择删除多余的副本HDFS常用shellHDFS支持以文件和目录的形式组织用户数据。它在客户端提供了一个命令行接口(FSShell)让用户与HDFS中的数据进行交互调用文件系统(FS)Shell命令应使用

bin/hadoopfs<args>的形式。

所有的的FSshell命令使用URI路径作为参数。URI格式是scheme://authority/path。对HDFS文件系统,scheme是hdfs。其中scheme和authority参数都是可选的,如果未加指定,就会使用配置中指定的默认scheme。一个HDFS文件或目录比如/parent/child可以表示成hdfs://namenode:namenodeport/parent/child,或者更简单的/parent/childls使用方法:hadoopfs-ls<args>查看目录下文件lsr使用方法:hadoopfs-lsr<args>递归查看文件mkdir使用方法:hadoopfs-mkdir[-p]<paths>创建目录,-p参数是创建各级父目录touchz使用方法:hadoopfs-touchzURI[URI…]创建一个0字节的空文件。HDFS常用shellHDFS常用shellput使用方法:hadoopfs-put<localsrc>...<dst>上传一个或多个本地文件到文件系统。如果HDFS中已经存在该文件,那么直接上传会报错。如果第二个路径是个文件夹,那么会上传到文件夹中,如果文件不存在,那么会生成一个文件而非新建一个文件夹。copyFromLocal使用方法:hadoopfs-copyFromLocal<localsrc>URI上传一个或多个本地文件到文件系统。命令类似-putget使用方法:hadoopfs-get<src><localdst>下载文件到本地文件系统。copyToLocal使用方法:hadoopfs-copyToLocalURI<localdst>下载文件到本地文件系统。命令类似-getHDFS常用shellappendToFile使用方法:hadoopfs-appendToFile<localsrc>...<dst>将本地文件追加到hdfs文件末尾mv使用方法:hadoopfs-mvURI[URI…]<dest>将文件从源路径移动到目标路径。这个命令允许有多个源路径,此时目标路径必须是一个目录。不允许在不同的文件系统间移动文件。text使用方法:hadoopfs-text<src>将源文件输出为文本格式cat使用方法:hadoopfs-catURI[URI…]将路径指定文件的内容输出到stdoutHDFS常用shellrm使用方法:hadoopfs-rmURI[URI…]删除文件rmdir使用方法:hadoopfs-rmdirURI[URI...]删除空白文件夹rmr(不建议使用)使用方法:hadoopfs-rmrURI[URI...]递归删除。建议使用rm–r替代该命令cp使用方法:hadoopfs-cpURI[URI...]<dest>将文件从源路径复制到目标路径。这个命令允许有多个源路径,此时目标路径必须是一个目录。HDFS常用shellchmod使用方法:hadoopfs-chmod[-R]URI[URI…]改变文件的权限。使用-R将使改变在目录结构下递归进行。命令的使用者必须是文件的所有者或者超级用户。chown使用方法:hadoopfs-chown[-R][OWNER][:[GROUP]]URI[URI]改变文件的拥有者。使用-R将使改变在目录结构下递归进行。命令的使用者必须是超级用户。chgrp使用方法:hadoopfs-chgrp[-R]GROUPURI[URI…]改变文件所属的组。使用-R将使改变在目录结构下递归进行。命令的使用者必须是文件的所有者或者超级用户。HDFS常用shellexpunge使用方法:hadoopfs-expunge清空回收站setrep使用方法:hadoopfs-setrep[-R]<numReplicas><path>改变一个文件的副本系数。-R选项用于递归改变目录下所有文件的副本系数。其他命令,通过hadoopfs-help可以获取所有的命令的详细帮助文件hdfsfsck命令HDFS支持fsck命令用以检查各种不一致。fsck用以报告各种文件问题,如block丢失或缺少block等。查看文件的块的组成等信息。使用方法:hdfsfsck<path>-files-blocks-locationsMapReduce来源2004.10-Google发布了最初的MapReduce论文《MapReduce:大型集群中简化的数据处理》MapReduce是什么MapReduce是一个编程模型,也是一个处理和生成超大数据集的算法模型的相关实现(计算框架),用于简化分布式集群下的大数据计算。MapReduce计算框架这个框架在运行时只关心:如何分割输入数据在大量计算机组成的集群上的调度集群中计算机的错误处理管理集群中计算机之间必要的通信。采用MapReduce架构可以使那些没有并行计算和分布式处理系统开发经验的程序员有效利用分布式系统的丰富资源。MapReduce编程模型编程模型:用户首先创建一个Map函数处理一个基于key/valuepair的数据集合,输出中间的基于key/valuepair的数据集合;然后,再创建一个Reduce函数用来合并所有的具有相同中间key值的中间value值。MapReduce-纸牌游戏MapReduce方法则是:给在座的所有玩家中分配这摞牌让每个玩家数自己手中的牌有几张是黑桃,然后把这个数目汇报给你你把所有玩家告诉你的数字加起来,得到最后的结论你想数出一摞牌中有多少张黑桃。直观方式是一张一张检查并且数出有多少张是黑桃?MapReduce合并了两种经典函数:映射(Mapping)对集合里的每个目标应用同一个操作。即:分开计算,输出各自结果。化简(Reducing)遍历集合中的元素来返回一个综合的结果。即:合并分开计算的各个结果,得到最终结果。MapReduce-基本思想如何对付大数据处理:分而治之对相互间不具有计算依赖关系的大数据,实现并行最自然的办法就是采取分而治之的策略MapReduce-基本思想上升到抽象模型:Mapper与ReducerMapReduce借鉴了Lisp函数式语言中的思想,用Map和Reduce两个函数提供了高层的并行编程抽象模型上升到构架:统一计算框架,为程序员隐藏系统层细节为MapReduce设计并提供了统一的计算框架,为程序员隐藏了绝大多数系统层面的处理细节(存储、划分、分发、结果收集、错误恢复)MapReduce-工作原理MapReduce-工作原理整个系统主要有三部分构成:userprogram(客户端)、master(主控程序)、worker(工作单元,部署在各个数据/计算节点上)客户端(userprogram)与master通信,提交mapreduce程序到master,Master监控集群中的空闲资源(每个worker向其汇报),收到客户端请求后,为该mapreduce程序分配多个map任务和reduce任务

一个被分配了map任务的worker读取相关输入文件分片的内容。它从输入数据中分析出key/value对,然后把key/value对传递给用户自定义的map函数。由map函数产生的中间key/value对被缓存在内存中,缓存在内存中的key/value对被周期性的写入到本地磁盘上。reduceworker使用远程调用来从mapworker的磁盘上读取缓存的数据,然后通过排序使具有相同key的内容聚合在一起,它把key和聚合得value集传递给用户自定义的reduce函数。reduce函数的输出被添加到这个reduce分割的最终的输出文件中。当所有的map和reduce任务都完成了,管理者唤醒用户程序。在这个时候,在用户程序里的MapReduce调用返回到用户代码。MapReduce-适用场景MapReduce主要面向对大规模数据的处理,适用于离线批处理场景由于每次操作需要遍历所有数据,MapReduce并不适用于需要实时响应的系统。MapReduce程序-wordcountwordcount概述输入:执行程序:输出:$bin/hadoopfs-cat/user/joe/wordcount/input/file01HelloWorldByeWorld$bin/hadoopfs-cat/user/joe/wordcount/input/file02HelloHadoopGoodbyeHadoop$bin/hadoopjarwc.jarWordCount/user/joe/wordcount/input/user/joe/wordcount/output$bin/hadoopfs-cat/user/joe/wordcount/output/part-r-00000`Bye1Goodbye1Hadoop2Hello2World2`MapReduce工作过程Input->Mapper1、读取输入文件,并分片2、按block分片,每片一个map。

Wordcount输入文件是2个小文件,默认block大小为64M或128M,所以每个文件就一片,两个文件共2片,2个map任务。3、每个map读取对应分片的文件内容,按行提取文件内容,转换成(key,value)。key是数据分片中字节偏移量,value值是行内容FileInputFormat.addInputPath(job,newPath(args[0]));publicvoidmap(Objectkey,Textvalue,Contextcontext)Mapper阶段<Hello,1><World,1><Bye,1><World,1><Hello,1><Hadoop,1><Goodbye,1><Hadoop,1>Map-1:Map-2:job.setMapperClass(TokenizerMapper.class);publicvoidmap(Objectkey,Textvalue,Contextcontext)throwsIOException,InterruptedException{StringTokenizeritr=newStringTokenizer(value.toString());while(itr.hasMoreTokens()){word.set(itr.nextToken());context.write(word,one);}}Combine阶段Map-1:Map-2:<Bye,1><Hello,1><World,2><Goodbye,1><Hadoop,2><Hello,1>publicvoidreduce(Textkey,Iterable<IntWritable>values,Contextcontext)throwsIOException,InterruptedException{intsum=0;for(IntWritableval:values){sum+=val.get();}result.set(sum);context.write(key,result);}job.setCombinerClass(IntSumReducer.class);Reducer阶段publicvoidreduce(Textkey,Iterable<IntWritable>values,Contextcontext)throwsIOException,InterruptedException{intsum=0;for(IntWritableval:values){sum+=val.get();}result.set(sum);context.write(key,result);}<Bye,1><Goodbye,1><Hadoop,2><Hello,2><World,2>`job.setReducerClass(IntSumReducer.class);HadoopMapReduce工作过程YarnHadoopMapReduceV1架构HadoopMapReduceV1组成1)Client客户端程序,与JobTracker通信,提交mapredce程序包2)JobTrackerJobTracke相当于GoogleMapReduce中的master,负责统一的资源监控和作业调度。3)TaskTrackerTaskTracker相当于GoogleMapReduce中的worker,部署在各个数据/计算节点上,向JobTracker发送本节点的资源情况,接收JobTracker的作业调度指令,创建任务或杀死任务4)TaskTask分为MapTask和ReduceTask两种,均由TaskTracker启动。HadoopMapReduceV1问题JobTracker是Map-reduce的集中处理点,存在单点故障。JobTracker完成了太多的任务,造成了过多的资源消耗,当map-reducejob非常多的时候,会造成很大的内存开销,增加了JobTrackerfail的风险。在TaskTracker端,以map/reducetask的数目作为资源的表示过于简单,没有考虑到cpu/内存的占用情况,如果两个大内存消耗的task被调度到了一块,很容易出现OOM。在TaskTracker端,把资源强制划分为maptaskslot和reducetaskslot,如果当系统中只有maptask或者只有reducetask的时候,会造成资源的浪费。源代码层面分析的时候,会发现代码非常的难读,常常因为一个class做了太多的事情,代码量达3000多行,造成class的任务不清晰,增加bug修复和版本维护的难度。Yarn架构原理Yarn架构原理Yarn框架有两类进程构成:ResourceManager:负责全局资源的管理和调度分配NodeManager:是每台机器资源管理的代理端,负责本机资源使用的监控以及为yarn应用分配运行容器(Container)和创建任务Container是YARN中资源的抽象,它封装了某个节点上一定量的资源(CPU和内存两类资源)。每个map或reduce任务需要拥有一定的Container资源以运行。Yarn架构原理ResourceManager有两种主要组件:SchedulerandApplicationsManager.Scheduler:负责纯资源调度,为各个应用分配资源。资源调度策略包括CapacityScheduler、FaireScheduler等。ApplicationsManager:负责接收应用程序提交请求(通过yarnjar或hadoopjar执行程序),创建应用对应的ApplicationMaster以及当ApplicationMaster失败时对其重启。AppMstr:ApplicationMaster,每个应用(如提交一个WordCount程序,就是个应用)运行时,ResourceManager都要为该应用先分配container,运行该ApplicationMaster。ApplicationMaster负责与ResourceManager通信,申请该应用实际运行时所需的容器资源,申请到资源后,负责与资源所在的各NodeManager通信,要求它在申请到的资源(container)中启动任务。Yarn工作流程Yarn工作流程步骤1用户向YARN中提交应用程序,其中包括ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等。步骤2ResourceManager为该应用程序分配第一个Container,并与对应的Node-Manager通信,要求它在这个Container中启动应用程序的ApplicationMaster。步骤3ApplicationMaster首先向ResourceManager注册,这样用户可以直接通过ResourceManage查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤4~7。步骤4ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager申请和领取资源。步骤5一旦ApplicationMaster申请到资源后,便与对应的NodeManager通信,要求它启动任务。步骤6NodeManager为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。步骤7各个任务通过某个RPC协议向ApplicationMaster汇报自己的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过RPC向ApplicationMaster查询应用程序的当前运行状态。步骤8应用程序运行完成后,ApplicationMaster向ResourceManager注销并关闭自己。

HiveHive简介-Hive是什么?Hive是构建在Hadoop之上的数据仓库平台Hive是一个SQL解析引擎,它将SQL语句转译成MapReduce作业并在Hadoop上执行。Hive表是HDFS的一个文件目录,一个表名对应一个目录名,如果有分区表的话,则分区值对应子目录名。Hive简介-Hive的历史由来Hive是Facebook开发的,构建于Hadoop集群之上的数据仓库应用。2008年Facebook将Hive项目贡献给Apache,成为开源项目。Hive简介-Hive的历史由来Hadoop和Hive组建成为Facebook数据仓库的发展史随着数据量增加某些查询需要几个小时甚至几天才能完成。当数据达到1T时,MySql进程跨掉。可以支撑几个T的数据,但每天收集用户点击流数据(每天约400G)时,Oracle开始撑不住。有效解决了大规模数据的存储与统计分析的问题,但是MapReduce程序对于普通分析人员的使用过于复杂和繁琐。对外提供了类似于SQL语法的HQL语句数据接口,自动将HQL语句编译转化为MR作业后在Hadoop上执行。降低了分析人员使用Hadoop进行数据分析的难度。Hive体系结构-Hive设计特征

Hive做为Hadoop的数据仓库处理工具,它所有的数据都存储在Hadoop兼容的文件系统中。Hive在加载数据过程中不会对数据进行任何的修改,只是将数据移动到HDFS中Hive设定的目录下,因此,Hive不支持对数据的改写和添加,所有的数据都是在加载的时候确定的。Hive的设计特点如下。支持索引,加快数据查询。不同的存储类型,例如,纯文本文件、HBase中的文件。将元数据保存在关系数据库中,减少了在查询中执行语义检查时间。可以直接使用存储在Hadoop文件系统中的数据。内置大量用户函数UDF来操作时间、字符串和其他的数据挖掘工具,支持用户扩展UDF函数来完成内置函数无法实现的操作。类SQL的查询方式,将SQL查询转换为MapReduce的job在Hadoop集群上执行。编码跟Hadoop同样使用UTF-8字符集。Hive体系结构用户接口CLI:Cli启动的时候,会同时启动一个Hive副本。JDBC客户端:封装了Thrift,java应用程序,可以在指定的主机和端口连接到在另一个进程中运行的hive服务器。ODBC客户端:ODBC驱动允许支持ODBC协议的应用程序连接到Hive。WUI接口:是通过浏览器访问HiveThrift服务器基于socket通讯,支持跨语言。HiveThrift服务简化了在多编程语言中运行Hive的命令。绑定支持C++,Java,PHP,Python和Ruby语言。HiveHadoopThrift服务器解析器编译器优化器执行器元数据库MapReduceHDFS数据仓库用户接口CLI接口JDBC/ODBC客户端WEB接口Hive体系结构解析器编译器:完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。优化器是一个演化组件,当前它的规则是:列修剪,谓词下压。执行器会顺序执行所有的Job。如果Task链不存在依赖关系,可以采用并发执行的方式进行Job的执行。元数据库Hive的数据由两部分组成:数据文件和元数据。元数据存储在关系数据库中,如mysql、derby。元数据包括:表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。HadoopHive的数据文件存储在HDFS中,大部分的查询由MapReduce完成。(对于包含*的查询,比如select*fromtbl不会生成MapRedcue作业)HiveHadoopThrift服务器解析器编译器优化器执行器元数据库MapReduceHDFS数据仓库用户接口CLI接口JDBC/ODBC客户端WEB接口HadoopHive的运行机制hive用户通过用户接口连接Hive,发布HiveSQLHive解析查询并制定查询计划Hive将查询转换成MapReduce作业Hive在Hadoop上执行MapReduce作业sqlMap/Reducehdfstable1table2table3......用户用户接口1234Hive的应用场景-Hive的优势解决了传统关系数据库在大数据处理上的瓶颈。适合大数据的批量处理。充分利用集群的CPU计算资源、存储资源,实现并行计算。Hive支持标准SQL语法,免去了编写MR程序的过程,减少了开发成本。具有良好的扩展性,拓展功能方便。Hive的优势-上百行MR程序与一条HQL的对比Hive的应用场景-Hive的缺点Hive的HQL表达能力有限:有些复杂运算用HQL不易表达。Hive效率低:Hive自动生成MR作业,通常不够智能;HQL调优困难,粒度较粗;可控性差。针对Hive运行效率低下的问题,促使人们去寻找一种更快,更具交互性的分析框架。SparkSQL的出现则有效的提高了Sql在Hadoop上的分析运行效率。Hive的应用场景适用场景海量数据的存储处理数据挖掘海量数据的离线分析不适用场景复杂的机器学习算法复杂的科学计算联机交互式实时查询Hive开发使用-Hive的连接HiveServer2目前Hive的Thrift服务端通常使用HiveServer2,它是HiveServer改进版本,它提供了新的ThriftAPI来处理JDBC或者ODBC客户端,可以进行Kerberos身份验证,支持多个客户端并发。BeeLineHiveServer2还提供了新的CLI:BeeLine,它是Hive0.11引入的新的交互式CLI,基于SQLLine,可以作为HiveJDBCClient端访问HievServer2。通过BeeLine连接hivehive安装目录/bin/./beeline-ujdbc:hive2:hiveServer2所在ip:端口号-n用户名例如:./beeline-ujdbc:hive2://:10000-nrootHive开发使用-Hive的数据模型Hive数据库类似传统数据库的DataBase,在元数据库里实际是一张表。对应于HDFS上的数据仓库目录下是一个文件夹。数据仓库目录路径,由hive-site.xml中${hive.metastore.warehouse.dir}参数指定。创建数据库示例:createdatabase数据库名;元数据库中查询数据库列表:select*fromdbs;如下图:Hive开发使用-Hive的数据模型Hive数据库

hive-site.xml中的数据仓库目录设置,如下图:HDFS下对应存储目录,数据库名后缀为.db的数据库列表,如下图,Hive开发使用-Hive的数据模型内部表

内部表与关系数据库中的Table在概念上类似。每一个Table在Hive中都有一个相应的目录存储数据。所有的Table数据(不包括ExternalTable)都保存在这个目录中。删除表时,元数据与数据都会被删除。元数据库中查询数据表列表:

HDFS下对应存储目录:Hive开发使用-Hive的数据模型

外部表

外部表指向已经在HDFS中存在的数据,可以创建Partition。它和内部表在元数据的组织上是相同的,而实际数据的存储则有较大的差异。内部表的创建过程和数据加载过程这两个过程可以分别独立完成,也可以在同一个语句中完成,在加载数据的过程中,实际数据会被移动到数据仓库目录中;之后对数据访问将会直接在数据仓库目录中完成。删除表时,表中的数据和元数据将会被同时删除。而外部表只有一个过程,加载数据和创建表同时完成(CREATEEXTERNALTABLE……LOCATION),实际数据是存储在LOCATION后面指定的HDFS路径中,并不会移动到数据仓库目录中。当删除一个ExternalTable时,仅删除该链接。Hive开发使用-Hive的数据模型如何选择使用内部表或外部表?如果所有处理都由hive来完成,则使用内部表如果需要用hive和外部其他工具处理同一组数据集,则使用外部表。Hive开发使用-Hive的数据模型

分区

Partition对应于关系数据库中的Partition列的密集索引,但是Hive中Partition的组织方式和数据库中的很不相同。在Hive中,表中的一个Partition对应于表下的一个目录,所有的Partition的数据都存储在对应的目录中。例如pvs表中包含ds和city两个Partition,则对应于ds=20090801,city=jinan的HDFS子目录为:/wh/pvs/ds=20090801/city=jinan;对应于ds=20090801,city=qingdao的HDFS子目录为:/wh/pvs/ds=20090801/city=qingdao。Hive开发使用-Hive的数据模型

Buckets是将表的列通过Hash算法进一步分解成不同的文件存储。它对指定列计算hash,根据hash值切分数据,目的是为了并行,每一个Bucket对应一个文件。分区是粗粒度的划分,桶是细粒度的划分,这样做为了可以让查询发生在小范围的数据上以提高效率。适合进行表连接查询、适合用于采样分析。例如将user列分散至32个bucket,首先对user列的值计算hash,则对应hash值为0的HDFS目录为:/wh/pvs/ds=20090801/ctry=US/part-00000;对应hash值为20的HDFS目录为:/wh/pvs/ds=20090801/ctry=US/part-00020。如果想应用很多的Map任务这样是不错的选择。Hive开发使用-Hive的数据模型

Hive的视图视图与传统数据库的视图类似。视图是只读的,它基于的基本表,如果改变,数据增加不会影响视图的呈现;如果删除,会出现问题。如果不指定视图的列,会根据select语句后的生成。

视图的简单示例:创建表:createviewtest_viewasselect*fromtest;查看数据:select*fromtest_view;Hive开发使用-Hive的数据存储模型数据库(database)表(table)表(table)常规数据(data)(Buckets)桶(Buckets)桶分区(Partition)分区(Partition)(Buckets)桶(Buckets)桶Hive开发使用-Hive创建数据表命令CREATETABLE创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用IFNOTEXIST选项来忽略这个异常。EXTERNAL关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),有分区的表可以在创建的时候使用PARTITIONEDBY语句。一个表可以拥有一个或者多个分区,每一个分区单独存在一个目录下。表和分区都可以对某个列进行CLUSTEREDBY操作,将若干个列放入一个桶(bucket)中。可以利用SORTBY对数据进行排序。这样可以为特定应用提高性能。默认的字段分隔符为ascii码的控制符\001(^A)tab分隔符为\t。只支持单个字符的分隔符。如果文件数据是纯文本,可以使用STOREDASTEXTFILE。如果数据需要压缩,使用STOREDASSEQUENCE。CREATE[EXTERNAL]TABLE[IFNOTEXISTS]table_name

[(col_namedata_type[COMMENTcol_comment],...)][COMMENTtable_comment]

[PARTITIONEDBY(col_namedata_type[COMMENTcol_comment],...)]

[CLUSTEREDBY(col_name,col_name,...)[SORTEDBY(col_name[ASC|DESC],...)]INTOnum_bucketsBUCKETS]

[ROWFORMATrow_format]

[STOREDASfile_format][LOCATIONhdfs_path]Hive开发使用-Hive加载数据命令Load操作只是单纯的复制/移动操作,将数据文件移动到Hive表对应的位置。如果表中存在分区,则必须指定分区名。加载本地数据,指定LOCAL关键字,即本地,可以同时给定分区信息。load命令会去查找本地文件系统中的filepath。如果发现是相对路径,则路径会被解释为相对于当前用户的当前路径。用户也可以为本地文件指定一个完整的URI,比如:file:///user/hive/project/data1.例如:加载本地数据,同时给定分区信息:hive>LOADDATALOCALINPATH'file:///examples/files/kv2.txt'OVERWRITEINTOTABLEinvitesPARTITION(ds='2008-08-15');加载DFS数据,同时给定分区信息:如果filepath可以是相对路径URI路径,对于相对路径,Hive会使用在hadoop配置文件中定义的fs.defaultFS指定的Namenode的URI来自动拼接完整路径。例如

:加载数据到hdfs中,同时给定分区信息hive>LOADDATAINPATH'/user/myname/kv2.txt'OVERWRITEINTOTABLEinvitesPARTITION(ds='2008-08-15');OVERWRITE指定OVERWRITE,目标表(或者分区)中的内容(如果有)会被删除,然后再将filepath指向的文件/目录中的内容添加到表/分区中。如果目标表(分区)已经有一个文件,并且文件名和filepath中的文件名冲突,那么现有的文件会被新文件所替代。LOADDATA[LOCAL]INPATH'filepath'[OVERWRITE]INTOTABLEtablename[PARTITION(partcol1=val1,partcol2=val2...)]Hive开发使用-Hive创建数据表命令示例内部表

例如:创建人员信息表person_inside,列以逗号","分隔。

建表示例:createtableperson_inside(idstring,namestring,sexstring,ageint)rowformatdelimitedfieldsterminatedby','storedastextfile;加载数据:本地数据位置:/tmp/person.txtloaddatalocalinpath'file:///tmp/person.txt'intotableperson_inside;person表字段idnamesexage类型stringstringstringintHive开发使用-Hive创建数据表命令示例外部表

例如:创建人员信息表person_ex,列以逗号","分隔。外部表对应路径:hdfs://mycluster/hivedb/person.txt

建表示例:createexternaltableperson_ext(idstring,namestring,sexstring,ageint)rowformatdelimitedfieldsterminatedby','storedastextfilelocation'/hivedb';(注意:location后面跟的是目录,不是文件,hive将依据默认配置的hdfs路径,自动将整个目录下的文件都加载到表中)Hive开发使用-Hive创建数据表命令示例外部表

hive默认数据仓库路径下,不会生成外部表的文件目录,如下图:查看表信息:descformattedperson_ext;查看location指向。如下图:Hive开发使用-Hive创建数据表命令示例外部表

查询数据:select*fromperson_ext;删除表:droptableperson_ext;只删除逻辑表,不删除数据文件,数据文件依然存在。如下图:Hive开发使用-Hive创建数据表命令示例分区表

例如:创建人员信息表person_part,列以逗号","分隔。建立city为分区。建表示例:createtableperson_part(idstring,namestring,sexstring,ageint)partitionedby(citystring)rowformatdelimitedfieldsterminatedby','storedastextfile;加载数据:本地数据位置:/tmp/person.txtloaddatalocalinpath'file:///tmp/person.txt'intotableperson_partpartition(city='jinan');Hive开发使用-Hive创建数据表命令示例分区表

数据存储在以分区city='jinan'为目录的路径下,如下图:根据分区查询数据:hive会自动判断where语句中是否包含分区的字段。而且可以使用大于小于等运算符select*fromperson_partwherecity='jinan';如下图:Hive开发使用-Hive创建数据表命令示例分桶表

例如:创建人员信息表person_bucket,列以逗号","分隔,在年龄age字段上建5个桶。

建表示例:

createtableperson_bucket

(idstring,namestring,sexstring,ageint)partitionedby(citystring)

clusteredby(age)sortedby(name)into5

bucketsrowformatdelimitedfieldsterminatedby','

storedastextfile;打开桶参数:sethive.enforce.bucketing=true;加载数据:insertintotableperson_bucketpartition(city='jinan')select*fromperson_inside;

Hive开发使用-Hive创建数据表命令示例分桶表

数据加载到桶表时,会对字段取hash值,然后与桶的数量取模。把数据放到对应的文件中。如下图:

抽样查询:查询5个桶中的第2个桶,即000001_0文件select*fromperson_buckettablesample(bucket2outof5onage);Hive开发使用-Hive创建数据表命令示例分桶表:注意:要生成桶的数据,只能是由其他表通过insertinto或是insertoverwrite导入数据,如果使用LOADDATA加载数据,则不能生成桶数据。定义桶可以使用整型字段或是string类型字段。若表没有定义桶也可以进行随机抽样,但是要全表扫描,速度慢。必须先sethive.enforce.bucketing=true,才可以将数据正常写入桶中。Hive开发使用-数据导出命令导出到本地文件系统insertoverwritelocaldirectory'/tmp/exportest/'select*fromperson_inside;注意:导出路径为文件夹路径,不必指定文件名。执行语句后,会在本地目录的/tmp/hivedb/下生成一个000000_0结果集数据文件。如下图:导出的数据列之间的分隔符默认是^A(ascii码是\001)。如下图:Hive开发使用-数据导出命令导出到HDFS中insertoverwritedirectory'/hivedb'select*fromperson_inside;注意:导出路径为文件夹路径,不必指定文件名。执行语句后,会在HDFS目录的/hivedb下生成一个000000_0结果集数据文件。如下图:Hive开发使用-数据导出命令导出到Hive的另一个表中insertintotableperson_partpartition(city='jinan')select*fromperson_inside;Hive开发使用-数据查询命令基于Partition的查询例如:分区为citySELECT*FROMperson_partWHEREcity='jinan';限制条数查询LIMITLimit可以限制查询的记录数。查询的结果是随机选择的。下面的查询语句从t1表中随机查询5条记录:SELECT*FROMperson_insideLIMIT5;TopN查询下面的查询语句查询年龄最大的5个人。se

温馨提示

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

评论

0/150

提交评论