深入浅出:HADOOP分布式计算框架

hadoop分布式计算框架详解

1.1 分布式计算框架
1.1.1 编程模型
1. inputformat
在MapReduce 程序的开发过程中,往往需要用到FileInputFormat与TextInputFormat, 我们会发现TextInputFormat 这个类继承自FileInputFormat , FileInputFormat 这个类继承自InputFormat ,InputFormat 这个类会将文件file 按照逻辑进行划分,划分成的每一个split 切片将会被分配给一个Mapper 任务,文件先被切分成split 块,然后每一个split 切片对应一个Mapper 任务。FileInputFormat 的划分机制:
A. 简单地按照文件的内容长度进行切片
B. 切片大小,默认等于block 大小
C. 切片时不考虑数据集整体,而是逐个针对每一个文件单独切片
默认情况下, split size =block size,在hadoop 2.x 中为128M。注意:bytesRemaining/splitSize > 1.1 不满足的话,那么最后所有剩余的会作为一个切片。从而不会形成例如129M 文件规划成两个切片的局面。
2. MapTask 端的工作机制
inputFile 通过split 被逻辑切分为多个split 文件,通过Record按行读取内容给map(用户自己实现的)进行处理,数据被map 处
理结束之后交给OutputCollector 收集器,对其结果key 进行分区(默认使用hash 分区),然后写入buffer,每个map task 都有一个内存缓冲区,存储着map 的输出结果,当缓冲区快满的时候需要将缓冲区的数据以一个临时文件的方式存放到磁盘,当整个maptask 结束后再对磁盘中这个map task 产生的所有临时文件做合并,生成最终的正式输出文件,然后等待reduce task 来拉数据。Map端的输入的(k,v)分别是该行的起始偏移量,以及每一行的数据内容,map 端的输出(k,v)可以根据需求进行自定义,但是如果输出的是javabean 对象,需要对javabean 继承writable
3. shuffle 的过程
shuffle 的过程是:Map 产生输出开始到Reduce取得数据作为输入之前的过程称作shuffle.
1).Collect 阶段:将MapTask 的结果输出到默认大小为100M 的环形缓冲区,保存的是key/value,Partition 分区信息等。
2).Spill 阶段:当内存中的数据量达到一定的阀值的时候,就会将数据写入本地磁盘,在将数据写入磁盘之前需要对数据进行一次排序的操作,如果配置了combiner,还会将有相同分区号和key 的数据进行排序。
3).Merge 阶段:把所有溢出的临时文件进行一次合并操作,以确保一个MapTask 最终只产生一个中间数据文件。
4).Copy 阶段: ReduceTask 启动Fetcher 线程到已经完成MapTask 的节点上复制一份属于自己的数据,这些数据默认会保存在内存的缓冲区中,当内存的缓冲区达到一定的阀值的时候,就会将数据写到磁盘之上。
5).Merge 阶段:在ReduceTask 远程复制数据的同时,会在后台开启两个线程对内存到本地的数据文件进行合并操作。
6).Sort 阶段:在对数据进行合并的同时,会进行排序操作,由于MapTask 阶段已经对数据进行了局部的排序,ReduceTask 只需保证Copy 的数据的最终整体有效性即可。
Shuffle 中的缓冲区大小会影响到mapreduce 程序的执行效率,原则上说,缓冲区越大,磁盘io 的次数越少,执行速度就越快缓冲区的大小可以通过参数调整, 参数:io.sort.mb 默认100M
在这里插入图片描述4. reduceTask
reducer 将已经分好组的数据作为输入,依次为每个键对应分组执行reduce 函数。reduce 函数的输入是键以及包含与该键对应的所有值的迭代器。reduce 端的输入是map 端的输出,它输出的(k,v)根据需求进行自定义,reducetask 并行度同样影响整个job 的执行并发度和执行效率,与maptask的并发数由切片数决定不同,Reducetask 数量的决定是可以直接手动设置:job.setNumReduceTasks(4);如果数据分布不均匀,就有可能在reduce 阶段产生数据倾斜。默认的reduceTask 的是1
*Task 并行度经验之谈:
最好每个task 的执行时间至少一分钟。如果job 的每个map或者reduce task 的运行时间都只有30-40 秒钟,那么就减少该
job 的map 或者reduce 数,每一个task(map|reduce)的setup 和加入到调度器中进行调度,这个中间的过程可能都要花费几秒钟,所以如果每个task 都非常快就跑完了,就会在task 的开始和结束的时候浪费太多的时间。默认情况下,每一个task 都是一个新的JVM 实例,都需要开启和销毁的开销。在一些情况下,JVM 开启和销毁的时间可能会比实际处理数据的时间要消耗的长,配置task 的JVM 重用可以改善该问题:(mapred.job.reuse.jvm.num.tasks,默认是1,表示一个JVM 上最多可以顺序执行的task 数目(属于同一个Job)是1。也就是说一个task启动一个JVM),如果input 的文件非常的大,比如1TB,可以考虑将hdfs 上的每个blocksize 设大,比如设成256MB 或者512MB
5. outputformat
OutputFormat 主要用于描述输出数据的格式, 它能够将用户提供的key/value 对写入特定格式的文件中。Hadoop 自带了很多OutputFormat 的实现,它们与InputFormat 实现相对应,足够满足我们业务的需要。OutputFormat类的层次结构如下图所示
在这里插入图片描述OutputFormatOutputFormat 是MapReduce 输出的基类, 所有MapReduce 输出都实现了OutputFormat 接口,主要有:
TextInputFormat 、SequenceFileOutputFormat、MultipleOutputs、DBOutputFormat 等
1.1.2 特殊的组件partitioner 与combiner
1. partitioner 定义
partitioner 的作用是将mapper(如果使用了combiner 的话就是combiner)输出的key/value 拆分为分片(shard),每个reducer 对应一个分片。默认情况下,partitioner 先计算key 的散列值(通常为md5 值)。然后通过reducer 个数执行取模运算:key.hashCode%(reducer 个数)。这种方式不仅能够随机地将整个key空间平均分发给每个reducer,同时也能确保不同mapper 产生的相同key 能被分发到同一个reducer 。也可以自定义分区去继承partition<key,value>把不同的结果写入不同的文件中分区Partitioner 主要作用在于以下两点
(1)根据业务需要,产生多个输出文件;
(2)多个reduce 任务并发运行,提高整体job 的运行效率
适用范围:
需要非常注意的是:必须提前知道有多少个分区。比如自定义Partitioner 会返回5 个不同int 值,而reducer number 设置了小于5,那就会报错。所以我们可以通过运行分析任务来确定分区数。
2. map 端的combiner 组件
每一个map 都可能会产生大量的本地输出,Combiner 的作用就是对map 端的输出先做一次合并,以减少在map 和reduce 节点
之间的数据传输量,以提高网络IO 性能,是MapReduce 的一种优化手段之一。combiner 是MR 程序中Mapper 和Reducer 之外的一种组件,combiner 组件的父类就是Reducercombiner,它 和reducer 的区别在于运行的位置:combiner 是在每一个maptask 所在的节点运行,reducer 是接收全局所有Mapper 的输出结果;combiner 的意义就是对每一个maptask 的输出进行局部汇总,以减小网络传输量
具体实现步骤:
1)自定义一个combiner 继承Reducer,重写reduce 方法
2)设置: job.setCombinerClass(CustomCombiner.class)
Combiner 使用需要注意的是:
1.combiner 能够应用的前提是不能影响最终的业务逻辑,而且,combine输出kv 应该跟reducer 的输入kv 类型要对应起来
2.有很多人认为这个combiner 和map 输出的数据合并是一个过程,其实不然,map 输出的数据合并只会产生在有数据spill 出的时候,即进行merge 操作。
3.与mapper 和reducer 不同的是,combiner 没有默认的实现,需要显式的设置在conf 中才有作用。
4.并不是所有的job 都适用combiner,只有操作满足结合律的才可设置combiner。combine 操作类似于:opt(opt(1, 2, 3), opt(4,5, 6))。如果opt 为求和、求最大值的话,可以使用,但是如果是求中值的话,不适用。
5.一般来说,combiner 和reducer 它们俩进行同样的操作。
分布式计算的整个流程分析如下图所示:
在这里插入图片描述

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值