Hadoop学习——基础

来源:互联网 发布:淘宝上货供货商怎么写 编辑:程序博客网 时间:2024/04/29 11:14
 1. hadoop 原理

 hadoop是apche基金会的一个开源项目,是一个可运行在大规模集群上的分布式并行编程框架,核心设计是HDFS(分布式文件系统)和mapreduce。为用户提供了底层细节透明的分布式基础设施。其中hdfs提供了高容错和高伸缩的特性,而mapreduce计算模型编写分布式应用程序相对简单,主要设计实现map、reduce类,其他并行编程复杂问题如分布式存储,工作调度,负载均衡,容错处理,网络通信等均有mapreduce和hdfs文件系统负责处理。

 2. Mapreduce原理

 mapreduce计算框架的核心步骤主要分两部分:map和reduce。当你向mapreduce框架提交计算作业时,它会首先把计算作业拆分成若干个map任务,然后分配到不同的节点上执行,每个map任务处理输入数据的一部分,当map任务完成后,它会生成一些中间结果,这些中间结果将会作为reduce任务的输入数据。reduce对数据做进一步处理之后,输出最终结果。 mapreduce的处理过程主要涉及四个部分: client进程:用于提交mapreduce任务job; jobtracker进程:主控,用于调度和管理其他tasktracker进程,可以运行在集群中任意一台计算机上,通常情况下配置jobtracker进程运行在namenode节点上。 tasktracker进程:负责执行jobtracker进程分配的任务,必须运行在datanode节点上,jobtracker将map任务和reduce任务分发给空闲的tasktracker,让这些任务并行执行,并负责监控这些任务的运行情况,如果其中某一个tasktracker出故障了,jobtracker会将任务重新分配到另一个空闲的tasktracker重新运行。 hdfs:分布式文件系统,用于各个进程共享job相关文件

 3. hdfs存储机制

 hdfs是建立在linux文件系统之上的一个虚拟分布式文件系统,它由一个管理节点(Namenode)和n个数据节点(datanode)组成,但其底层把文件分割成块(block),然后这些block分散的存储在不同的datanode上,每个block还可以复制数分存储在不同的node上,达到容错的目地,namenode是整个hdfs的核心,维护一些数据结构,记录每一个文件被切割成多少个block,这些block可以从那些datanode中获得,各个datanode的状态等重要信息。 数据块 每个磁盘都有默认的数据块大小,这是磁盘读写的基本单位。构建于单个磁盘之上的文件系统通过磁盘块来管理该文件系统中的块,该文件系统的块一般为磁盘块的整数倍,磁盘块一般为512字节,hdfs也有块的概念,默认为64m,hdfs也被划分为块大小的多个分块。 任务粒度——数据切片 把原始数据集切割成小数据集时,通常让小数据集小于和等于hdfs中一个block的大小,这样保证一个小数据集位于一台计算机上,便于本地计算,有M个小数据集待处理,就启动M个map任务,这M个map任务分布于n个计算机中并行执行;Reduce的任务数量R可由用户制定, hdfs带来的好处:第一 一个文件的大小可以大于网络中任意一个磁盘的容量,数据块可以利用磁盘中任意一个磁盘进行存储。第二 简化了系统的设计,将控制单元设置为块,简化存储管理。

 4. map-reduce的核心过程——shuffle和sort

    shuffle是mapreduce的心脏,shuffle是从map产生输出开始,包括系统执行排序以及传送map输出到reducer作为输入的过程。    首先从map端开始分析,当map开始产生输出的时候,他并不是简单的把数据写到磁盘,因为频繁的操作会导致性能严重下降,他的处理更加复杂,数据首先是写到内存中的缓冲区,并预排序以提升效率。    每个map任务都有一个用来写入输出数据的循环内存缓冲区,这个循环缓冲区的默认大小为100m(io.sort.mb属性来设置具体大小),当缓冲区的数据量达到一个特定的阈值(io.sort.spill.percent 0.8)系统会启动后台线程把缓冲区中的内容写入磁盘,在这个过程中map的输出会继续写入到缓冲区,但如果缓冲区满了,map就会阻塞直到spill完成,spill线程把缓冲区数据写到磁盘前,会对它进行二次排序,首先根据partition排序然后按key排序,输出包括索引文件和数据文件,如果设定了combiner,将在排序输出的基础上进行。combiner是一个minireducer,在执行map任务的节点上执行,使数据更加紧凑,spill文件保存mapred.local.dir指定目录中,map任务后删除。

 5. hadoop中的combiner的作用

     partition     把map任务输出的中间结果按key的范围划分成R份(R是预先定义的reduce任务的个数)划分时用hash函数,可以保证某一段范围的key,一定将会由一个reduce任务来处理,简化reduce获取计算数据的过程。     combine     在partition之前还可以对中间结果先做combine,将中间结果中有相同的key的<key,value>对合并成一对,但combine是作为map任务的一部分,在执行完map函数后紧接着执行的,而reduce是执行完map操作后才能进行,combine可以减少中间结果,从而减少网络流量。     reduce任务congmap任务节点取中间结果     map任务的中间结果在做完combine和partition之后,以文件的形式存于本地磁盘,中间结果的位置会通知jobtracker,jobtracker再通知reduce任务到哪一个datanode上取中间结果,每个reduce需要向许多个原map任务节点以取得落在其负责的key区间内的中间结果,然后执行reduce操作。

0 0
原创粉丝点击