Map/Reduce 这种模式出现了多少次?

146 阅读3分钟

image.png

简介:

  1. 每个 Map 任务以 Key/Value 对的形式输出数据。
    1. mapreduce.tasktracker.map.tasks.maximum:8
      1. 任务跟踪器将同时运行的最大map任务数
    2. mapreduce.map.memory.mb:128
      1. 为每个map任务从调度程序请求的内存量。
  2. 输出存储在环形缓冲区中,而不是直接写入磁盘。
  3. 当 Ring Buffer 达到 80% 容量时,内容将“溢出”到磁盘。
    1. 此过程将在数据节点上创建多个文件(随机溢出文件)。
    2. mapreduce.map.sort.spill.percent:0.80
      1. 序列化缓冲区中的软限制。一旦达到,线程将开始在后台将内容溢出到磁盘。请注意,如果溢出已经在进行中超过此阈值,则收集不会阻塞,因此当设置为小于 .5 时,溢出可能会大于此阈值
  4. Hadoop 会将给定数据节点上的所有溢出文件合并到一个文件中
    1. 这个单个文件根据 reducer 的数量进行排序和分区。
    2. mapreduce.task.io.sort.mb: 512
      1. 排序文件时使用的缓冲区内存总量,以兆字节为单位。默认情况下,给每个合并流 1MB,这应该最小化查找。
    3. mapreduce.task.io.sort.factor:64
      1. 排序文件时一次合并的流数。这决定了打开文件句柄的数量。
    4. mapreduce.reduce.shuffle.input.buffer.percent:  0.70
      1. 在洗牌期间从最大堆大小分配到存储映射输出的内存百分比。
    5. mapreduce.reduce.input.buffer.percent:0.70
      1. 内存百分比 - 相对于最大堆大小 - 在 reduce 期间保留映射输出。当洗牌结束时,内存中任何剩余的映射输出必须消耗少于此阈值才能开始减少。
    6. mapreduce.reduce.shuffle.parallelcopies:128
      1. 在复制(洗牌)阶段由 reduce 运行的默认并行传输数。
    7. mapreduce.reduce.memory.mb: 1024
      1. 为每个 reduce 任务从调度程序请求的内存量。
    8. mapreduce.reduce.shuffle.merge.percent:0.66
      1. 启动内存合并的使用阈值,表示为分配给存储内存映射输出的总内存的百分比,如 mapreduce.reduce.shuffle.input.buffer.percent 所定义。

环形缓冲区

环形缓冲区(又名循环缓冲区)是 MapReduce 生态系统中的一个关键概念。

我们在任何 map/reduce 程序中都面临两大挑战:

  1. 我们正在处理海量数据
    1. 如果这不是真的,我们就不需要使用 map/reduce
  2. map任务的结果不能不断的写到磁盘
    1. 这太慢了
  3. 也不能完全存储在内存中
    1. 大多数系统没有足够的内存

我们必须有效地使用磁盘/内存的组合。

循环缓冲区很快。写入内存比对磁盘执行 I/O 快得多。仅在需要时才执行刷新数据。

连续记录会填满系统空间,导致其他程序也耗尽空间并失败。在这种情况下,要么必须手动删除日志,要么必须实施日志轮换策略。

参考

  1. Hadoop 内幕
    1. 我读过的最好的 Hadoop 架构综合概述之一。
    2. 该文档似乎是最新的 YARN 和其他生态系统改进。
  2. 环形缓冲区的优点
    1. 映射任务在执行时写入环形(又名循环)缓冲区
    2. 本文与 Hadoop 无关,但了解此缓冲区的工作原理将有助于理解 mapred-site.xml 配置参数
      1. 属性:mapreduce.map.sort.spill.percent
      2. 说明: 序列化缓冲区中的软限制。一旦达到,线程将开始在后台将内容溢出到磁盘。请注意,如果溢出已经在进行中超过此阈值,则收集不会阻塞,因此当设置为小于 .5 时,溢出可能会大于此阈值
      3. 默认值:0.80
  3. [Quora]  Apache Spark 与 Hadoop
    1. 很好地讨论了 map-side 和 reduce-side 的差异。  
    2. 有助于理解 Hadoop 独立于 Spark 的设计