【问题标题】:Mapreduce execution in a hadoop cluster在 hadoop 集群中执行 Mapreduce
【发布时间】:2017-01-28 21:09:20
【问题描述】:

我对 Mapreduce 的工作原理有点困惑。我已经阅读了一些文章,但没有得到正确的答案。

场景:

我在 HDFS 上存储了一个大小为 1 TB 的文件(假设它存储在 /user/input/ 位置)。复制为 3,块大小为 128 MB。

现在,我想使用 mapreduce 分析这个 1TB 的文件。由于块大小为 128 MB,我总共将有 8192 个块。考虑到集群中有 100 台机器,那么

会在所有 100 个节点上产生 8192 个映射任务,平均分配映射器的数量吗?或者它只会在放置复制数据的那些节点上运行?

【问题讨论】:

    标签: hadoop mapreduce


    【解决方案1】:

    Mappers 的数量取决于 InputSplits 而不是复制因子。

    请参阅下面的帖子了解 InputSplits 的内部原理:

    How does Hadoop process records split across block boundaries?

    ma​​ppersreducers 的数量由 Hadoop Framework 决定。

    更多详情请参考以下帖子:

    Default number of reducers

    为简单起见,假设 HDFS 块和 InputSplit 相同,但数据不跨越多个数据节点。

    在您的情况下,1 TB 文件处理需要 8192 地图。在启动 Map 任务时,map 任务会尝试在存在数据的节点上运行 Mapper。 8192 个块的 1 TB 文件可能没有均匀分布在 100 个节点上。如果它们均匀分布在 100 个节点上,Framework 将在所有 100 个节点上运行地图任务。 数据局部性在数据节点的选择中起着关键作用。

    【讨论】:

    • 谢谢拉宾德拉。很好的解释
    【解决方案2】:

    要运行的映射器数量不取决于节点或块的数量或任何其他东西,它们仅取决于输入拆分的总数。 在数据库上下文中,拆分可能对应于行范围。

    现在 HDfS 中的一个块可能为 128 mb,输入拆分的大小为 256 mb,在这种情况下,只有 1 个映射器会在覆盖 2 个块的输入拆分上运行。 现在问题出现了如何创建输入拆分 这些拆分由 InputFormat 类创建,该类包含负责创建拆分的 getSplit 和 createrecordreader 方法,如果您想更改这些拆分的创建方式,可以覆盖这些方法。

    这些映射器作业在集群的不同节点上启动,但不能保证它会均匀分布。 Mapreduce 总是尝试将映射器作业分配给需要处理本地数据的节点。如果这是不可能的,它会将映射器作业分配给具有最佳资源的节点。

    请注意,输入拆分不包含实际数据。他们参考了数据。这些存储的位置有助于 mapredUce 分配作业。

    我建议您访问此链接http://javacrunch.in/Yarn.jsp,它将让您了解纱线如何用于工作分配。您也可以访问这里了解 map reduce http://javacrunch.in/MR.jsp 的内部工作。

    希望这能解决您的问题

    【讨论】:

    • 谢谢悉达多。上面的解释解决了我的疑惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 2015-02-13
    相关资源
    最近更新 更多