[Apache] Apache Hadoop
x-Matrix
2010-12-28
Hadoop 一个分布式系统基础架构,由Apache基金会开发。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力高速运算和存储。Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有着高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上。而且它提供高传输率(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求(requirements)这样可以流的形式访问(streaming access)文件系统中的数据。
定义 Hadoop 是最受欢迎的在 Internet 上对搜索关键字进行内容分类的工具,但它也可以解决许多要求极大伸缩性的问题。例如,如果您要grep 一个10TB 的巨型文件,会出现什么情况?在传统的系统上,这将需要很长的时间。但是 Hadoop 在设计时就考虑到这些问题,因此能大大提高效率。 Hadoop 是一个能够对大量数据进行分布式处理的软件框架。但是 Hadoop 是以一种可靠、高效、可伸缩的方式进行处理的。Hadoop 是可靠的,因为它假设计算元素和存储会失败,因此它维护多个工作数据副本,确保能够针对失败的节点重新分布处理。Hadoop 是高效的,因为它以并行的方式工作,通过并行处理加快处理速度。Hadoop 还是可伸缩的,能够处理 PB 级数据。此外,Hadoop 依赖于社区服务器,因此它的成本比较低,任何人都可以使用。 Hadoop带有用 Java 语言编写的框架,因此运行在 Linux 生产平台上是非常理想的。Hadoop 上的应用程序也可以使用其他语言编写,比如 C++。
hadoop架构
HDFS 这与传统的 RAID 架构大不相同。块的大小(通常为 64MB)和复制的块数量在创建文件时由客户机决定。NameNode可以控制所有文件操作。HDFS 内部的所有通信都基于标准的TCP/IP 协议。
NameNode
实际的 I/O 事务并没有经过NameNode,只有表示DataNode 和块的文件映射的元数据经过NameNode。当外部客户机发送请求要求创建文件时,NameNode会以块标识和该块的第一个副本的DataNode IP 地址作为响应。这个 NameNode 还会通知其他将要接收该块的副本的 DataNode。
NameNode 在一个称为FsImage 的文件中存储所有关于文件系统名称空间的信息。这个文件和一个包含所有事务的记录文件(这里是 EditLog)将存储在NameNode 的本地文件系统上。FsImage 和EditLog 文件也需要复制副本,以防文件损坏或 NameNode 系统丢失。
DataNode
DataNode 响应来自 HDFS 客户机的读写请求。它们还响应创建、删除和复制来自 NameNode 的块的命令。NameNode 依赖来自每个DataNode 的定期心跳(heartbeat)消息。每条消息都包含一个块报告,NameNode 可以根据这个报告验证块映射和其他文件系统元数据。如果DataNode 不能发送心跳消息,NameNode 将采取修复措施,重新复制在该节点上丢失的块。
文件操作
Linux 集群
集群系统 1、GFS(Google File System)。一个分布式文件系统,隐藏下层负载均衡,冗余复制等细节,对上层程序提供一个统一的文件系统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均有论文发表。
Hadoop 的最常见用法之一是Web 搜索。虽然它不是惟一的软件框架应用程序,但作为一个并行数据处理引擎,它的表现非常突出。Hadoop 最有趣的方面之一是 Map and Reduce 流程,它受到 Google开发的启发。这个流程称为创建索引,它将 Web 爬行器检索到的文本 Web 页面作为输入,并且将这些页面上的单词的频率报告作为结果。然后可以在整个 Web 搜索过程中使用这个结果从已定义的搜索参数中识别内容。(注,分布式框架的内涵?)
MapReduce 最简单的 MapReduce 应用程序至少包含 3 个部分:一个Map 函数、一个Reduce 函数和一个main 函数。main 函数将作业控制和文件输入/输出结合起来。在这点上,Hadoop 提供了大量的接口和抽象类,从而为 Hadoop 应用程序开发人员提供许多工具,可用于调试和性能度量等。
MapReduce 本身就是用于并行处理大数据集的软件框架。MapReduce 的根源是函数性编程中的map 和 reduce 函数。它由两个可能包含有许多实例(许多Map 和Reduce)的操作组成。Map 函数接受一组数据并将其转换为一个键/值对列表,输入域中的每个元素对应一个键/值对。Reduce 函数接受 Map 函数生成的列表,然后根据它们的键(为每个键生成一个键/值对)缩小键/值对列表。
这里提供一个示例,帮助您理解它。假设输入域是 one small step for man, one giant leap for mankind。在这个域上运行 Map 函数将得出以下的键/值对列表: (one, 1) (small, 1) (step, 1) (for, 1) (man, 1) (one, 1) (giant, 1) (leap, 1) (for, 1) (mankind, 1)
如果对这个键/值对列表应用 Reduce 函数,将得到以下一组键/值对: (one, 2) (small, 1) (step, 1) (for, 2) (man, 1) (giant, 1) (leap, 1) (mankind, 1)
结果是对输入域中的单词进行计数,这无疑对处理索引十分有用。但是,现在假设有两个输入域,第一个是 one small step for man,第二个是 one giant leap for mankind。您可以在每个域上执行 Map 函数和 Reduce 函数,然后将这两个键/值对列表应用到另一个Reduce 函数,这时得到与前面一样的结果。换句话说,可以在输入域并行使用相同的操作,得到的结果是一样的,但速度更快。这便是MapReduce 的威力;它的并行功能可在任意数量的系统上使用。图 2 以区段和迭代的形式演示这种思想。
现在回到Hadoop 上,它是如何实现这个功能的?一个代表客户机在单个主系统上启动的MapReduce 应用程序称为JobTracker。类似于NameNode,它是Hadoop 集群中惟一负责控制MapReduce 应用程序的系统。在应用程序提交之后,将提供包含在HDFS 中的输入和输出目录。JobTracker 使用文件块信息(物理量和位置)确定如何创建其他TaskTracker 从属任务。MapReduce 应用程序被复制到每个出现输入文件块的节点。将为特定节点上的每个文件块创建一个惟一的从属任务。每个TaskTracker 将状态和完成信息报告给JobTracker。图 3 显示一个示例集群中的工作分布。
Hadoop 的这个特点非常重要,因为它并没有将存储移动到某个位置以供处理,而是将处理移动到存储。这通过根据集群中的节点数调节处理,因此支持高效的数据处理。
开源实现 HDFS是Google File System(GFS)的开源实现。 MapReduce是Google MapReduce的开源实现。 HBase是Google BigTable的开源实现。 这个分布式框架很有创造性,而且有极大的扩展性,使得Google在系统吞吐量上有很大的竞争力。因此Apache基金会用Java实现了一个开源版本,支持Fedora、Ubuntu等Linux平台。目前Hadoop受到Yahoo的支持,有Yahoo员工长期工作在项目上,而且Yahoo内部也准备使用Hadoop代替原来的的分布式系统。
Hadoop实现了HDFS文件系统和MapRecue。用户只要继承MapReduceBase,提供分别实现Map和Reduce的两个类,并注册Job即可自动分布式运行。
目前Release版本是0.20.1。还不成熟,但是已经集群规模已经可以达到4000个节点,是由Yahoo!实验室中构建的。下面是此集群的相关数据: • 4000 节点 • 2 x quad core Xeons@2.5ghz per 节点 • 4 x 1TB SATA Disk per 节点 • 8G RAM per 节点 • 千兆带宽 per 节点 • 每机架有40个节点 • 每个机架有4千兆以太网上行链路 • Redhat Linux AS4 ( Nahant update 5 ) • Sun Java JDK1.6.0_05 - b13 • 所以整个集群有30000多个CPU,近16PB的磁盘空间!
HDFS把节点分成两类:NameNode和DataNode。NameNode是唯一的,程序与之通信,然后从DataNode上存取文件。这些操作是透明的,与普通的文件系统API没有区别。 MapReduce则是JobTracker节点为主,分配工作以及负责和用户程序通信。 HDFS和MapReduce实现是完全分离的,并不是没有HDFS就不能MapReduce运算。 Hadoop也跟其他云计算项目有共同点和目标:实现海量数据的计算。而进行海量计算需要一个稳定的,安全的数据容器,才有了Hadoop分布式文件系统(HDFS,Hadoop Distributed File System)。 HDFS通信部分使用org.apache.hadoop.ipc,可以很快使用RPC.Server.start()构造一个节点,具体业务功能还需自己实现。针对HDFS的业务则为数据流的读写,NameNode/DataNode的通信等。 MapReduce主要在org.apache.hadoop.mapred,实现提供的接口类,并完成节点通信(可以不是hadoop通信接口),就能进行MapReduce运算。 目前这个项目还在进行中,还没有到达1.0版本,和Google系统的差距也非常大,但是进步非常快,值得关注。 另外,这是云计算(Cloud Computing)的初级阶段的实现,是通向未来的桥梁。 Hadoop的发音音标 [hædu:p]
Hadoop研究
现在,Doug Cutting在Cloudera公司。Cloudera的Hadoop是商用版。不同于Apache的开源版。如果要研究Hadoop的话,下载Apache的版本是一种不错的选择。只研究Apache版本的,不足以对Hadoop的理念理解。再对Cloudera版本的研究,会更上一层楼。
现在美国的AsterData,也是Hadoop的一个商用版,AsterData的MPP理念,Applications Within理念等等, 也都是值得研究。
Google的成功已经说明了RDB的下一代就是Nosql(Not Only SQl),比说说GFS,Hadoop等等。Hadoop作为开源的版本来说,其魅力更是不可估量。
上文中说到Google的学术论文,其中包涵有 Google File System(大规模分散文件系统) MapReduce (大规模分散FrameWork) BigTable(大规模分散数据库) Chubby(分散锁服务) 这四大InfrastructureSoftware的陈述。
说起Google的GFS和Hadoop,不仅让我想起了,Unix和Linux。由Unix而来的开源Linux,现在更是家喻户晓了。很多大型公司都启用Linux作为服务器。相信不久的将来,Hadoop会像Linux一样,席卷全球,惠而全球。
Hadoop集群简化视图,
MapReduce 流程的概念流,
显示处理和存储的物理分布的Hadoop 集群, |