【发布时间】:2014-07-07 19:09:16
【问题描述】:
我正在阅读Hadoop: The definitive guide。在理解一些概念的过程中,我阅读了一些 SO 的帖子,这让我同样困惑但澄清了。这里有几点我需要专家的意见来判断它是否正确以及如果它不正确会发生什么?
假设这是我的 HDFS 在具有一个节点的伪分布式集群中的外观:
/local/path/to/datanode/storage/0/blk_00001 300 MB
/local/path/to/datanode/storage/0/blk_00002 300 MB
/local/path/to/datanode/storage/0/blk_00003 300 MB
/local/path/to/datanode/storage/0/blk_00004 200 MB
我的文件总大小是 1100 MB,它被分成 300 MB 的块(这是我的块大小)。
现在我要开始我的 Mapreduce 工作了:
我了解InputFormat(进而拆分文件)决定了地图的数量。
案例 1:
我有以下设置:
split size mapred.min.split.size=400 MB
一共有三个 MR 工作。每个将有一个 400 MB 的输入大小来处理。
1) Mapper 1:这意味着第一个 MR 作业将使用来自 blk_00001 的 300 MB 和来自 blk_00002 的 100 MB,(数据局部性丢失)。
2) 映射器 2: 现在第二个映射器必须从位置 101 MB blk_00002 到 seek + 从 blk_00003 的另外 200 MB。
) Mapper 3: blk_0003 上还有 100 MB 需要处理,blk_0004 上还有 200 MB 需要处理。 现在大小为 300 MB,应该整体处理。
块大小在 MAPRED 任务中没有任何作用。
Q1:到这里为止一切都正确吗??????
案例 2:
现在假设我的 MR 工作有以下设置:
mapred.tasktracker.map.tasks.maximum=3。这意味着对于任何给定节点,并行运行三个地图任务。
Q2:如果上述所有映射器在同一个节点上并行运行,它们是在具有相似优先级的不同线程中运行,还是在 CPU 级别的单独进程中运行。
案例 3:如果我在 conf.setNumMapTasks(int num) 中的 num 大于拆分数。
也就是说,我有 num = 10,拆分数 = 3。将执行的总 MR 作业是 3。
**Q3:**正确吗??
reducer 任务:
Q4 映射器必须在减速器启动之前完成 - 据我所知,在所有情况下,任何例子都不会。因为键需要排序并交给reducers。
Q5那么mapred.reduce.slowstart.completed.maps=0.5的作用是什么。这意味着当 map 任务完成 50% 时,启动 reducer。但是reducer需要map作业才能完成。正确???
2) 如果我不指定任何内容,默认的减速器数量是多少。
proposed 一直使用 0.95 - 1.75 * (nodes * mapred.tasktracker.tasks.maximum)。因此,如果我有 5 个节点的集群,每个节点有 5 个核心,则公式给出 (0.95 * 5 * 5) = 24 reducers 。
所以我应该设置 conf.setNumReduceTasks(24)????
【问题讨论】: