HDFS/Hadoop的默认数据块大小为64MB。磁盘中的块大小通常为4KB。
64MB块大小是什么意思? ->这是否意味着从磁盘读取的最小单位为64MB?
如果是,这有什么优点? ->易于在HDFS中连续访问大文件?
我们能否使用磁盘原始的4KB块大小来做同样的事情?
64MB块大小是什么意思?
块大小是文件系统可以存储的最小数据单元。如果您存储的文件大小为1k或60Mb,则将占用一个块。一旦超过64Mb的边界,您需要第二个块。
如果使用64MB块大小,有什么好处?
HDFS旨在处理大文件。假设您有一个1000Mb的文件。使用4k块大小,您需要进行256,000个请求才能获取该文件(每个块1个请求)。在HDFS中,这些请求经过网络并伴随着大量开销。每个请求必须由Name Node处理,以确定可以找到该块的位置。这是很多流量!如果使用64MB块,则请求数量减少到16,从而显着降低了开销和对Name Node的负载。
Hadoop选择64MB的原因是因为Google选择了64MB。
Google选择64MB的原因是由于一个Goldilocks(小熊维尼)论点:
如果块大小要小得多,将导致查找开销增加。
将块大小适度缩小可以使映射任务运行得足够快,以至于调度它们的成本与运行它们的成本相当。
块大小显着增大开始减少可用的读并行性,并最终可能使本地任务调度变得困难。
参见Google研究发表: MapReduce http://research.google.com/archive/mapreduce.html
另外,如果块太多,将会给Name Node带来压力。请注意,Name Node必须在内存中存储整个元数据(关于块的数据)。在Apache Hadoop中,默认块大小为64 MB,在Cloudera Hadoop中默认为128 MB。
以下是《Hadoop权威指南》第三版(第45页)的解释:
HDFS块为什么这么大?
HDFS块与磁盘块相比较大,原因在于最小化寻道成本。通过使块足够大,从磁盘传输数据的时间可以显著长于寻找块的起始位置所需的时间。因此,由多个块组成的大文件的传输时间以磁盘传输速率运行。
快速计算表明,如果寻道时间约为10毫秒,传输速率为100 MB/s,则要使寻道时间占传输时间的1%,我们需要将块大小设置为约100 MB。默认值实际上为64 MB,尽管许多HDFS安装使用128 MB块。随着新一代磁盘驱动器的传输速度增加,这个数字将继续向上修订。
然而,这个论点不应被过分强调。MapReduce中的Map任务通常一次处理一个块,因此,如果您的任务数量太少(少于集群中的节点数),则作业的运行速度将比其本来可以达到的速度慢。