第一部分:HDFS 块大小(Block Size)机制解析
1. 默认值设定
在 CDH 6.x(基于 Hadoop 3.0)版本中,HDFS 的默认块大小为 128MB。
- 参数名称:
dfs.blocksize - 配置文件:
hdfs-site.xml - 字节数值:134217728 bytes
2. 为什么是 128MB?(核心原理)
这个数值并非由服务器的 CPU 或内存大小决定,而是基于 磁盘 I/O 特性 和 系统架构瓶颈 的权衡结果。
A. 最小化寻址开销(I/O 效率最大化)
- 理论目标:让磁盘的**寻址时间(Seek Time)仅占总传输时间(Transfer Time)**的 1% 左右。
- 计算模型:
- 假设普通机械硬盘寻址时间约为 10ms。
- 为了满足 1% 的比率,传输数据的时间应当是寻址时间的 100 倍,即 1000ms(1 秒)。
- 假设磁盘写入/读取速度为 100MB/s,那么 1 秒钟能传输的数据量就是 100MB。
- 结论:为了接近 100MB 这个量级,同时采用二进制整数倍,工程上设定为 128MB。
B. 降低 NameNode 内存压力
NameNode 负责在内存中维护文件系统的元数据(Metadata)。HDFS 上的每个文件、目录和数据块,在 NameNode 内存中约占用 150 字节。
- 小块(如 4KB)的问题:存储 1PB 数据将产生千亿级的文件块,直接导致 NameNode 内存溢出(OOM)。
- 大块(128MB)的优势:大幅减少元数据条目数量,使 NameNode 能够利用有限的内存管理 PB 级的数据。
C. 任务并行度与开销的平衡
在 MapReduce/Spark 中,默认一个 Block 对应一个 Map Task。
- 块太小:任务数激增,任务启动/销毁的调度时间(Overhead)超过了实际计算时间,效率极低。
- 块太大:并行度降低,且单一节点故障导致的数据恢复(重试)成本过高。
3. 配置建议(针对当前集群)
集群概况:CDH 6.3.2,节点配置普遍为 16-32GB 内存,单盘容量 <1TB。
- 推荐设置:保持默认 128MB。
- 理由:
- 当前单盘容量较小,总数据量不大,无需通过增大块来节省 NameNode 内存。
- 节点内存有限(16-32G),保持 128MB 可以避免单个计算任务处理过多数据导致内存溢出。
- 何时调整为 256MB?:仅当未来引入大容量节点(如单盘 8TB+)且集群总数据量达到 PB 级别时考虑。
第二部分:Hadoop 核心设计理念
1. 核心思想:搬计算,不搬数据
'Moving Computation to Data' 是 Hadoop 区别于传统高性能计算(HPC)的最本质特征。
2. 设计背景
- :在大数据场景下, 是最稀缺的资源。

