【问题标题】:Split size vs Block size in HadoopHadoop中的拆分大小与块大小
【发布时间】:2015-08-13 11:33:59
【问题描述】:

Hadoop 中的分割大小和块大小之间有什么关系?正如我在this 中读到的,拆分大小必须是块大小的 n 倍(n 是整数并且 n > 0),这是正确的吗?分割大小和块大小之间有什么必然的关系吗?

【问题讨论】:

    标签: hadoop mapreduce hdfs


    【解决方案1】:

    在 HDFS 架构中存在块的概念。 HDFS 使用的典型块大小为 64 MB。当我们将一个大文件放入 HDFS 时,它被分成 64 MB 的块(基于块的默认配置),假设您有一个 1GB 的文件,并且您想将该文件放入 HDFS,那么将有 1GB/64MB = 16 个拆分/块,这些块将分布在 DataNode 上。根据您的集群配置,这些块/块将驻留在不同的不同 DataNode 上。

    根据文件偏移量进行数据拆分。将文件拆分并将其存储到不同块中的目标是数据的并行处理和故障转移。

    块大小和分割大小的区别。

    Split 是数据的逻辑拆分,主要用于在 Hadoop 生态系统上使用 Map/Reduce 程序或其他数据处理技术进行数据处理。拆分大小是用户定义的值,您可以根据数据量(您正在处理的数据量)选择自己的拆分大小。

    Split 主要用于控制 Map/Reduce 程序中 Mapper 的数量。如果您没有在 Map/Reduce 程序中定义任何输入拆分大小,则默认的 HDFS 块拆分将被视为输入拆分。

    示例:

    假设你有一个 100MB 的文件,HDFS 默认的块配置是 64MB,那么它会被分成 2 个分割,占用 2 个块。现在您有一个 Map/Reduce 程序来处理此数据,但您尚未指定任何输入拆分,然后根据块数(2 个块)输入拆分将被考虑用于 Map/Reduce 处理,并为此分配 2 个映射器工作。

    但是假设您在 Map/Reduce 程序中指定了拆分大小(例如 100MB),那么两个块(2 个块)将被视为 Map/Reduce 处理的单个拆分,并且为此分配了 1 个 Mapper工作。

    假设,您在 Map/Reduce 程序中指定了拆分大小(例如 25MB),那么 Map/Reduce 程序将有 4 个输入拆分,并且将为该作业分配 4 个 Mapper。

    结论:

    1. 分割是输入数据的逻辑分割,而块是数据的物理分割。
    2. 如果未指定输入拆分,HDFS 默认块大小为默认拆分大小。
    3. 拆分是用户定义的,用户可以在其 Map/Reduce 程序中控制拆分大小。
    4. 一个拆分可以映射到多个块,一个块可以有多个拆分。
    5. map 任务 (Mapper) 的数量等于 split 的数量。

    【讨论】:

    • 最好的解释之一。我希望我可以无限投票。
    • sandeep bhai, badhiya :)
    【解决方案2】:
    • 假设我们有一个 400MB 的文件,其中包含 4 条记录例如:400MB 的 csv 文件,它有 4 行,100MB每个)

    • 如果 HDFS Block Size 配置为 128MB,则 4 条记录将不会在块之间均匀分布。它看起来像这样。

    • 块 1 包含整个第一条记录和第二条记录的 28MB 块。
    • 如果要在 Block 1 上运行映射器,则映射器将无法处理,因为它没有完整的第二条记录。

    • 这正是输入拆分解决的问题。 输入拆分遵守逻辑记录边界。

    • 假设 输入拆分 大小为 200MB

    • 因此,输入拆分 1 应该同时具有记录 1 和记录 2。并且输入拆分 2 不会从记录 2 开始,因为记录 2 已分配给输入拆分 1。输入拆分 2 将从记录 3 开始。

    • 这就是为什么输入拆分只是一个逻辑块数据。它用 in 块指向开始和结束位置。

    • 如果输入拆分大小是块大小的 n 倍,则输入拆分可以容纳多个块,因此整个作业所需的 Mapper 数量较少,因此并行度也较低。 (映射器的数量就是输入分割的数量)

    • 输入分割大小 = 块大小是理想的配置。

    希望这会有所帮助。

    【讨论】:

    • 为什么输入拆分为 2 100 mb 而不是 200 mb?
    • @ssinganamalla:这是一个错误。该图像中的所有输入拆分应为 200 MB
    • @tharindu_DG 请同时参考此文档wiki.apache.org/hadoop/HadoopMapReduce
    • 解释得真好!!
    【解决方案3】:

    Split 创建取决于所使用的 InputFormat。下图说明了 FileInputFormat 的 getSplits() 方法如何决定两个不同文件的拆分。
    请注意 Split Slope (1.1) 所扮演的角色。

    进行拆分的相应 Java 源是:


    上面的方法computeSplitSize()扩展为Max(minSize, min(maxSize, blockSize)),这里可以通过设置来配置min/max size mapreduce.input.fileinputformat.split.minsize/maxsize

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-03
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      相关资源
      最近更新 更多