Hadoop中的分割大小与块大小

duo*_*gja 15 hadoop mapreduce hdfs

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

San*_*ngh 59

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


tha*_*_DG 11

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

在此输入图像描述

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

在此输入图像描述

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

  • 这是输入拆分解决的确切问题.输入拆分遵循逻辑记录边界.

  • 让我们假设输入分割大小为200MB

在此输入图像描述

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

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

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

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

希望这可以帮助.