Hadoop中的分割大小与块大小

时间:2015-05-30 17:33:21

标签: hadoop mapreduce hdfs

Hadoop中分割大小和块大小之间的关系是什么?正如我在this中读到的那样,分割大小必须是块大小的n倍(n是整数且n> 0),这是正确的吗?分割大小和块大小之间是否存在任何关系?

3 个答案:

答案 0 :(得分:55)

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

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

块大小和拆分大小之间的差异。

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

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

示例:

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

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

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

<强>结论:

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

答案 1 :(得分:11)

  • 假设我们有一个 400MB 的文件,其中包含 4条记录例如:400MB的csv文件,它有4行,100MB每个)

enter image description here

  • 如果HDFS 块大小配置为 128MB ,则4个记录将不会均匀分布在块中。它看起来像这样。

enter image description here

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

  • 这是输入拆分解决的确切问题。 输入拆分尊重逻辑记录边界。

  • 假设输入拆分尺寸 200MB

enter image description here

  • 因此输入分割1 应该同时包含记录1和记录2.并且输入分割2不会以记录2开始,因为记录2已分配给输入分割1。输入分割2将以记录3开始。

  • 这就是输入拆分只是逻辑块数据的原因。它指向以块为单位的起始位置和结束位置。

  • 如果输入分割大小是块大小的n倍,则输入分割可以适合多个块,因此整个作业所需的 Mappers 数量更少,因此并行性更低。 (映射器的数量是输入分割的数量)

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

希望这有帮助。

答案 2 :(得分:1)

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

进行拆分的相应Java源代码为:

enter image description here
上述方法 computeSplitSize()扩展为 Max(minSize,min(maxSize,blockSize)),其中最小/最大大小可以通过设置 mapreduce.input.fileinputformat.split.minsize / maxsize