默认情况下,hadoop块大小为64mb。建议hadoop中的每个文件都小于64mb,这样每个文件都在一个块中。当map函数启动时,它可以从一个块中读取文件的所有数据,而无需额外的数据传输。从而实现局部优化。我的问题是,这个规则是否适用于可以拆分的文件?e、 g.大多数文本文件,csv文件。每个map函数只处理一个文件的分割。默认的文本文件拆分器确保每个拆分都属于一个块。所以我认为对于像csv格式的文件,即使它超过1块大小,局部优化仍然可以保证。
j2cgzkjk1#
几乎总是建议hdfs中的每个文件都(远远)大于块大小,以增加进程读取完整块的可能性,并减少namenode内存争用。hdfs的默认块大小已经有一段时间是128mb了。
igsr9ssn2#
你说得对,默认情况下,每个Map函数处理一个文件分割,大小为一个块。但是局部性优化不能保证,因为datanode上可以有更多的文件块,然后是该节点上的Map槽。例如,集群节点存储文件的三个块,但只有两个Map槽。在这种情况下,将在本地节点上执行两个Map器进程,在远程节点上执行一个Map器进程。一块数据将通过网络传输到远程节点。此外,如果有大量小文件(小于块大小),仍然可以使用combinefileinputformat在一个磁盘操作中读取完整的hdfs块(示例)。这种方法可以显著提高性能。
2条答案
按热度按时间j2cgzkjk1#
几乎总是建议hdfs中的每个文件都(远远)大于块大小,以增加进程读取完整块的可能性,并减少namenode内存争用。
hdfs的默认块大小已经有一段时间是128mb了。
igsr9ssn2#
你说得对,默认情况下,每个Map函数处理一个文件分割,大小为一个块。
但是局部性优化不能保证,因为datanode上可以有更多的文件块,然后是该节点上的Map槽。例如,集群节点存储文件的三个块,但只有两个Map槽。在这种情况下,将在本地节点上执行两个Map器进程,在远程节点上执行一个Map器进程。一块数据将通过网络传输到远程节点。
此外,如果有大量小文件(小于块大小),仍然可以使用combinefileinputformat在一个磁盘操作中读取完整的hdfs块(示例)。这种方法可以显著提高性能。