简介:
- 每个 Map 任务以 Key/Value 对的形式输出数据。
-
- mapreduce.tasktracker.map.tasks.maximum:8
-
- 任务跟踪器将同时运行的最大map任务数
- mapreduce.map.memory.mb:128
-
- 为每个map任务从调度程序请求的内存量。
- 输出存储在环形缓冲区中,而不是直接写入磁盘。
- 当 Ring Buffer 达到 80% 容量时,内容将“溢出”到磁盘。
-
- 此过程将在数据节点上创建多个文件(随机溢出文件)。
- mapreduce.map.sort.spill.percent:0.80
-
- 序列化缓冲区中的软限制。一旦达到,线程将开始在后台将内容溢出到磁盘。请注意,如果溢出已经在进行中超过此阈值,则收集不会阻塞,因此当设置为小于 .5 时,溢出可能会大于此阈值
- Hadoop 会将给定数据节点上的所有溢出文件合并到一个文件中
-
- 这个单个文件根据 reducer 的数量进行排序和分区。
- mapreduce.task.io.sort.mb: 512
-
- 排序文件时使用的缓冲区内存总量,以兆字节为单位。默认情况下,给每个合并流 1MB,这应该最小化查找。
- mapreduce.task.io.sort.factor:64
-
- 排序文件时一次合并的流数。这决定了打开文件句柄的数量。
- mapreduce.reduce.shuffle.input.buffer.percent: 0.70
-
- 在洗牌期间从最大堆大小分配到存储映射输出的内存百分比。
- mapreduce.reduce.input.buffer.percent:0.70
-
- 内存百分比 - 相对于最大堆大小 - 在 reduce 期间保留映射输出。当洗牌结束时,内存中任何剩余的映射输出必须消耗少于此阈值才能开始减少。
- mapreduce.reduce.shuffle.parallelcopies:128
-
- 在复制(洗牌)阶段由 reduce 运行的默认并行传输数。
- mapreduce.reduce.memory.mb: 1024
-
- 为每个 reduce 任务从调度程序请求的内存量。
- mapreduce.reduce.shuffle.merge.percent:0.66
-
-
启动内存合并的使用阈值,表示为分配给存储内存映射输出的总内存的百分比,如 mapreduce.reduce.shuffle.input.buffer.percent 所定义。
-
环形缓冲区
环形缓冲区(又名循环缓冲区)是 MapReduce 生态系统中的一个关键概念。
我们在任何 map/reduce 程序中都面临两大挑战:
- 我们正在处理海量数据
-
- 如果这不是真的,我们就不需要使用 map/reduce
- map任务的结果不能不断的写到磁盘
-
- 这太慢了
- 也不能完全存储在内存中
-
-
大多数系统没有足够的内存
-
我们必须有效地使用磁盘/内存的组合。
循环缓冲区很快。写入内存比对磁盘执行 I/O 快得多。仅在需要时才执行刷新数据。
连续记录会填满系统空间,导致其他程序也耗尽空间并失败。在这种情况下,要么必须手动删除日志,要么必须实施日志轮换策略。
参考
- Hadoop 内幕
-
- 我读过的最好的 Hadoop 架构综合概述之一。
- 该文档似乎是最新的 YARN 和其他生态系统改进。
- 环形缓冲区的优点
-
- 映射任务在执行时写入环形(又名循环)缓冲区
- 本文与 Hadoop 无关,但了解此缓冲区的工作原理将有助于理解 mapred-site.xml 配置参数
-
- 属性:mapreduce.map.sort.spill.percent
- 说明: 序列化缓冲区中的软限制。一旦达到,线程将开始在后台将内容溢出到磁盘。请注意,如果溢出已经在进行中超过此阈值,则收集不会阻塞,因此当设置为小于 .5 时,溢出可能会大于此阈值
- 默认值:0.80
- [Quora] Apache Spark 与 Hadoop
-
- 很好地讨论了 map-side 和 reduce-side 的差异。
- 有助于理解 Hadoop 独立于 Spark 的设计。