Hadoop MapReduce 学习笔记

本文的部分图片、文字来自于HKU COMP7305 Cluster and Cloud Computing,Professor: C.L.Wang

hadoop官方文档:http://hadoop.apache.org/docs/r2.7.5/

拓扑结构和硬件配置

先讲一下Hadoop之前的底层的结构,我们是4人一组,每个人一台机器,装上Xen,然后用Xen开两个VM,就是一共8个VM,配置上格式跟下图大同小异(我们是一个i5的CPU,3个2.9GHz的i3CPU ,内存都是16G的),我们用配置最高的那台机器当master。我们的Hadoop版本是2.7.5,具体的配置方法可能难以全写下,这里挑一部分写。

Hadoop MapReduce 学习笔记

一个master控制8个VM的方法:

首先是在master node 里 Add key to all VMs ,然后用ssh做一下test

Hadoop MapReduce 学习笔记

然后在master node 的 /opt/hadoop-2.7.5/etc/hadoop/slaves 这个里面

Hadoop MapReduce 学习笔记

在slave里 /opt/hadoop-2.7.5/etc/hadoop/masters

加上master node

然后在core-site和yarn-site这俩xml文件里分别写上hdfs的地址和hostname 

core:Hadoop MapReduce 学习笔记

yarn:Hadoop MapReduce 学习笔记

然后写个脚本把4个配置文件(core、hdfs、mapred、yarn -site.xml)都从当前的master copy到slave上

脚本里大概就是这种的内容

scp /opt/hadoop-2.7.5/etc/hadoop/core-site.xml student61-x1:/opt/hadoop-2.7.5/etc/hadoop/core-site.xml

如果slave之前有hdfs,那么如果有必要可以先删了

rm -rf /var/hadoop/hadoop-hduser/dfs/*

然后把hdfs格式化一下:hdfs namenode -format

然后就可以在master上启动hdfs、yarn和historyserver了

start-dfs.sh

start-yarn.sh

mr-jobhistory-daemon.sh start historyserver

这个时候应该在master jps一下,看到ResourceManager、NameNode、SecondaryNamenode和JobHistoryServer

在slave上jps能看到dataNode和NodeManager。

Hadoop MapReduce 学习笔记

这里yarn就是相当于一个OS,负责统筹计算任务,算是一个计算框架把,对应着RM(resource manager)和NM(node manager),HDFS就是一个distribute file system,负责分布式存储文件,对应着NameNode和DataNode。


后面的整个configuration最重要的就是用到四个文件

core-site.xml

Hadoop MapReduce 学习笔记

core-site里一般不用动,就配置好hdfs的地址就行,调参一般用不到这个文件

hdfs-site.xml

Hadoop MapReduce 学习笔记

hdfs-site这个文件很重要,就是控制分布式存储方法的,尤其是里面的两个参数影响重大,一个是replication,规定了每个文件存几份,在client上是默认肯定有一份的,如果我把这个值改成9,那么就是8个VM和master上都有一份文件。这个值很关键,因为map任务分配给了一个slave后,数据有可能存在别的node上,再去访问就比较消耗时间了。然后是blocksize这个参数,这个分块该怎么分要根据处理的数据来定,这个值会影响到后面的map的任务数,算是核心参数之一了。

yarn-site.xml

yarn里有个很重要的参数:虚拟物理内存比,这个值默认是2.1,适当调的大一点不会出现虚拟内存不够的情况。

还有一些参数看下面有一章:“memory参数的设置”

Hadoop MapReduce 学习笔记

mapred-site.xml

mapred这个文件是最重要的了,直接控制了MapReduce的过程的各种参数

Hadoop MapReduce 学习笔记

这里mapreduce.map(reduce).memory.mb直接控制了一个map(reduce)任务申请的内存空间,可能的情况下给的越多执行的越快。

task.io.sort.mb是缓存,默认100m:The total amount of buffer memory to use while sorting files, in megabytes. By default, gives each merge stream 1MB, which should minimize seeks。Each map task has a circular in-memory buffer (100 MB, adjusted by mapreduce.task.io.sort.mb). When 80% full (default), will start to spill to disk (A new spill file is created). 这个是给文件按照key值排序的时候用的缓存大小,缓存不够了就会往磁盘写,那就费时间了!这个缓存的用处如下图所示,很关键的参数!我们在任务结束后会看到一个spilled records=xxxxx,这个值就是这个溢出到磁盘的大小,溢出太多程序就会很慢。

Hadoop MapReduce 学习笔记


job.reduces控制了reduce任务的数量,默认好像是1,太少了,我们可以加一些。

compress控制了是否要把map任务的结果压缩,这个东西要看网络情况,如果网络特别慢,确实需要压缩一下再传输,如果网络特别快,那么就不必了,压缩解压还消耗时间呢。

parallelcopies默认值是5,并行传输的数量,可以调一下。

然后最后那个job.maps,理应是限制map的个数的,不过之前用blocksize给限制了,一个block(128m)对应一个map,所以这里调了也没用,具体什么时候有用,这得具体问题具体分析。

还有一个参数是mapreduce.job.reduce.slowstart.completed.maps ,默认是0.05,就是map执行了5%之后启动reduce。

还有个参数这里没有:mapreduce.map(reduce).speculative 设置成true,如果有某个task运行特别慢,就会在别的node上再开一个,哪个快用哪个,然后把慢的那个kill掉

还有一些参数看下面有一章:“memory参数的设置”

How many Map and Reduce jobs?

Hadoop MapReduce 学习笔记


YARN工作流程

Hadoop MapReduce 学习笔记

Yarn会在一个slave上生成一个AM(AppMaster)引导启动整个任务,具体是哪个VM被当做AM了,在jobHistoryServer上能看见。

memory参数的设置

Hadoop MapReduce 学习笔记
其他总结

Hadoop MapReduce 学习笔记

The Mapper outputs are sorted and then partitioned per Reducer. The total # of partitions = the # of reduce tasks for the job。所以说有多少reduce,就有多少key,map的任务就是把当前的东西根据key分成若干份然后传给reduce任务。 


最后这里总结一个参数表:(暂时没时间写)