HDFS也有块(Block)的概念,但它的块是一个很大的单元,默认是64MB。像硬盘中的文件系统一样,在HDFS中的文件将会按块大小进 行分解,并作为独立的单元进行存储。但和硬盘中的文件系统不一样的是,存储在块中的一个比块小的文件并不会占据一个块大小的硬盘物理空间(HDFS中一个 块只存储一个文件的内容)。
那为什么HDFS中的块如此之大呢?
HDFS的块之所以这么大,主要原因就是为了把寻道(Seek)时间最小化。如果一个块足够大,那么从硬盘传输数据的时间将远远大于寻找块的起始位置的时间。这样就使得HDFS的数据传输速度和硬盘的传输速度更加接近。
让我们来个简单的计算,假设寻道时间大约为10ms,传输速度为100MB/s。为了使得寻道时间仅为传输时间的1%,我们就需要设置块的大小为100MB。尽管很多应用的HDFS使用128MB的块,但默认的大小是64MB,这个参数将随着新一代硬盘速度的增长而增长。
虽然大块有一定好处,但也不能太大。MR中的Map tasks一般一次只处理一个块,所以如果你的tasks太少了(少于你集群中的节点数),相对于设置较小块的Jobs来说,你的Jobs将会运行得比较慢。