资源预览内容
第1页 / 共19页
第2页 / 共19页
第3页 / 共19页
第4页 / 共19页
第5页 / 共19页
第6页 / 共19页
第7页 / 共19页
第8页 / 共19页
第9页 / 共19页
第10页 / 共19页
亲,该文档总共19页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
长沙引擎信息技术有限公司Hadoop框架理解刘勇2014-02-16本文从基本架构、HDFS及MapReduce基本工作原理上对hadoop框架进行了粗略的分析,可帮助初学者初步理解hadoop架构。目 录Hadoop框架的理解11、Hadoop架构11.1、简介:11.2、优点:21.3、架构:22、HDFS(Hadoop Distributed FileSystem)32.1、简介:32.2、文件分块:42.3、NameNode 和 DataNode:42.4、数据流53、MapReduce73.1简介:73.2工作原理73.3实例:93.4 Shuffle(洗牌)103.5 MapReduce执行过程143.6 MapReduce 适合处理的任务16Hadoop框架的理解1、 Hadoop架构1.1、简介:Hadoop是一个分布式系统基础架构,由Apache基金会所开发。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力高速运算和存储。Hadoop包括两个核心部分:Hadoop分布式文件系统(Hadoop Distributed File System,HDFS)和MapReduce编程模型。其中HDFS运行在商用硬件上,它和现有分布式文件系统很相似,但也具备了明显的差异性,比如HDFS是高度容错的,可运行在廉价硬件上;HDFS能为应用程序提供高吞吐率的数据访问,适用于大数据集的应用中;HDFS在POSIX规范进行了修改,使之能对文件系统数据进行流式访问,从而适用于批量数据的处理。HDFS为文件采用一种"一次写多次读"的访问模型,从而简化了数据一致性问题,使高吞吐率数据访问成为可能,一些Map/Reduce应用和网页抓取程序在这种访问模型下表现完美。MapReduce 本身源自于函数式语言,主要通过"Map(映射)"和"Reduce(化简)"这两个步骤来并行处理大规模的数据集。首先,Map会先对由很多独立元素组 成的逻辑列表中的每一个元素进行指定的操作,且原始列表不会被更改,会创建多个新的列表来保存Map的处理结果。也就意味着,Map操作是高度并行的。当Map工作完成之后,系统会接着对新生成的多个列表进行清理(Shuffle)和排序,之后,会这些新创建的列表进行Reduce操作,也就是对一个列表中的元素根据Key值进行适当的合并。1.2、优点:Hadoop是一个能够对大量数据进行分布式处理的软件框架。但是 Hadoop 是以一种可靠、高效、可伸缩的方式进行处理的。Hadoop 是可靠的,因为它假设计算元素和存储会失败,因此它维护多个工作数据副本,确保能够针对失败的节点重新分布处理。Hadoop 是高效的,因为它以并行的方式工作,通过并行处理加快处理速度。Hadoop 还是可伸缩的,能够处理 PB 级数据。此外,Hadoop 依赖于社区服务器,因此它的成本比较低,任何人都可以使用。Hadoop是一个能够让用户轻松架构和使用的分布式计算平台。用户可以轻松地在Hadoop上开发和运行处理海量数据的应用程序。它主要有以下几个优点:A、 高可靠性。Hadoop按位存储和处理数据的能力值得人们信赖。B、 高扩展性。Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中。C、 高效性。Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。D、 高容错性。Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配。E、 低成本。与一体机、商用数据仓库以及QlikView、Yonghong Z-Suite等数据集市相比,hadoop是开源的,项目的软件成本因此会大大降低。Hadoop带有用Java语言编写的框架,因此运行在 Linux 生产平台上是非常理想的。Hadoop 上的应用程序也可以使用其他语言编写,比如C+。1.3、架构:Hadoop 由许多元素构成。其最底部是 Hadoop Distributed FileSystem(HDFS),它存储 Hadoop 集群中所有存储节点上的文件。HDFS(对于本文)的上一层是MapReduce引擎,该引擎由 JobTrackers 和 TaskTrackers 组成。2、HDFS(Hadoop Distributed FileSystem)2.1、简介:对外部客户机而言,HDFS就像一个传统的分级文件系统。可以创建、删除、移动或重命名文件,等等。但是 HDFS 的架构是基于一组特定的节点构建的,这是由它自身的特点决定的。这些节点包括 NameNode(仅一个),它在 HDFS 内部提供元数据服务;DataNode,它为 HDFS 提供存储块。由于仅存在一个 NameNode,因此这是 HDFS 的一个缺点(单点失败)。存储在 HDFS 中的文件被分成块,然后将这些块复制到多个计算机中(DataNode)。这与传统的 RAID 架构大不相同。块的大小(通常为 64MB)和复制的块数量在创建文件时由客户机决定。NameNode 可以控制所有文件操作。HDFS 内部的所有通信都基于标准的 TCP/IP 协议。2.2、文件分块:HDFS同样也有块(block)的概念,但是大得多,默认为64 MB。与单一磁盘上的文件系统相似,HDFS上的文件也被划分为块大小的多个分块,作为独立的存储单元。但与其他文件系统不同的是,HDFS中小于一个块大小的文件不会占据整个块的空间。对分布式文件系统中的块进行抽象会带来很多好处。第一个最明显的好处是,一个文件的大小可以大于网络中任意一个磁盘的容量。文件的所有块并不需要存储在同一个磁盘上,因此它们可以利用集群上的任意一个磁盘进行存储。事实上,尽管不常见,但对于整个HDFS集群而言,也可以仅存储一个文件,该文件的块占满集群中所有的磁盘。第二个好处是,使用块抽象而非整个文件作为存储单元,大大简化了存储子系统的设计。简化是所有系统的目标,伹是这对于故障种类繁多的分布式系统来说尤为重要。将存储子系统控制单元设置为块,可简化存储管理(由于块的大小是固定的, 因此计算单个磁盘能存储多少个块就相对容易)。同时也消除了对元数据的顾虑(块只是存储数据的一部分,而文件的元数据,如权限信息,并不需要与块一同存储,这样一来,其他系统就可以单独地管理这些元数据)。不仅如此,块非常适合用于数据备份进而提供数据容错能力和可用性。将每个块复制到少数几个独立的机器上(默认为3个),可以确保在发生块、磁盘或机器故障后数据不丢失。如果发现一个块不可用,系统会从其他地方读取另一个复本,而这个过程对用户是透明的。一个因损坏或机器故障而丢失的块可以从其他候选地点复制到另一台可以正常运行的机器上,以保证复本的数量回到正常水平。同样,有些应用程序可能选择为一些常用的文件块设置更高的复本数量进而分散集群中的读取负载。2.3、NameNode 和 DataNode:HDFS集群有两类节点,并以管理者-工作者模式运行,即一个NameNode(管理者)和多个DataNode(工作者)。NameNode管理文件系统的命名空间,它维护着文件系统树及整棵树内所有的文件和目录。这些信息以两个文件形式永久保存在本地磁盘上:命名空间镜像文件和编辑日志文件。NameNode也记录着每个文件中各个块所在的数据节点信息,但它并不永久保存块的位置信息,因为这些信息会在系统启动时由数据节点重建。DataNode是文件系统的工作节点。它们根据需要存储并检索数据块(受客户端或 NameNode调度),并且定期向NameNode发送它们所存储的块的列表。没有NameNode,文件系统将无法使用。事实上,如果运行NameNode服务的机器毁坏,文件系统上所有的文件将会丢失,因为我们不知道如何根据DataNode的块来重建文件。因此,对NameNode实现容错非常重要,Hadoop为此提供了两种机制。第一种机制是备份那些组成文件系统元数据持久状态的文件。Hadoop可以通过配置使NameNode在多个文件系统上保存元数据的持久状态。这些写操作是实时同步的,是原子操作。一般的配置是将持久状态写人本地磁盘的同时,写人一个远程挂载的网络文件系统(NFS)。另一种可行的方法是运行一个辅助NameNode,但它不能被用作NameNode。这个辅助NameNode的重要作用是定期通过编辑日志合并命名空间镜像,以防止编辑日志过大。这个辅助NameNode 般在另一台单独的物理计算机上运行,因为它需要占用大量CPU时间与NameNode相同容量的内存来执行合并操作。它会保存合并后的命名空间镜像的副本,并在NameNode发生故障时启用。但是,辅助NameNode保存的状态总是滞后于主节点,所以在主节点全部失效时,难免会丢失部分数据。在这种情况下,一般把存储在NFS上的NameNode元数据复制到辅助NameNode并作为新的主NameNode运行。2.4、数据流 2.4.1、文件读取剖析为了了解客户端及与之交互的HDFS、NameNode和DataNode之间的数据流是什么样的,我们可参考下图,该图显示了在读取文件时一些事件的主要顺序。大致过程如下:1、使用HDFS提供的客户端开发库Client,向远程的NameNode发起RPC请求;2、NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode都会返回有该block拷贝的DataNode地址;3、客户端开发库Client会选取离客户端最接近的DataNode来读取block;如果客户端本身就是DataNode,那么将从本地直接获取数据;4、读取完当前block的数据后,关闭与当前的DataNode连接,并为读取下一个block寻找最佳的DataNode;5、当读完列表的block后,且文件读取还没有结束,客户端开发库会继续向NameNode获取下一批的block列表。6、读取完一个block都会进行checksum验证,如果读取DataNode时出现错误,客户端会通知NameNode,然后再从下一个拥有该block拷贝的DataNode继续读。2.4.2、文件写入剖析文件是如何写入HDFS的。尽管比较详细,但对于理解数据流还是很有用的,因为它清楚地说明了HDFS的一致模型。要考虑的情况是如何创建一个新文件,并把数据写入该文件,最后关闭该文件。写入文件的过程比读取较为复杂:1、使用HDFS提供的客户端开发库Client,向远程的Namenode发起RPC请求;2、Namenode会检查要创建的文件是否已经存在,创建者是否有权限进行操作,成功则会为文件创建一个记录,否则会让客户端抛出异常;3、当客户端开始写入文件的时候,开发库会将文件切分成多个packets,并在内部以数据队列"data queue"的形式管理这些packets,并向Namenode申请新的blocks,获取用来存储备份的合适的datanodes列表,列表的大小根据在Namenode中对replication的设置而定。4、开始以pipeline(管道)的形式将packet写入所有的备份中。开发库把packet以流的方式写入第一个datanode,该datanode把该packet存储之后,再将其传递给在此pipeline中的下一个datanode,直到最后一个datanode,这种写数据的方式呈流水线的形式。5、最后一个datanode
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号