Hadoop

来源:互联网 发布:知源中学易孟祥 编辑:程序博客网 时间:2024/05/17 04:40

Hadoop名字的起源
  Hadoop这个名字不是一个缩写,它是一个虚构的名字。该项目的创建者,DougCutting如此解释Hadoop的得名:“这个名字是我孩子给一个棕黄色的大象样子的填充玩具命名的。我的命名标准就是简短,容易发音和拼写,没有太多的意义,并且不会被用于别处。小孩子是这方面的高手。”[Hadoop:The Definitive Guide]

编辑本段

hadoop

  Hadoop 由 Apache Software Foundation 公司于 2005年秋天作为 Lucene的子
  hadoop logo

hadoop logo

项目 Nutch的一部分正式引入。它受到最先由Google Lab 开发的 Map/Reduce 和 Google File System(GFS) 的启发。2006 年 3月份,Map/Reduce 和 Nutch Distributed File System (NDFS) 分别被纳入称为 Hadoop的项目中。
  Hadoop 是最受欢迎的在 Internet上对搜索关键字进行内容分类的工具,但它也可以解决许多要求极大伸缩性的问题。例如,如果您要 grep 一个 10TB的巨型文件,会出现什么情况?在传统的系统上,这将需要很长的时间。但是 Hadoop在设计时就考虑到这些问题,采用并行执行机制,因此能大大提高效率。

编辑本段

诸多优点

  Hadoop 是一个能够对大量数据进行分布式处理的软件框架。但是Hadoop 是以一种可靠、高效、可伸缩的方式进行处理的。Hadoop是可靠的,因为它假设计算元素和存储会失败,因此它维护多个工作数据副本,确保能够针对失败的节点重新分布处理。Hadoop是高效的,因为它以并行的方式工作,通过并行处理加快处理速度。Hadoop 还是可伸缩的,能够处理 PB 级数据。此外,Hadoop依赖于社区服务器,因此它的成本比较低,任何人都可以使用。
  Hadoop带有用Java 语言编写的框架,因此运行在 Linux 生产平台上是非常理想的。Hadoop 上的应用程序也可以使用其他语言编写,比如C++。

编辑本段

hadoop架构

  Hadoop 有许多元素构成。其最底部是 Hadoop Distributed FileSyst
  Hadoop 集群的简化视图

Hadoop 集群的简化视图

em(HDFS),它存储 Hadoop集群中所有存储节点上的文件。HDFS(对于本文)的上一层是 MapReduce 引擎,该引擎由 JobTrackers 和TaskTrackers 组成。

HDFS

  对外部客户机而言,HDFS就像一个传统的分级文件系统。可以创建、删除、移动或重命名文件,等等。但是HDFS 的架构是基于一组特定的节点构建的(参见图 1),这是由它自身的特点决定的。这些节点包括 NameNode(仅一个),它在HDFS 内部提供元数据服务;DataNode,它为 HDFS 提供存储块。由于仅存在一个 NameNode,因此这是 HDFS的一个缺点(单点失败)。
  存储在 HDFS中的文件被分成块,然后将这些块复制到多个计算机中(DataNode)。这与传统的 RAID 架构大不相同。块的大小(通常为64MB)和复制的块数量在创建文件时由客户机决定。NameNode 可以控制所有文件操作。HDFS 内部的所有通信都基于标准的TCP/IP 协议。

NameNode

  NameNode 是一个通常在 HDFS实例中的单独机器上运行的软件。它负责管理文件系统名称空间和控制外部客户机的访问。NameNode 决定是否将文件映射到DataNode 上的复制块上。对于最常见的 3个复制块,第一个复制块存储在同一机架的不同节点上,最后一个复制块存储在不同机架的某个节点上。注意,这里需要您了解集群架构。
  实际的 I/O 事务并没有经过 NameNode,只有表示DataNode 和块的文件映射的元数据经过 NameNode。当外部客户机发送请求要求创建文件时,NameNode会以块标识和该块的第一个副本的 DataNode IP 地址作为响应。这个 NameNode 还会通知其他将要接收该块的副本的DataNode。
  NameNode 在一个称为 FsImage的文件中存储所有关于文件系统名称空间的信息。这个文件和一个包含所有事务的记录文件(这里是 EditLog)将存储在 NameNode的本地文件系统上。FsImage 和 EditLog 文件也需要复制副本,以防文件损坏或 NameNode系统丢失。

DataNode

  DataNode 也是一个通常在 HDFS实例中的单独机器上运行的软件。Hadoop 集群包含一个 NameNode 和大量 DataNode。DataNode通常以机架的形式组织,机架通过一个交换机将所有系统连接起来。Hadoop的一个假设是:机架内部节点之间的传输速度快于机架间节点的传输速度。
  DataNode 响应来自 HDFS客户机的读写请求。它们还响应创建、删除和复制来自 NameNode 的块的命令。NameNode 依赖来自每个 DataNode的定期心跳(heartbeat)消息。每条消息都包含一个块报告,NameNode 可以根据这个报告验证块映射和其他文件系统元数据。如果DataNode 不能发送心跳消息,NameNode将采取修复措施,重新复制在该节点上丢失的块。

文件操作

  可见,HDFS并不是一个万能的文件系统。它的主要目的是支持以流的形式访问写入的大型文件。如果客户机想将文件写到 HDFS上,首先需要将该文件缓存到本地的临时存储。如果缓存的数据大于所需的 HDFS 块大小,创建文件的请求将发送给NameNode。NameNode 将以 DataNode 标识和目标块响应客户机。同时也通知将要保存文件块副本的DataNode。当客户机开始将临时文件发送给第一个DataNode 时,将立即通过管道方式将块内容转发给副本 DataNode。客户机也负责创建保存在相同 HDFS名称空间中的校验和(checksum)文件。在最后的文件块发送之后,NameNode 将文件创建提交到它的持久化元数据存储(在EditLog 和 FsImage 文件)。

Linux 集群

  Hadoop 框架可在单一的 Linux平台上使用(开发和调试时),但是使用存放在机架上的商业服务器才能发挥它的力量。这些机架组成一个 Hadoop集群。它通过集群拓扑知识决定如何在整个集群中分配作业和文件。Hadoop假定节点可能失败,因此采用本机方法处理单个计算机甚至所有机架的失败。

编辑本段

集群系统

  Google的数据中心使用廉价的LinuxPC机组成集群,在上面运行各种应用。即使是分布式开发的新手也可以迅速使用Google的基础设施。核心组件是3个:
  1、GFS(Google FileSystem)。一个分布式文件系统,隐藏下层负载均衡,冗余复制等细节,对上层程序提供一个统一的文件系统API接口。Google根据自己的需求对它进行了特别优化,包括:超大文件的访问,读操作比例远超过写操作,PC机极易发生故障造成节点失效等。GFS把文件分成64MB的块,分布在集群的机器上,使用Linux的文件系统存放。同时每块文件至少有3份以上的冗余。中心是一个Master节点,根据文件索引,找寻文件块。详见Google的工程师发布的GFS论文。
  2、MapReduce。Google发现大多数分布式运算可以抽象为MapReduce操作。Map是把输入Input分解成中间的Key/Value对,Reduce把Key/Value合成最终输出Output。这两个函数由程序员提供给系统,下层设施把Map和Reduce操作分布在集群上运行,并把结果存储在GFS上。
  3、BigTable。一个大型的分布式数据库,这个数据库不是关系式的数据库。像它的名字一样,就是一个巨大的表格,用来存储结构化的数据。
  以上三个设施Google均有论文发表。