理解MapReduce数据流

简介:

先理解MapReduce作业组成

     一个完整的MapReduce作业称作 job,它包括三部分:
    1. 输入数据
    2. MapReduce程序
    3. 配置信息     
     Hadoop工作时会将job分成若干个 task:map任务和reduce任务 
     有两类节点控制作业执行的过程: JobTrackerTaskTracker
    • JobTracker:记录作业整体进度,对TaskTracker进行调度
    • TaskTracker:执行task任务并向JobTracker汇报    

大块数据先流入map

     Hadoop会将输入数据划分成等长的数据块,成为 数据分片。Hadoop会为每个分片构建一个map任务。并行的处理分片时间肯定会少于处理整个大数据块的时间,但由于各个节点性能及作业运行情况的不同,每个分片的处理时间可能不一样, 因此,把数据分片切分的更细可以得到更好的负载均衡
     但另一方面, 分片太小的话,管理分片和构建map任务的时间将会增多。因此,需要在hadoop分片大小和处理分片时间之间做一个权衡。对大多数作业来说,一个分片大小为64MB比较合适,其实,Hadoop的默认 块大小也是64MB。
     我们上面看到了 hadoop的数据块大小与最佳分片大小相同,这样的话,数据分片就不容易跨数据块存储,因此,一个map任务的输入分片便可以直接读取本地数据块,这就避免了再从其它节点读取分片数据,从而节省了网络开销。
      map的任务输出是写入到本地磁盘而非HDFS的。那么为什么呢?因为map任务输出的是中间结果,一旦map任务完成即会被删除,如果把它存入HDFS中并实现备份容错,未免有点大题小做。如果一个map任务失败,hadoop会再另一个节点重启map一个map任务。

数据从map流入reduce

     而 reduce任务并不具备 数据本地化 优势——单个reduce任务的输入通常来自所有mapper输出。 一般排序过的map输出需要通过网络传输发送到运行reduce任务的节点,并在reduce端进行合并。reduce的输出通常需要存储到HDFS中以实现可靠存储。每个reduce输出HDFS块第一个复本会存储在本地节点,而其它复本则存储到其它节点,因此 reduce输出也需要占用网络带宽

如下图:一个reduce任务的MapReduce任务数据流


     reduce任务的数量并非由输入数据大小决定,而是特别指定。如有多个reduce任务,则每个map任务都会对其输出进行 分区(partition),因为每个reduce任务会建一个分区。相同键的记录都会被partition到同一个分区中。具体的分区方式由分区函数来控制,一般通过hash函数来分区。
      我们把map任务和reduce任务之间的数据流称为 shuffle,因为每个reduce任务的输入都来自多个map任务,因此,这个阶段比较复杂,而shuffle过程中的参数调整对job运行的总时间是有非常大的影响的,一般MapReduce的调优主要就是调整shuffle阶段的参数。
如下图:多个reduce任务的数据流


如何减少从map到reduce的数据量

     集群上的可用带宽限制了MapReduce的作业数量,因为map的中间结果传递给reduce是要经过网络传输的,因此最重要的一点就是尽量减少map和reduce任务间传输的数据量。不过,Hadoop允许用户针对map任务的输出指定一个合并函数(combiner),用合并函数的输出作为reduce函数的输入,但需要注意,合并函数的运用不应该改变reduce函数的计算结果。
     例如有两个map的输出分别是map1={ 0,20,10 };map2={ 15,25 },求最大值,我们可以对先每个map的数据的数据进行合并,合并完成之后再传输给reducer:
      map1={ 0,20,10 }->combiner->{20};
      map2={ 15,25 }->combiner->{25};
     reducer->{25}
     即 max(0,20,10,15,25)=max(max( 0,20,10),max(15,25))=25

如下图:将combiner后的输出作为reducer的输入

     
     但需要特别注意的是,并不是任何场景都是可以用combiner的,比如把上面的例子改成求平均值:
    • combiner后的reducer的结果:       avg(avg(0,20,10),avg(15,25))=avg(10,20)=15;
    • 没有进行combiner的reducer结果:  avg(0,20,10,15,25)=14;
































目录
相关文章
|
7月前
|
分布式计算 大数据 Apache
【大数据技术】流数据、流计算、Spark Streaming、DStream的讲解(图文解释 超详细)
【大数据技术】流数据、流计算、Spark Streaming、DStream的讲解(图文解释 超详细)
206 0
|
2月前
|
分布式计算 Hadoop 大数据
MapReduce的详细过程是什么?
【10月更文挑战第9天】MapReduce的详细过程是什么?
173 0
|
2月前
|
消息中间件 分布式计算 Kafka
大数据-99 Spark 集群 Spark Streaming DStream 文件数据流、Socket、RDD队列流
大数据-99 Spark 集群 Spark Streaming DStream 文件数据流、Socket、RDD队列流
38 0
|
7月前
|
负载均衡 算法 大数据
[flink 实时流基础] 转换算子
[flink 实时流基础] 转换算子
101 2
|
7月前
|
消息中间件 关系型数据库 MySQL
[flink 实时流基础] 输出算子(Sink)
[flink 实时流基础] 输出算子(Sink)
252 1
|
分布式计算 IDE Hadoop
E-Mapreduce 流式处理|学习笔记
快速学习 E-Mapreduce 流式处理
E-Mapreduce 流式处理|学习笔记
|
分布式计算 流计算 Spark
|
消息中间件 分布式计算 Hadoop
MapReduce 不适合处理实时数据的原因剖析
1.概述    Hadoop已被公认为大数据分析领域无可争辩的王者,它专注与批处理。这种模型对许多情形(比如:为网页建立索引)已经足够,但还存在其他一 些使用模型,它们需要来自高度动态的来源的实时信息。为了解决这个问题,就得借助Twitter推出得Storm。Storm不处理静态数据,但它处理预
7654 0
|
SQL API 流计算
Flink-数据流编程模型
Flink执行批处理程序作为流程序的特殊情况,其中流是有界的(有限的元素数量)。数据集在内部被视为数据流。因此,上述概念同样适用于批处理程序,也适用于流程序
2254 0