默认情况下,Hadoop块大小为64MB。建议Hadoop中的每个文件小于64MB,以便每个文件都在一个块中。当 map 函数启动时,它可以从一个块中读取文件中的所有数据,而无需额外的数据传输。这样就可以实现局部优化。
我的问题是,此规则是否适用于可以拆分的文件?例如。大多数文本文件,csv文件。
每个地图功能仅处理文件的拆分。默认的文本文件spliter确保每个拆分都属于一个块。所以我认为对于CSV格式的文件,即使它超过1块大小,仍然可以保证局部优化。
答案 0 :(得分:1)
您是对的,默认情况下,每个 Map 功能处理一个文件分割,其大小为一个块。
但是可以保证局部性优化不能,因为您可以在datanode上拥有更多的文件块,然后是该节点上的Map插槽。例如,您的群集节点存储该文件的三个块,但只有两个Map槽。在这种情况下,将在本地节点上执行两个Mapper进程,在远程节点上执行一个Mapper进程。一个数据块将通过网络传输到远程节点。
此外,如果您有大量小文件(小于块大小),您仍然可以使用 CombineFileInputFormat ({{3)在一个磁盘操作中读取完整的HDFS块。 }})。这种方法可以显着提高性能。
答案 1 :(得分:0)
几乎总是建议HDFS中的每个文件(块)大于块大小,以增加进程读取整个块的可能性,并减少NameNode内存争用。
HDFS的默认块大小为128MB for a while now。