现在记录一下为什么HDFS上一个block设置128M,参考了博客进行理解。
block块为什么设置的比较大
这是一个经典的面试题,需要从性能和储存上来考虑。
传输性能上考虑
在硬盘上读取数据就是一个个的扇区读取的,读取的最小单位是扇区sector,一个扇区大小一般为512byte,如果要读取到一个数据,需要完成寻址操作和读取操作,就首先找到数据存储的地方,让磁头找到要读取的扇区,然后读取。
HDFS系统不像物理的磁盘一样,是一种建立在物理文件系统上的抽象的文件系统,读取数据的最小单位是block。它也需要寻址和读取操作,一般来说需要设置寻址的时间除以读取时间越短越好,这样可以最小化寻址开销,即让寻址在读取文件的总时间中最少。如果一个block设置很小,则寻址的时间和读取的时间可能会差不多,这样读取一个文件寻址所占的时间可能会很多。
打个比方计算一下,考虑到磁盘传输数据的速度明显大于定位所需要的时间,假设传输速率100M/s,定位一个block时间0.1s(实际比这个快)。
(1)如果block设置为10M,一个100M文件需分成10个block,则读取一个10M的block,定位时间0.1s,读取时间也是0.1s,则读取完100M文件总共需要2s,寻址相当如占了一半时间。
(2)如果将block设置为100M,则定位1次需要0.1s,读取一次完成需要1s,总共只需要1.1s,明显节约了时间。
所以block块的大小不能设置过小,需要设置大一些,现在Hadoop 2.X中,考虑到磁盘传输速度和寻址时间,一般设置128M。
那为什么不将block设置越大越好呢,这是因为MapReduce执行任务时一次只能处理一个block的数据,如果设置越大就会有越少的map来执行任务,这样会影响计算性能,因此也不能设置过大。
存储性能上考虑
简单理解,存储上如果block设置过小,则会产生的更多的元数据(块的位置、大小等信息,150字节),这样对namenode来说压力很增大,因此也不建议block设置过小。
设置128M原因
以下是设置128M的原因分析,参考了如下博客。
(1)现有条件:HDFS寻址时间实际大概0.01s,即10ms,普通磁盘的传输速度100M/s,由于一般HDFS部署在廉价的机器上因此考虑普通磁盘也是有道理的。
(2)测试经验:大量测试经验表明寻址时间占传输时间的1%是性能比较优的。因此寻址一次0.01s,比较适合输出1s的数据,所以100M/s下就是可以传输100M的数据,因此选择128M。
实际生产中,磁盘传输效率会更高,就会设置block的大小更大一些,可以参考上面的计算方法估算。