A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Hadoop概述:

Hadoop提供了用于构建分布式系统工具(数据存储、数据分析、协调处理),是一个大数据存储和分析平台。

面对大数据,人们所要做的就是数据的存储与分析工作。

Hadoop提供了一个具有可靠的共享存储(HDFS)和分析系统(MapReduce)平台。HDFS实现数据的存储,MapReduce实现数据的分析和处理。HDFS和MapReduce是Hadoop的核心价值。

MapReduce提出一个编程模型,模型抽象出了硬盘对数据的读写问题并将其转换为对一个数据集(由键值对组成)的计算(MapReduce的灵感来自于传统的函数式编程、分布式计算和数据库社区)。

MapReduce查询需要处理整个数据集或至少一个数据集的绝大部分,是一个批查询处理器。MapReduce比较适合以批处理方式处理需要分析整个数据集的问题,尤其是动态分析。适合一次写入、多次读取数据(即少更新)的应用(相对应的关系型数据库更适合持续更新的数据集,关系型数据库适用于点查询和更新)。另外,MapReduce适合操作非结构化或半结构化数据,因为它是在处理数据时才对数据进行解释,也就是MapReduce输入的键和值并不是数据的固有属性,而是由分析数据的人来选的。(MapReduce非常适用于分析各种日志文件的原因就是这些日志文件时非结构化的)

高性能计算采用的方法是将作业分散到集群的各台机器上,这些机器访问存储区域网络(ASN)所组成的共享文件系统,比较适用于计算密集型的作业,但如果节点要访问的数据量更大,许多计算节点会因网络带宽的问题不得不闲下来等数据。MapReduce尽量在计算节点上存储数据,以实现数据的本地快速访问,数据本地化是MapReduce的核心特征。

Hadoop这个名字也泛指一组相关的项目,这些项目都使用这个基础平台进行分布式计算和海量数据处理。如:

Avro:一种序列化系统,用于支持高效、跨语言的RPC和持久化数据存储;

MapReduce:分布式数据处理模式和执行环境,运行于大型商用机集群;

HDFS:分布式文件系统,运行于大型商用机集群;

Pig:数据流语言和运行环境,用于探究非常庞大的数据集,运行在MapReduce和HDFS集群上;

Hive:一种分布式的、按列存储的数据仓库,管理HDFS中存储的数据,提供基于SQL的查询语言(由运行时引擎翻译成MapReduce作业)用以查询数据;

HBase:一种分布式的、按列存储的数据库,使用HDFS作为底层存储,同时支持MapReduce的批量式计算和点查询(随机读取);

ZooKeeper:一种分布式的、可用性高的协调服务,提供分布式锁之类的基本服务用于构建分布式应用;

Sqoop:用语在结构化数据存储和HDFS之间高效批量传输数据;

Oozie:该服务用于运行和调度Hadoop作业(如MapReduce、Pig、Hive、及Sqoop作业)。

MapReduce程序工作原理:

MapReduce是一种可用于数据处理的编程模型。MapReduce程序本质上是并行运行的,其优势在于处理大规模数据集。

使用Hadoop分析数据:为充分利用Hadoop提供的并行处理优势,需将查询表示成MapReduce作业。MapReduce任务过程分为两个处理阶段:map阶段和reduce阶段。各阶段都以键值对<key,value>作为输入和输出,其类型由程序员选择(类型可变)。程序员还需要写两个函数:map函数和reduce函数进行对两个阶段的抽象。

map()函数:用户自定义的map()函数接受一个<key,value>对集,经过map()函数的计算得出另一个中间<key,value>对集。为了减少map()函数和reduce()函数之间的数据传输,MapReduce对map()函数的返回值进行一定的处理,包括排序、分组等处理后传递给reduce()函数。

reduce()函数:用户自定义的reduce()函数接受一个中间key值和相关value值的集合。reduce()函数合并这些value值,形成一个较小的value值的集合。

如采用MapReduce技术从NCDC数据中找出每年的最高气温。

map()函数以键/值对形式输入数据。略。

输出结果:

(1950,0)

(1950,22)

(1950,-11)

(1949,111)

(1949,78)

为降低map()函数与reduce()函数间数据传递及方便reduce()函数处理,MapReduce框架对map()函数的输出进行一定的处理(排序、分组等)之后得出一中间结果,再将中间结果发送给reduce()函数。因此reduce()函数的输入为:

(1949,[111,78])

(1950,[0,22,-11])

最终reduce()函数遍历整个列表并输出每年最高气温。

(1949,111)

(1950,22)

MapReduce逻辑数据流如下图所示。


Java MapReduce

MapReduce程序代码实现需三样东西:一个map函数、一个reduce函数和一些用来运行作业的代码。map函数由Mapper类来表示,后者声明了一个map()虚方法。reduce函数由Reduce类来表示,后者声明了一个reduce()虚方法。Mapper类是一个泛型类型,有四个参数,分别指定map函数的输入键、输入值、输出建、和输出值的类型。Reduce类也有四个形式参数类型用于指定输入和输出类型。需要注意的是,reduce的输入类型必须匹配map的输出类型。

在Hadoop集群上运行作业时,要把代码打包成一个JAR文件(Hadoop在集群上发布这个文件)。不必指定JAR文件的名称,在Job对象的setJarByClass()方法中传递一个类即可,Hadoop利用这个类来查找包含它的JAR文件,进而找到相关的JAR文件。

针对分布式文件系统(HDFS),允许Hadoop将MapReduce作业转移到存储有部分数据的各台机器上。MapReduce作业(job)是客户端需要执行的一个工作单元:包括输入数据、MapReduce程序和配置信息。Hadoop将作业分成若干个小任务(task)来执行,其中包括两类任务:map任务和reduce任务。

两类节点控制作业的执行过程:一个jobtracker及一系列tasktracker。jobtracker通过调度tasktracker上运行的任务来协调所有运行在系统上的作业。tasktracker在运行任务的同时将运行进度报告发送给jobtracker,jobtracker由此记录每项作业任务的整体进度情况。如果其中一个任务失败,jobtracker可以在另一个tasktracker节点上重新调度该任务。

Hadoop将MapReduce的输入数据划分成等长的小数据块,成为输入分片。Hadoop为每个分片构建一个map任务,并由该任务来运行用户自定义的map函数从而处理分片中的每条记录。对于大多数作业来说,一个合理的分片大小趋向于HDFS的一个块大小,默认64MB。

Hadoop在存储有输入数据(HDFS中的数据)的节点上运行map任务,这就是所谓的“数据本地优化”。也就是说map任务只在存有输入数据的节点数运行。HDFS数据块备份在三个节点上。偶尔对于一个map任务的输入来说,三个备份节点可能正在运行其他map任务,此时作业调度需要在三个备份中的某个数据寻求同个机架空闲的机器来运行该map任务,仅在非常偶然的情况下会使用其他机架中的机器运行该map任务,这将导致机架与机架之间的网络传输。

Map任务将其输出写入本地磁盘,而非HDFS。因为map的输出是中间结果:该中间结果由reduce任务处理后才产生最终输出结果,一旦作业完成,map的输出结果就可以删除。若该节点上运行的map任务在将map中间结果传送给reduce之前失败,Hadoop将在另一个节点上重新运行这个map任务以再次构建map中间结果。中间结果需要通过网络传输发送到运行reduce任务的节点,数据在reduce端合并,然后由用户定义的reduce函数处理。Reduce的输出通常存储在HDFS中以实现可靠存储。对于每个reduce输出的HDFS块,第一个复本存储在本地节点上,其他复本存储在其他机架节点中。

集群上的可用带宽限制了MapReduce作业数量,因此尽量避免map和reduce任务之间的数据传输。


9 个回复

倒序浏览
努力加油
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
哈哈哈
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
优秀,加油加油!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马