hadoop整理

来源:互联网 发布:mysql update性能优化 编辑:程序博客网 时间:2024/05/20 12:50

一、Hadoop架构

Hadoop以HDFS为分布式存储基础。HDFS(Hadoop Distributed File System)是hadoop的核心,它由NameNode和DataNode两部分组成。NameNode记录DataNode的块信息,数据复制信息等元数据,负责相当于人体的大脑,提供DataNode的信息。DataNode是数据的存储点,存储数据以Block为单位,并复制到其他DataNode节点中作为备份,并把备份信息等传给NameNode登记备案。Hadoop默认备份数据为三份,DataNode一般会把数据复制到不同机架上,这样做即可以在本机架出现故障时不至于数据丢失,并且可以发挥集群并发读数据的优势,但会在写数据时占用大量资源。为了防止NameNode节点出现故障,整个系统宕掉无法恢复,便产生一个SecondaryNameNode用于备份NameNode的镜像,另外还负责日志与镜像的定期合并,虽然SecondaryNameNode备份了应有数据,但是它不能作为NameNode的热备份。


二、MapReduce过程

以下分为节点级别和任务级别分析过程

1.节点级别

1)在客户端启动一个作业。

2)客户端向JobTracker请求一个Job ID。

3)将运行作业所需要的资源文件复制到HDFS上,包括MapReduce程序打包的JAR文件、配置文件和客户端计算所得的输入划分信息。这些文件都存放在JobTracker专门为该作业创建的文件夹中。文件夹名为该作业的Job ID。JAR文件默认会有10个副本(mapred.submit.replication属性控制);输入划分信息告诉了JobTracker应该为这个作业启动多少个map任务等信息。

4)JobTracker接收到作业后,将其放在一个作业队列里,等待作业调度器对其进行调度(这里是不是很像微机中的进程调度呢,呵呵),当作业调度器根据自己的调度算法调度到该作业时,会根据输入划分信息为每个划分创建一个map任务,并将map任务分配给TaskTracker执行。对于map和reduce任务,TaskTracker根据主机核的数量和内存的大小有固定数量的map槽和reduce槽。这里需要强调的是:map任务不是随随便便地分配给某个TaskTracker的,这里有个概念叫:数据本地化(Data-Local)。意思是:将map任务分配给含有该map处理的数据块的TaskTracker上,同时将程序JAR包复制到该TaskTracker上来运行,这叫“运算移动,数据不移动”。而分配reduce任务时并不考虑数据本地化。

5)TaskTracker每隔一段时间会给JobTracker发送一个心跳,告诉JobTracker它依然在运行,同时心跳中还携带着很多的信息,比如当前map任务完成的进度等信息。当JobTracker收到作业的最后一个任务完成信息时,便把该作业设置成“成功”。当JobClient查询状态时,它将得知任务已完成,便显示一条消息给用户。
2、任务级别分析

数据split-->Map()-->环形buffer缓存-->partition(排序,分组)-->(Combine)-->shuffle-->reduce()-->数据输出

注意点:

1)环形buffer缓存默认大小为100M,如果多余100M便向本地磁盘写出

2)patition分区的个数和shuffle、reduce槽的个数是相同的

3)map过程没有完成,reduce过程是无法开始的,这个不难理解,不看到全部数据,怎么知道谁最大呢!

4)Combine过程可有可无,它没有基类,继承reduce任务,作用是可以减少map输出


3、wordcount实例分析

文本:

Nice day

Nice work

首先接写成2个键值对,<0,Nice day><2,Nice work>   -->2次map函数后<Nice,1><day,1><Nice,1><work,1>

  -->排序<Nice,1><Nice,1><day,1><work,1>--> 分组 <Nice,{1,1},<day,{1}><work,{1}> 

  -->reduce()输出

        Nice 2

        day  1

        work 1

对于以上的过程可以在map和reduce的参数中看出,

Mapper<Object, Text, Text, IntWritable>{

  map(Object k1,Text v1,Context context) {}

}

Reducer<Text, IntWritable, Text, IntWritable>{
   reduce(Text k2,Iterable<IntWritable> v2s,Context context) {}

}




0 0
原创粉丝点击