如何理解hadoop文件大小和局部性优化

How to understand hadoop file size and locality optimization

默认情况下,Hadoop 块大小为 64MB。建议Hadoop中每个文件小于64MB,这样每个文件都在一个块中。当一个map函数启动时,它可以从一个块中读取文件的所有数据,而无需额外的数据传输。这样就实现了局部优化。

我的问题是,这条规则是否适用于可以拆分的文件?例如。大多数文本文件、csv 文件。

每个 map 函数仅处理一个 文件拆分 。并且默认的文本文件拆分器确保每个拆分都属于一个块。所以我认为对于CSV格式的文件,即使超过1个块大小,仍然可以保证局部优化。

你是对的,默认情况下每个 Map 函数处理一个 文件分割 ,其大小是一个块。

但是局部优化不能得到保证,因为你可以在数据节点上有更多的文件块,然后是那个节点上的映射槽。例如,您的集群节点存储文件的三个块,但只有两个映射槽。在这种情况下,两个 Mapper 进程将在本地节点上执行,一个在远程节点上执行。一个数据块将通过网络传输到远程节点。

此外,如果您有大量小文件(小于块大小),您仍然可以使用 CombineFileInputFormat[=21= 在一个磁盘操作中读取完整的 HDFS 块](example)。这种方法可以显着提高性能。

几乎总是建议 HDFS 中的每个文件都(远)大于块大小,以增加进程读取完整块的可能性,并减少 NameNode 内存争用。

HDFS 的默认块大小为 128MB for a while now