生成的map()的数量等于64MB输入数据块的数量。假设我们有2个1MB大小的输入文件,这两个文件将存储在一个块中。但是当我使用1个namenode和2个jobnodes运行我的MR程序时,我看到2个map()生成,每个文件一个。这也是因为系统试图在两个节点之间分割作业,即
Number of map() spawned = number of 64MB blocks of input data * number of jobnodes ?
另外,在mapreduce教程中,它的编写比块大小为128KB的10TB文件,将产生82000个地图。但是,根据地图数量仅取决于块大小的逻辑,必须生成78125个作业(10TB / 128MB)。我不知道生成的额外工作有多少?如果有人能分享你对此的想法,那将会很棒吗?谢谢。 :)
答案 0 :(得分:0)
默认情况下,每个输入文件生成一个映射器,如果输入文件的大小大于分割大小(通常与块大小相同),则对于该文件,映射器的数量将为文件大小/分割大小
现在说你输入5个文件,分割大小保持为64 MB
file1 - 10 MB
file2 - 30 MB
file3 - 50 MB
file4 - 100 MB
file5 - 1500 MB
启动的映射器数量
file1 - 1
file2 - 1
file3 - 1
file4 - 2
file5 - 24
总的地图制作者 - 29
答案 1 :(得分:0)
此外,输入分割大小和块大小并不总是受到尊重。如果输入文件是gzip,则它不可拆分。因此,如果其中一个gzip文件是1500mb,它将不会被拆分。最好使用块压缩与Snappy或LZO以及序列文件格式。
此外,如果输入为HBASE表,则不使用输入分割大小。对于HBase表,只有拆分才能保持表的正确区域大小。如果表未正确分发,请手动将表拆分为多个区域。
答案 2 :(得分:0)
映射器的数量仅取决于一件事,即您正在使用的InputFormat
创建的InputSplits的值(默认为TextInputFormat,它创建以\ n作为分隔符的拆分)。它不依赖于否。节点或文件或块大小(64MB或其他)。如果拆分等于块,那就非常好。但这仅仅是ideal
情况,cannot be guaranteed
总是如此。 MapReudce框架尽力优化流程。在这个过程中,例如为整个文件创建一个映射器(如果filesize小于块大小)。另一个优化可能是创建比分割数量少的映射器。 For example
如果你的文件有20行并且你正在使用TextInputFormat,那么你可能会认为你将获得20个映射器(因为没有.mappers = no。的分裂和TextInputFormat根据\ n创建分割)。但这不会发生。为这么小的文件创建20个映射器会产生不必要的开销。
如果分割的大小大于块大小,则剩余数据将从另一台机器上的另一个远程块移入,以便进行处理。
关于MapReduce教程:
如果您有10TB数据,那么 - (10 * 1024 * 1024)/ 128 = 81,920个映射器,几乎= 82,000
希望这能清除一些事情。