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