2013-07-18 57 views
17

我正在通过hadoop权威指南,它清楚地解释了输入分割。 它是这样Hadoop输入分割大小与块大小

输入拆分不包含实际数据,而它具有存储 位置数据在HDFS

通常情况下,输入分配的大小与块大小相同

1)假设一个64MB的块位于节点A上,并在2个其他节点(B,C)之间复制,并且map-reduce程序的输入分割大小为64MB,那么这个分割对于节点A而言是否具有位置?或者它是否具有所有三个节点A,b,C的位置?

2)由于数据对所有三个节点都是本地的,框架如何决定(选择)一个在特定节点上运行的maptask?

3)如果输入拆分大小大于或小于块大小,它是如何处理的?

回答

16
  • 有点不同通过答案@ user1668782是一个很好的解释对于这个问题,我会尝试给出一个图形化的描述。

  • 假设我们有400MB一个文件由4条:400MB的CSV文件,它有4个排,每100MB)

enter image description here

  • 如果HDFS 块大小被配置为128MB,那么4条记录将不会均匀地分布在这些块之间。它看起来像这样。

enter image description here

  • 块1包含整个第一记录和第二记录的28MB块。
  • 如果要在块1上运行映射程序,映射程序将无法处理,因为它不会有整个第二条记录。
  • 这是确切的问题,输入拆分解决。 输入拆分尊重逻辑记录边界。

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

enter image description here

  • 因此输入分配1应该同时具有记录1和记录2.与由于记录2已分配给输入分割1,输入分割2不会以记录2开始。输入分割2将以记录3开始。

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

希望这会有所帮助。

+2

为什么输入拆分2和3的大小是100 MB,第一个是200 MB? – ssinganamalla

+0

我们可以为每个块分配不同的输入分配吗?或者它只是逻辑表示 – Akki

0

对于1)和2):我不是100%肯定的,但是如果任务无法完成 - 无论出于何种原因,包括输入拆分有什么问题 - 然后终止并且另一个开始place:因此每个maptask都只有一个包含文件信息的分割(你可以通过调试本地集群来查看是否属于这种情况,以查看输入分割对象中保存了哪些信息:我似乎记得它只是一个位置) 。

到3):如果文件格式是可拆分的,那么Hadoop将尝试将文件剪切为“inputSplit”大小的块;如果不是,那么无论文件大小如何,它都是每个文件的一个任务。如果更改minimum-input-split的值,那么如果每个输入文件被划分为块大小,则可以防止产生过多的映射器任务,但如果您执行某些操作,只能将合并为输入与组合类的魔法(我认为这就是所谓的)。

+0

我认为“节点邻近”的概念回答问题1和2. – rohith

+0

输入拆分是逻辑的,它实际上并不包含文件数据。它引用了存储块的位置(节点)。 – rohith

4

输入拆分是记录的逻辑划分,而HDFS块是输入数据的物理分区。当它们相同时它效率非常高,但实际上它从来没有完全一致。记录可能会跨越块边界。 Hadoop保证处理所有记录。处理特定分割的机器可以从除“主”块之外的块获取记录的片段,并且该片段可以远程驻留。获取记录片段的通信成本是无关紧要的,因为它发生得相对较少。

0

Hadoop框架的优势在于它的数据本地化。因此,无论何时客户端请求hdfs数据,框架总是检查本地,否则它会寻找很少的I/O利用率。

19

块是数据的物理表示。分割是Block中数据的逻辑表示。

块和拆分大小可以在属性中更改。

地图通过拆分从块中读取数据,即拆分作为块和映射器之间的代理。

考虑两个块:

块1

AA BB CC DD EE FF GG HH II JJ

块2

WW EE YY UU二OO oo pp kk ll nn

现在地图读取块1,直到aa到JJ,并且不知道如何读取块2,即块不知道如何处理不同的信息块。这里有一个Split,它将形成Block 1和Block 2的逻辑分组为单块,然后使用输入格式和记录阅读器形成偏移(键)和行(值)并发送映射以进行进一步处理。

如果您的资源有限,并且您想限制地图数量,则可以增加分割大小。 例如: 如果我们有640 MB的10块,即每块64 MB和资源是有限的,那么你可以提到分割大小为128 MB,然后形成128 MB的逻辑分组,并且只有5个地图将被执行大小为128 MB。

如果我们指定拆分大小为假,那么整个文件将形成一个输入拆分并由一个地图处理,当文件很大时需要更多时间来处理它。

+1

如果block1在machine1上,block2在machine2上。假设地图在机器1上运行,如果拆分大小是块大小的两倍。 machine1上的map函数是否从machine2中获取block2来处理? – user2626445

+2

是map1从machine2获取block2来处理 –

+0

输入split可以小于块大小吗? –

0

HDFS块大小是精确数字,但输入分割大小是基于我们的 数据逻辑,其可以是与配置的数目

0

输入拆分是馈送给每个映射器的逻辑数据单元。数据分为有效记录。输入拆分包含块地址和字节偏移量。

比方说,您有一个跨越4个块的文本文件。

文件:

A B C d
E F G H
I J K L
米2 N 2 O p

块:

BLOCK1:ABCDE
BLOCK2:FGHIJ
BLOCK3:KLMNO
块4:P

拆分:

分割1:abcdefh
Split2:ijklmnop

观察分裂是内联与来自文件的边界(记录)。现在,每个分割都被送到一个映射器。

如果输入拆分大小小于块大小,则最终将使用更多的mapper,反之亦然。

希望有所帮助。

相关问题