关于map task、reduce task和hdfs块大小的理解

map task的数量由输入文件总大小和分片大小确定;reduce task的数量需要手动设定,如果没有设定,默认是1,因此要想有效的利用分布式,可以通过设定reduce的数量进行优化。比如:可以在程序中通过conf.setNumReduceTasks(3)设定。hdfs的数据块默认是64M,若一个文件大于64M,通过将大文件分解得到若干个数据块;若一个文件小于64M,则按它的实际大小组块存储;因此可以解释为什么hdfs喜欢海量的大文件,而不喜欢海量的小文件:(1)海量的小文件需要namenode存储较多的元数据信息记录块的位置(假如一个64M的数据块(大文件分解的块)需要1k的元数据信息,那么1M的数据块(小文件的块)仍需要1k的元数据信息)(2)HDFS就是为流式访问大文件而设计的,如果访问大量小文件,需要不断的从一个datanode跳到另一个datanode,严重影响性能。hdfs的一个数据块一定属于一个文件;这里又有个问题:为什么map task分片大小最好和hdfs设置的块大小一致呢?我们综合考虑两点:(1)map task的个数=输入文件总大小/分片尺寸。也就是说分片尺寸越大,map task的个数就越少=>系统执行的开销越小,系统管理分片的开销越小。(2)网络传输开销,如果分片太大以至于一个分片要跨越多个HDFS块,则一个map任务必须要由多个块通过网络传输,,所以分片大小的上限是HDFS块的大小。所以,map任务时的分片大小设置为HDFS块的大小是最佳选择。我们可以通过hadoop fs命令:hadoop fsck /xxx -files -blocks 来显示xxx文件由哪些块构成,fsck在linux下是file system check的意思,也就是说这个命令可以检查HDFS根目录(/)下所有文件或任意一个文件下的所有块的健康状况。

不要忘本,任何时候,任何事情。

关于map task、reduce task和hdfs块大小的理解

相关文章:

你感兴趣的文章:

标签云: