【问题标题】:clarification on Map tasks and reduce tasks in hadoop?澄清Hadoop中的Map任务和reduce任务?
【发布时间】: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)????

【问题讨论】:

    标签: hadoop mapreduce hdfs


    【解决方案1】:

    Q1:到这里为止一切都正确吗??????

    这取决于输入格式。 FileInputFormat 不会进行小于块大小的拆分,无论您将最小拆分大小设置为多少。这是计算分割大小的代码。

    protected long computeSplitSize(long goalSize, long minSize, long blockSize) {
      return Math.max(minSize, Math.min(goalSize, blockSize));
    }
    

    Q2:如果上述所有映射器在同一个节点上并行运行,它们是在具有相似优先级的不同线程中运行,还是在 CPU 级别的单独进程中运行。

    每个任务都在它自己的Java virtual machine 中运行,因此是独立的进程。

    Q3:如果我在 conf.setNumMapTasks(int num) 中的 num 大于拆分数。也就是说,我有 num = 10,拆分数 = 3。将执行的总 MR 作业是 3。

    setNumMapTasks()not supported anymore,仅作为 MapReduce 系统的提示。

    Q4:映射器必须在 reducer 启动之前完成 - 据我所知,在所有情况下,它都不会完成的任何示例。因为键需要排序并交给reducers。

    Q5 那么mapred.reduce.slowstart.completed.maps=0.5的效果是什么。这意味着当 map 任务完成 50% 时,启动 reducer。但是reducer需要map作业才能完成。正确???

    慢启动涉及将数据复制到适当的机器。在所有映射器都完成之前,reducer 中的 reduce() 方法不会被调用。

    如果我不指定任何内容,默认的减速器数量是多少。

    1

    所以我应该设置 conf.setNumReduceTasks(24)????

    最适合您的任务。

    【讨论】:

    • 感谢您的详细回答。我很感激。你能说一下上面的goalsize和minsize是什么吗?
    • 您提到每个任务都在单独的 JVM 中运行?这是否意味着,如果我有 50 个映射器,我将创建 50 个 JVM 实例?
    • 目标大小是输入格式想要使用的。 Minsize 是您将最小拆分大小设置为(或默认值)的值。
    • GoalSize 是如何确定的?那就是输入 Format 是如何知道要选择什么 GoalSize 的?
    • 我没有深入阅读它,但它可能是根据文件大小和是否压缩等多种因素确定的。
    猜你喜欢
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 2015-12-11
    • 2014-03-21
    相关资源
    最近更新 更多