MapReduce基础

MapReduce分布式计算框架
分布式计算:移动计算,而不是移动数据
MapReduce的split大小:
max(min.split,min(max.split,block))
Mapper:把复杂任务分解为多个简单的任务执行
简单任务:
1)数据或计算规模缩小
2)就近计算,即会被分配倒存放了所需数据的节点进行计算
3)这些小任务可以并行计算,彼此之间没有依赖关系
map任务处理
  • 读取输入文件内容,解析成key、value对。对输入文件的每一行,解析成key、value对。每一个键值对调用一次map函数。
  • 写自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
  • 对输出的key、value进行分区
  • 对不同分区的数据,按照key进行排序、分组。相同key的value放到一个集合中。
  • (可选)分组后的数据进行归约

Reducer:对map阶段结果进行汇总
Reducer的数目可以由mapred-site.xml文件中mapred.reducer.tasks决定,缺省为1
reduce任务处理
  • 对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。
  • 对多个map任务的输出进行合并(合并因子默认为10,由io.sort.factor属性来控制)排序。写reduce函数自己的逻辑,对输入的key、value处理,转换成新的key、value输出
  • 把reduce的输出保存到文件中。
注:reduce任务能够并行的取得map的输出,默认是5个线程,可以通过mapred.reduce.parallel.copies属性来改变



shuffler:
在mapper和Reducer中间的一个步骤,可以mapper输出按照key值重新切分和组合成n份,把key值符合某种范围的输出送到特定的Reducer处理
shuffle过程
1)每个map task都有一个环形内存缓冲区(默认时100M),存储map的输出结果
2)当缓冲区超过一定阈值默认为0.8,可以通过io.sort.spill.percent设置)时,需要将缓冲区数据以临时文件的方式写到磁盘(Spill
3)溢写由单独线程完成,不影响往缓冲区写map计算结果的线程(spill.percent,默认为0.8)
4)当溢写线程启动后,需要对这80M的key做排序
5)如果设置了Combiner,那么现在就是使用Combiner的时候
6)reduce通过Http方式从tasktracker copy数据,用于文件分区的工作线程的数量由任务的tracker.http.threads属性控制,此设置针对每个tasktracker,默认为40,在MapReduce2中该属性是不适用的,MapReduce2使用Netty,默认为处理器数量的两倍
7)copy过来的数据会先放入内存缓冲区中,这里的缓冲区基于JVM的heap size设置

注:每次内存缓冲区溢出之前,都会创建一个新文件。在任务完成之前,溢出的文件合并成一个已分区且已排序的输出文件,配置属性io.sort.factor控制着一次最多能合并多少流,默认是10,如果至少存在3个溢出文件(通过min.num.spills.for.combine属性设置),则combiner就会在输出文件写到磁盘之前再次运行

Partitioner编程:
Partitioner是partitioner的基类,如果需要定制partitioner也需要继承该类
HashPartitioner是mapreduce的默认partitioner。计算方法是which reducer=(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks
在map和reduce阶段进行排序时,比较的是map的output key,output key可以是实体类,实体类继承WritableComparable,根据compare方法进行排序

Combiners编程:
combiner的作用就是在map端对输出先做一次合并,以减少传输到reducer的数据量
combiner最基本是实现本地key的归并,combiner具有类似本地的reduce功能
如果Combiner是可插拔的,添加Combiner绝不能改变最终的计算结果。所以Combiner只应该用于那种Reduce的输入key/value与输出key/value类型完全一致,且不影响最终结果的场景

MapReduce架构:
一主多从架构:
ResourceManager(主JobTracker)
负责调度分配每个子任务task运行与TaskTracker上,每个集群中只有一个JobTracker。一般它运行在Master节点上
NodeManager:(从TaskTracker)
TaskTracker主动与JobTracker通信,接收作业,并负责直接执行每个任务,TaskTracker最好运行在HDFS的DataNode上

mapreduce有两种运行方式:本地测试环境,服务器环境
本地测试环境:(windows)
1.在windows的hadoop安装目录下的bin下放置一个winutils.exe;
2.在windows下配置hadoop环境变量(hadoop安装包,并指定HADOOP_HOME到该安装包路径)
3.修改hadoop的源码,注意确保项目的lib需要真实安装的jdk的lib
4.MRJob调用的代码需要改变
a.src不能有服务器的hadoop配置文件
b.main方法中添加如下代码
Configuration config = new Configuration();
config.set("fs.defaultFS", "hdfs://node12:8020");
config.set("yarn.resourcemanager.hostname", "node3");
服务器环境:
首先需要在src下放置服务器上的hadoop配置文件
1.直接本地调用,执行过程在服务器上(真正企业运行环境)
a.把MR程序导出jar包,直接放到本地(比如/home)
b.修改hadoop的源码,注意,确保项目的lib需要真实安装的jdk的lib
c.Job类的main方法中增加一个属性
config.set("mapred.jar", "/home/mr.jar");
此时需要去掉fs.defaultFS和yarn.resourcemanager.hostname的代码,因为改由读取src下的配置文件
d.本地执行main方法,servlet调用MR

2.直接在服务器上,使用命令的方式调用,执行过程也在服务器上
a.把MR程序导出jar包,传送到服务器上
b.通过hadoop jar jar路径 类的全部路径名(比如:hadoop jar /home/mr.jr com.sxt.JobOne)
注:main方法中需增加 job.setJarByClass(MyJob.class);, 否则会报 ClassNotFoundException

hadoop的压缩codec
Codec为压缩,解压缩的算法实现。 在Hadoop中,codec由CompressionCode的实现来表示

推测执行:在一个任务运行比预期慢的时候,它会尽量检测,并启动另一个相同的任务作为备份,两个任务谁先完成,则另一个任务终止
只有在一个作业的所有任务都启动之后才启动推测任务,并且只针对那些已经运行一段时间(至少一分钟)且比作业中其他任务平均进度慢的任务,默认情况下推测执行时启用的


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值