Hadoop

来源:互联网 发布:java http请求获取mac 编辑:程序博客网 时间:2024/06/07 07:28

本文是借鉴了很多的博客的文章,自己动手在Ubuntu上做过测试,Linux基础好的同学可以直接参考使用。

Hadoop简介

Hadoop是Apache软件基金会的一个开源的分布式计算平台,以HDFS和MapReduce(这个是由GoogleMapReduce开源所实现的)为核心的Hadoop为用户提供了系统底层的实现细节透明的分布式基础架构,(https://baike.baidu.com/item/分布式系统)。

HDFS(Hadoop Distributed File System)的容错性、高伸缩性等优点允许用户将Hadoop部署在低廉的硬件上,形成分布式系统;MapReduce分布式编程模型允许用户在不在了解分布式底层细节的情况下开发并行应用程序。所以用户可以利用Hadoop轻松的组织计算机资源,从而搭建自己的分布式计算机平台,并且可以充分利用集群的计算和存储能力,完成海量数据处理。经过不断的发展Hadoop已经成为比较成熟的大数据处理应用。对于其他的知识点,大家可以到Hadoop的官方网站上去查询。(http://hadoop.apache.org/).

Hadoop的源头是Apache Nutch,该项目始于2002年,是Apache Lucene的子项目之一。2004年,Google在OperatingSystem Design and Implementation(OSDI,“操作系统设计与实现”)会议上公开发表了题为MapReduce: Simplified Data Processing on Large Clusters的论文之后,受到启发的Doug Cutting等人开始尝试实现MapReduce计算框架,并将它与NDFS(Nutch Distributed File System)结合,用以支持Nutch引擎的主要算法。由于NDFS和MapReduce在Nutch引擎中有着良好的应用,所以它们于2006年2月被分离出来,成为一套完整而独立的软件。它被应用到包括Yahoo!在内的很多互联网公司。现在的Hadoop已经发展成为包含HDFS、MapReduce子项目,与Pig、ZooKeeper、Hive、Hbase等项目相关的大型应用工程。

由于Hadoop的优势,基于Hadoop的应用已经遍地开花,尤其是在互联网领域。Yahoo!通过集群运行Hadoop,用以支持广告系统和Web搜索的研究;Facebook借助集群运行Hadoop来支持其数据分析和机器学习;Baidu则使用Hadoop进行搜索日志分析和网页数据挖掘工作;淘宝的Hadoop系统用于存储并处理电子商务交易的相关数据;中国移动研究院基于Hadoop的BigCloud系统对数据进行分析并对外提供服务。2008年2月,作为Hadoop最大贡献者的Yahoo!构建了当时规模最大的Hadoop应用。他们在2000个节点上面执行了超过1万个Hadoop虚拟机器来处理超过5PB的网页内容,分析大约1兆个网络连接之间的网页索引资料。这些网页索引资料压缩后超过300TB。Yahoo!正是基于这些为用户提供高质量的搜索服务。

 

Hadoop项目及其结构

 

目前Hadoop已经发展成为包含很多项目的集合。其核心内容是MapReduce 和Hadoop分布式文件系统,但于Hadoop相关的Common,Avro,Chukwa,hive,hbase等项目是不可或缺的,它们提供了互补性服务或在核心层上提供了更高层的服务。

下面对Hadoop的各个相关项目进行详细的介绍。

1.    Common:Common是为Hadoop其他子项目提供支持的常用工具,它主要包括FileSystem、RPC和串行化库。它们为在低廉硬件上搭建云计算环境提供了基本的服务。并且会为运行在该平台上的软件提供所需要的API。

2.    Avro:Avro是用于数据序列化的系统,它提供了丰富的数据结构类型,快速可压缩的二进制数据格式,存储持久性的文件集,远程调用RPC的功能和简单的动态语言继承功能。其中代码生成器既不需要读写文件,也不需要使用或实现RPC协议,它只是一个可选的对静态类型语言的实现。Avro系统依赖于模式(Schema),数据的读和写是在模式之下完成的。,这样可以减少写入数据的开销,提高序列化的速度并缩减其大小。同时,也可以方便动态脚本语言的使用。因为数据连同其模式都是自描述的。在RPC中,Avro系统的客户端和服务端通过握手协议进行模式交换,因此当客户端和服务端拥有彼此全部模式时,不同模式下相同命名字段,丢失字段和附加字段等信息一致性问题就得到了很好的解决。

3.    MapReduce:MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。映射Map化简Reduce的概念和它们的主要的思想都是从函数式编程语言中借鉴而来的。它极大的方便了编程人员——即使在不了解分布式并行编程的情况下,也可以将自己的程序运行在分布式系统上。MapReduce在执行时先制定一个Map函数。把输入键值对映射成一组新的键值对,经过一定的处理之后交给Reduce,Reduce对相同Key下的所有的Value进行处理后在输出最终的结果。


4.HDFS: HDFS是一个分布式文件系统。因为HDFS具有高容错性(fault-tolerent)的特点,所以它可以设计部署在低廉的硬件上。它可以通过提供高吞吐率(high-throughput)来访问应用程序数据,适合那些有着超大数据集的应用程序。HDFS放宽了对可移植操作系统接口(POSIX,Portable Operating System Interface)的要求,这样可以实现以流的形式访问文件系统中的数据。HDFS原本是开源的Apache项目Nutch的基础结构,最后它却成为了Hadoop基础架构之一。

以下几个方面是HDFS的设计目标:

(a). 检测和快速恢复硬件故障。硬件故障是计算机常见问题。整个HDFS系统由数百甚至上千个存储数据文件的服务器组成。而如此之多的服务器则意味着高故障率,因此,故障的检测和快速自动恢复是HDFS的一个核心目标。

(b). 流式的数据访问。HDFS使应用程序流式地访问它们的数据集。HDFS被设计成适合进行批量处理,而不是用户交互式访问。所以它重视数据吞吐量,而不是数据访问反应速度。

(c). 简化一致性模型。大部分的HDFS程序对文件的操作需要一次写入,多次读取。一个文件一旦经过创建、写入、关闭就不需要修改了。这个假设简化了数据一致性问题和高吞吐量的数据访问问题。

(d). 通信协议。所有的通信协议都是在TCP/IP协议之上的。一个客户端和明确配置了端口的名字节点(NameNode)建立连接之后,它和名字节点的协议便是客户端协议(ClientProtocal)。数据节点(DataNode)和名字节点之间则用数据节点协议(DataNode Protocal)。

5.Chukwa: Chukwa是开源的数据收集系统,用于监控和分析大型分布式系统的数据。Chukwa是在Hadoop的HDFS和MapReduce框架之上搭建的,它继承了Hadoop的可扩展性和健壮性。Chukwa通过HDFS来存储数据,并以来MapReduce任务处理数据。Chukwa中也附带了灵活且强大的工具,用于显示、监视和分析数据结果,以便更好地利用所收集的数据。

6.Hive: Hive最早是由Facebook设计的,是一个建立在Hadoop基础上的数据仓库,它提供了一些用于对Hadoop文件中的数据集进行数据整理、特殊查询和分析存储的工具。Hive提供的是一种结构化数据的机制,它类似于传统RDBMS中的SQL语言的查询语言,来帮助那些熟悉SQL的用户查询Hadoop中的数据,该查询语言称为Hive QL。与此同时,传统的MapReduce编程人员也可以在Mapper或Reducer中通过Hive QL查询数据。Hive编译器会把Hive QL编译成一组MapReduce任务,从而方便MapReduce编程人员进行Hadoop系统开发。

7.HBase: HBase是一个分布式的,面向列的开源数据库,该技术来源于Google论文Bigtable: A Distributed Storage System for Structured Data 。如同BigTable利用了Google的GoogleFile System提供的分布式数据存储方式一样,HBase在Hadoop之上提供了类似于BigTable的能力。HBase不同于一般的关系数据库,原因有两个:其一,HBase是一个适合于非结构化数据存储的数据库;其二,HBase是基于列而不是基于行的模式。HBase和BigTable使用相同的数据模型。用户将数据存储在一个表里,一个数据行拥有一个可选择的键和任意数量的列。由于HBase表是疏松的,用户可以为行为定义各种不同的列。HBase主要用于需要随机访问、实时读写的大数据。

8.Pig: Pig是一个对大型数据集进行分析、评估的平台。Pig的优势是它的结构能够经受住高度并行化的检验,这个特性使得它能够处理大型的数据集。目前,Pig的底层有一个编译器组成,它在运行的时候会产生一些MapReduce程序序列,Pig的语言层由一种叫做Pig Latin的正文型语言组成。

9.ZooKeeper: ZooKeeper是一个为分布式应用所设计的开源协调服务。它主要为用户提供同步、配置管理、分组和命名服务,减轻分布式应用程序所承担的协调任务。ZooKeeper的文件系统使用目录树结构。支持java与C两种语言。

Hadoop体系结构

如上文所说,HDFS和MapReduce是Hadoop的两大核心。而整个Hadoop的体系结构主要通过HDFS来实现分布式存储的底层支持的。并且它会通过MapReduce来实现分布式并行任务处理的程序支持。

下面首先介绍HDFS的体系结构。HDFS采用了主从(Master/Slave)结构模型,一个HDFS集群是由一个NameNode和若干个DataNode组成的。其中NameNode作为主服务器,管理文件系统的命名空间和客户端对文件的访问操作;集群中的DataNode管理存储的数据。HDFS允许用户以文件的形式存储数据。从内部来看,文件被分成若干个数据块,而且这若干个数据块存放在一组DataNode上。NameNode执行文件系统的命名空间操作,比如打开、关闭、重命名文件或目录等,它也负责数据块到具体DataNode的映射。DataNode负责处理文件系统客户端的文件读写请求,并在NameNode的统一调度下进行数据块的创建、删除和复制工作。如下图所示,HDFS的体系结构。


介绍MapReduce的体系结构。MapReduce是一种并行编程模式,利用这种模式软件开发者可以轻松地编写出分布式并行程序。在Hadoop的体系结构中,MapReduce是一个简单易用的软件框架,基于它可以将任务分发到上千台商用机器组成的集群上,并以一种可靠容错的方式并行处理大量的数据集,实现Hadoop的并行处理功能。MapReduce框架是由一个单独运行在主节点的JobTracker和运行在每个集群从节点的TaskTracker共同组成的。主节点负责调度构成一个作业的所有任务,这些任务分布在不同的从节点上。主节点监控它们的执行情况,并且重新执行之前失败的任务;从节点仅负责由主节点指派的任务。当一个Job被提交时,JobTracker接收到提交作业和其他配置信息之后,就会将配置信息等分发给从节点,同时调度任务并监控TaskTracker的执行。NameNode和DataNode都可以在普通商用计算机上运行。这些计算机通常运行的是GNU/Linux操作系统。HDFS采用Java语言开发,因此任何支持Java的机器都可以部署NameNode和DataNode。一个典型的部署场景是集群中的一台机器运行一个NameNode实例,其他机器分别运行一个DataNode实例。当然,并不排除一台机器运行多个DataNode实例的情况。集群中单一NameNode的设计大大简化了系统的架构。NameNode是所有HDFS元数据的管理者,用户需要保存的数据不会经过NameNode,而是直接流向存储数据的DataNode。

HDFS和MapReduce共同组成了Hadoop分布式体系结构的核心。HDFS在集群上实现了分布式文件系统,MapReduce在集群上实现了分布式计算和任务处理。HDFS在MapReduce任务处理过程中提供了对文件操作和存储等的支持,MapReduce在HDFS的基础上实现了任务的分发、跟踪、执行等工作,并收集结果,二者相互作用,完成了Hadoop分布式集群的主要任务。