HDFS/Hadoop的默认数据块大小为64MB。磁盘中的块大小一般为 4KB。
64MB块大小是什么意思?->这是否意味着从磁盘读取的最小单位是64MB?
如果是,这样做有什么好处?> HDFS 中连续访问大文件很容易?
我们可以通过使用磁盘的原始 4KB 块大小来做同样的事情吗?
64MB 块大小是什么意思?
块大小是文件系统可以存储的最小数据单元。 如果您存储 1k 或 60Mb 的文件,它将占用一个块。 一旦你越过64Mb边界,你需要第二个块。
如果是,这样做有什么好处?
HDFS旨在处理大文件。假设您有一个 1000Mb 的文件。 对于 4k 块大小,您必须发出 256,000 个请求才能获取该文件(每个块 1 个请求)。 在HDFS中,这些请求通过网络传输,并带来大量开销。 每个请求都必须由名称节点处理,以确定可以在何处找到该块。 这是很多流量! 如果使用 64Mb 块,则请求数将减少到 16 个,从而显著降低名称节点上的开销和负载成本。
HDFS的设计最初受到Google文件系统(GFS)设计的启发。以下是原始 GFS 论文中所述的块大小较大的两个原因(关于 GFS 术语与 HDFS 术语的注释 1:chunk = 块,chunkserver = datanode,master = namenode;注 2:粗体格式是我的):
大块大小提供了几个重要优势。首先,它减少了客户端与主节点交互的需求,因为在同一块上进行读取和写入只需要向主节点发出一个初始请求以获取块位置信息。这种减少对于我们的工作负载尤其重要,因为应用程序大多按顺序读取和写入大型文件。[...]其次,由于在大块上,客户端更有可能在给定块上执行许多操作,因此它可以通过在较长时间内保持与块服务器的持久TCP连接来减少网络开销。第三,它减少了存储在主节点上的元数据的大小。这使我们能够保留元数据在内存中,这反过来又带来了我们将在第 2.6.1 节中讨论的其他优点。
最后,我应该指出,Apache Hadoop 中当前的默认大小是 128 MB(参见 dfs.blocksize)。
在HDFS中,块大小控制复制去集群的级别。块大小越小,块在数据节点上的分布就越均匀。块大小越高,数据在集群中的分布可能越不均匀。
那么选择更高的块大小而不是一些低值有什么意义呢?虽然理论上数据的平均分布是一件好事,但块大小过低有一些明显的缺点。NameNode的容量是有限的,因此拥有4KB的块大小而不是128MB意味着还要存储32768倍的信息。MapReduce还可以通过在更多的NodeManager和更多的CPU内核上启动更多的映射任务来从平均分布的数据中获利,但在实践中,由于无法执行顺序的缓冲读取以及每个映射任务的延迟,理论上的好处将丧失。
在正常的操作系统块大小为4K,在hadoop中为64 Mb。因为为了便于维护名称节点中的元数据。
假设我们在 hadoop 中只有 4K 的块大小,并且我们试图将 100 MB 的数据加载到这个 4K 中,那么这里我们需要越来越多的 4K 块。而 namenode 需要维护所有这些 4K 元数据块。
如果我们使用 64MB的块大小,那么数据将只加载到两个块(64MB 和 36MB)中。因此,元数据的大小减小了。
结论:为了减轻名称节点的负担,HDFS更喜欢64MB或128MB的块大小。该块的默认大小在Hadoop 1.0中为64MB,在Hadoop 2.0中为128MB。
它更多地与HDD(硬盘驱动器)的磁盘寻道有关。随着时间的推移,与磁盘吞吐量相比,磁盘寻道时间并没有太大进展。因此,当块大小较小(导致块过多)时,将有太多的磁盘寻道,效率不高。随着我们从HDD到SDD的进展,磁盘寻道时间没有多大意义,因为它们是SSD中的移动部件。
此外,如果块太多,它将使名称节点紧张。请注意,名称节点必须将整个元数据(关于块的数据)存储在内存中。在Apache Hadoop中,默认块大小为64 MB,在Cloudera Hadoop中,默认为128 MB。
《Hadoop: The Definitive Guide》一书,第3版的解释(p45)。
为什么HDFS中的块这么大?
HDFS块比磁盘块大,原因是 最大限度地降低搜索成本。通过使一个块足够大,时间 从磁盘传输数据的时间可能比 寻找块开始的时间。因此转移时间 由多个块组成的大文件在磁盘传输时运行 率。
快速计算表明,如果寻道时间约为 10 毫秒,并且 传输速率为 100 MB/s,使寻道时间为 1% 传输时间,我们需要使块大小在 100 MB 左右。这 默认值实际上是 64 MB,尽管许多 HDFS 安装使用 128 MB 块。这一数字将继续上调,因为转移 速度随着新一代磁盘驱动器的增长而增长。
然而,这个论点不应该走得太远。映射任务 MapReduce通常一次在一个块上运行,所以如果你有 任务很少(少于群集中的节点),作业运行速度会变慢 比他们本来可以做的。
- 如果块大小设置为小于 64,则整个集群中将有大量块,这会导致 NameNode 管理大量元数据。
- 由于每个块都需要一个映射器,因此会有很多映射器,每个映射器处理一个数据位,效率不高。
Hadoop选择64MB的原因是Google选择了64MB。 谷歌选择64MB的原因是由于金发姑娘的论点。
具有小得多的块大小会导致寻道开销增加。
具有适度较小的块大小可使地图任务运行得足够快,以至于调度它们的成本与运行它们的成本相当。
具有明显较大的块大小开始降低可用的读取并行度,并可能最终使计划任务本地任务变得困难。
参见谷歌研究出版物:MapReduce。http://research.google.com/archive/mapreduce.html