基于本文回答

播面 播面

文图音视,全方位拆解八股文
0
评论

HDFS的Block(数据块)大小默认是多少?为什么要这样设置?

知识点图片

HDFS(Hadoop Distributed File System)的Block(数据块)大小默认值根据Hadoop版本的不同而有所区别:

  • Hadoop 1.x 版本:默认 Block 大小是 64 MB
  • Hadoop 2.x 及 3.x 版本:默认 Block 大小是 128 MB
  • (注意:这个值是可以通过配置文件 hdfs-site.xml 中的 dfs.blocksize 参数进行修改的。)

为什么要这样设置?(核心设计理念)

HDFS 将 Block 设置得如此之大(远大于传统 Linux 文件系统的 4KB),主要是基于硬件物理特性、HDFS的架构设计以及分布式计算的效率这三个维度的考量。具体原因如下:

1. 最小化磁盘寻道时间(核心物理原因)

在机械硬盘时代,读取数据的时间 = 寻道时间(磁头移动到对应磁道的时间) + 传输时间(读取数据的时间)。

  • HDFS 的设计目标是支持高吞吐量的数据流式读取。为了达到这个目的,传输数据的时间必须远远大于寻找数据块位置(寻道)的时间
  • 数学推导:假设一块普通机械硬盘的寻道时间约为 10 毫秒(ms),磁盘的传输速率约为 100 MB/s。为了让寻道时间仅占传输时间的 1%(HDFS的最佳实践标准),那么传输时间应该在 1 秒左右。以 100 MB/s 的速度传输 1 秒,数据量大约就是 100 MB。因此,128 MB 是一个非常合理的默认值。

2. 减轻 NameNode 的内存压力(核心架构原因)

HDFS 是主从架构,NameNode(主节点)负责管理文件系统的元数据(包括文件名、目录结构、文件分成了哪些 Block、每个 Block 存在哪些 DataNode 上等)。

  • NameNode 为了保证极高的读写响应速度,会将所有元数据都放在内存中
  • 每一个文件、目录和 Block,在 NameNode 内存中大约占用 150 Bytes
  • 如果 Block 非常小(比如 4KB),一个 1TB 的文件将产生数亿个 Block,瞬间就会把 NameNode 的内存撑爆(即著名的“小文件问题”)。将 Block 设置为 128MB,可以大大减少 Block 的总数量,从而极大地节约 NameNode 的内存,让集群能够存储海量数据。

3. 优化 MapReduce 等分布式计算的效率(计算调度原因)

在 Hadoop 生态中,存储(HDFS)往往是为了计算(MapReduce/Spark)服务的。

  • 在 MapReduce 计算框架中,通常一个 Block 会对应一个 Map Task(Map 任务)
  • 如果 Block 太小,任务数量会海量增加。启动、调度和销毁 Map 任务本身是有资源开销的。如果处理数据的时间还不如启动任务的时间长,这就极其低效。
  • 如果 Block 太大(比如 1GB),则每个 Map 任务处理的时间过长;且由于切片变少,集群中并发运行的 Map 任务数也会减少,无法充分发挥分布式集群的并发计算优势。128MB 是一个在“任务启动开销”和“并发处理效率”之间取得平衡的甜点(Sweet Spot)。

4. 减少网络连接开销

客户端在读取或写入 HDFS 时,需要与各个 DataNode 建立网络连接。Block 越大,对于同一个大文件,客户端需要建立的网络连接次数就越少,整体网络开销和握手时间就越低。


补充说明(常见误区)

  • 如果文件比 Block 小怎么办?
    这是一个常见的误解。如果 HDFS 的 Block 设置为 128MB,而你上传了一个只有 10MB 的文件,那么它在硬盘上只会占用 10MB 的物理空间,而不会浪费 118MB。128MB 只是一个逻辑上的切分上限。
  • 随着硬件升级,Block 还可以更大吗?
    是的。如果你的集群使用了更快的磁盘(如 NVMe SSD)和更快的网络(如 10G/40G 以太网),磁盘传输速度提升到了几百兆甚至上千兆每秒,那么为了维持“寻道时间占传输时间的 1%”这一原则,很多企业在实际生产中会将 Block 调大到 256 MB 甚至 512 MB
00:00
00:00