关于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根目录(/)下所有文件或任意一个文件下的所有块的健康状况。


 

你可能感兴趣的:(Hadoop)