如何映射减少程序处理两个节点之间的碎片数据

时间:2016-05-10 09:46:26

标签: mapreduce

我想了解mapreduce作业如何处理数据块。根据我对每个数据块的理解,调用一个映射器。 让我用一个例子来说明我的问题。

假设我有一个长文本文件,在4个节点上以4个块(64 MB)存储在HDFS中的数据(让我们忘记这里的复制)

在这种情况下,将在每台机器上调用4个map任务(所有4个数据节点/机器) 这里有一个问题:这个分裂可能导致存储在两个块上的部分记录。与最后一条记录一样,可能已经部分地存储在块1中(在结束时),而在块2上则存储在其他部分中。 在这种情况下,mapreduce程序如何确保处理完整的记录?

我希望,我能够提出我的问题

1 个答案:

答案 0 :(得分:0)

请在http://www.hadoopinrealworld.com/inputsplit-vs-block/

上阅读此文章

这是我在上面发布的同一篇文章的摘录。

块是块大小的硬分区数据。因此,如果群集中的块大小为128 MB,则数据集的每个块将为128 MB,除非最后一个块可能小于块大小(如果文件大小不能完全被块大小整除)。因此,块是块大小的硬切割,块甚至可以在逻辑记录结束之前结束。

考虑群集中的块大小为128 MB,每个逻辑记录的文件大约为100 Mb。 (是的......巨大的记录) 所以第一条记录完全适合块没有问题,因为记录大小100 MB与块大小128 MB相当。但是第二条记录不适合该区块,因此记录编号2将在区块1中开始,并将在区块2中结束。 如果将映射器分配给块1,在这种情况下,映射器不能处理记录2,因为块1没有完整记录2.这正是InputSplit解决的问题。在这种情况下,InputSplit 1将同时具有记录1和记录2.由于记录2已经包含在输入分割1中,因此InputSplit 2不以记录2开始。因此,InputSplit 2将只有记录3.如您所见,记录3是在Block 2和3之间划分,但仍然是InputSplit 2将拥有整个记录3。

块是磁盘中数据存储的物理块,而InputSplit不是物理数据块。 Inputsplit是一个Java类,带有指向块中起始位置和结束位置的指针。因此,当Mapper尝试读取数据时,它清楚地知道从哪里开始阅读以及在哪里停止阅读。 InputSplit的起始位置可以在一个块中开始,然后在另一个块中结束。

Happy Hadooping