作业的要求来自于:
1.用自己的话阐明Hadoop平台上HDFS和MapReduce的功能、工作原理和工作过程。
HDFS:首先,hdfs是一个文件系统,用于存储文件,通过统一的命名空间——目录树来定位文件;
其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色;
工作过程:分为分为写操作和读操作两步
(1)写操作:客户端要向hdfs写入数据,首先要跟namenode通信以确认可以写文件并获得接收文件block的datanode,然后,客户端按照顺序将文件block逐个传给相应datanode,并由接收到block的datanode负责向其他datanode复制block副本
(2)读操作:客户端跟namenode通信查询元数据,找到文件块所在的datanode服务器,挑选一台datanode(就近原则,然后随机)服务器,请求建立socket流,datanode开始发送数据(从磁盘里面读取数据放入流,以packet为单位做校验),客户端以packet为单位接收,先在本地缓存,然后写入目标文件。
工作原理:
(1)写操作:
1.根据NameNode通信请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在
2.NameNode返回是否可以上传
3.client会将文件分成相应的块,请求第一个 block该传输到哪些DataNode服务器上 (NameNode节点会记录block信息,并告知Client可用的DataNode)
4.client向DataNode发送相应的块,发送过程是以流式写入
(2)读操作:
1.client向NameNode发送读请求;
2.NameNode查看Metadata信息,返回fileA的block的位置:
3.数据从DataNode读取对应的block的流
4.block的位置是有先后顺序的,先读block1,再读block2。而且block1去host2上读取;然后block2,去host7上读取。
MapReduce:MapReduce模型主要运用于处理海量的数据信息,其主要包含Mapper类和Reducer类两个抽象类。Mapper类主要负责对数据的分析处理,最终转化为key-value数据对;Reducer类主要获取key-value数据对,然后处理统计,得到结果。
工作过程:首先向JobTracker请求一个新的作业ID;然后检查输出说明(如输出目录已存在)、输出划分(如输入路径不存在);JobTracker配置好所有需要的资源,然后把作业放入到一个内部的队列中,并对其进行初始化,初始化包括创建一个代表该正在运行的作业对象(封装任务和记录信息),以便跟踪任务的状态和进程;作业调度器获取分片信息,每个分片创建一个map任务。TaskTracker会执行一个简单的循环定期发送heartbeat给JobTracker,心跳间隔可自由设置,通过心跳JobTracker可以监控TaskTracker是否存活,同时也能获得TaskTracker处理的状态和问题,同时也能计算出整个Job的状态和进度。当JobTracker获得了最后一个完成指定任务的TaskTracker操作成功的通知时候,JobTracker会把整个Job状态置为成功,然后当客户端查询Job运行状态时候(注意:这个是异步操作),客户端会查到Job完成的通知的。
工作原理:输入分片(input split)、map阶段、combiner阶段、shuffle阶段、reduce阶段
1.input split:在map计算之前,程序会根据输入文件计算split,每个input split针对一个map任务。input split存储的并非是数据本身,而是一个分片长度和一个记录数据的位置的数组。
2.map阶段:即执行map函数。
3.combiner阶段:这是一个可选择的函数,实质上是一种reduce操作。combiner是map的后续操作,主要是在map计算出中间文件前做一个简单的合并重复key值的操作。
4.shuffle阶段:指从map输出开始,包括系统执行排序即传送map输出到reduce作为输入的过程。另外针对map输出的key进行排序又叫sort阶段。map端shuffle,简单来说就是利用combiner对数据进行预排序,利用内存缓冲区来完成。reduce端的shuffle包括复制数据和归并数据,最终产生一个reduce输入文件。shuffle过程有许多可调优的参数来提高MapReduce的性能,其总原则就是给shuffle过程尽量多的内存空间。
5.reduce阶段:即执行reduce函数并存到hdfs文件系统中。
2.HDFS上运行MapReduce
1)准备文本文件,放在本地/home/hadoop/wc
这里准备的是《悲惨世界》第一章的英文文本,命名为hgg0603.txt
2)编写map函数和reduce函数,在本地运行测试通过
3)启动Hadoop:HDFS, JobTracker, TaskTracker
4)把文本文件上传到hdfs文件系统上 user/hadoop/input
5)streaming的jar文件的路径写入环境变量,让环境变量生效
6)建立一个shell脚本文件:streaming接口运行的脚本,名称为run.sh
7)source run.sh来执行mapreduce
8)查看运行结果