【发布时间】:2015-08-13 11:33:59
【问题描述】:
Hadoop 中的分割大小和块大小之间有什么关系?正如我在this 中读到的,拆分大小必须是块大小的 n 倍(n 是整数并且 n > 0),这是正确的吗?分割大小和块大小之间有什么必然的关系吗?
【问题讨论】:
Hadoop 中的分割大小和块大小之间有什么关系?正如我在this 中读到的,拆分大小必须是块大小的 n 倍(n 是整数并且 n > 0),这是正确的吗?分割大小和块大小之间有什么必然的关系吗?
【问题讨论】:
在 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。
结论:
【讨论】:
如果要在 Block 1 上运行映射器,则映射器将无法处理,因为它没有完整的第二条记录。
这正是输入拆分解决的问题。 输入拆分遵守逻辑记录边界。
假设 输入拆分 大小为 200MB
因此,输入拆分 1 应该同时具有记录 1 和记录 2。并且输入拆分 2 不会从记录 2 开始,因为记录 2 已分配给输入拆分 1。输入拆分 2 将从记录 3 开始。
这就是为什么输入拆分只是一个逻辑块数据。它用 in 块指向开始和结束位置。
如果输入拆分大小是块大小的 n 倍,则输入拆分可以容纳多个块,因此整个作业所需的 Mapper 数量较少,因此并行度也较低。 (映射器的数量就是输入分割的数量)
输入分割大小 = 块大小是理想的配置。
希望这会有所帮助。
【讨论】: