HDFS是Hadoop生态里的核心分布式文件系统,也是撑起海量大数据底层存储的关键架构,而数据块(Block)更是贯穿HDFS存储调度、数据读写、故障容错以及任务分配全过程的基础单元,不少刚接触大数据技术的新手在初识HDFS时,总会冒出一连串疑问:为什么文件要拆分成块来存储?系统默认将块尺寸设为128MB而非其他数值,到底是出于什么原因?块大小这一参数的设定,又藏着怎样的分布式系统设计逻辑?
一、HDFS数据块核心概念界定
HDFS当中的数据块,和日常Windows、Linux这类普通操作系统本地文件系统里的磁盘块,是完全不一样的两个技术概念,二者绝不能放在一起混淆理解。
常规本地文件系统里的磁盘块,属于物理硬盘的最小数据读写单位,常规大小只有4KB,是硬件层面固定死的基础设置,而HDFS数据块则是逻辑层面的存储抽象单位,是人工规划定义、用来做分布式集群管理的文件切片,和底层物理磁盘块的各项参数设置完全分离开,互不干扰。
HDFS不会直接存放完整的文件,而是在文件上传到集群的过程中,按照提前设定好的块大小,把文件切分成多个相互独立的数据块,再将这些数据块分散存放到集群中不同的DataNode节点上,每一个数据块都有专属的唯一标识,NameNode则负责统筹维护文件与数据块、数据块与DataNode节点之间的双重映射关系,这也就是大家常说的文件元数据。
想要吃透HDFS数据块,有两个核心知识点必须理清记牢:
第一,数据块是系统最小的存储与副本管理单位,HDFS整套容错机制、负载均衡方案、数据读写流程,全都以数据块为基础单位推进执行,而非以完整文件作为操作对象,即便单个文件体积小于单个块的预设容量,也会单独占用一条块记录,但不会造成物理硬盘空间的浪费,实际占用空间和文件真实大小完全一致。
第二,块大小能够灵活调整,并非固定不变的固定参数,Hadoop 1.x系列版本默认块大小为64MB,Hadoop 2.x以及后续3.x升级版本则统一改为128MB,实际生产使用场景中,还能结合集群硬件配置、业务读写特点,将块大小调整为256MB、512MB乃至更大的数值。
二、HDFS分块存储模式的设计动因
HDFS在最初设计的时候,核心目标就是承载TB、PB级别的海量大文件,支撑大规模离线数据运算分析,传统单机文件存储模式根本无法适配这类海量数据的存储需求,而分块存储模式,正是破解分布式海量数据存储难题的最佳方案,背后藏着四大核心设计原因。
1. 打破单机容量瓶颈,支撑超大文件分布式存储
单机硬盘容量本身存在上限,单个体积庞大的文件根本无法直接存入单一服务器节点,采用分块存储模式后,一个几十GB甚至上TB的大文件,会被切分成数十乃至上百个数据块,分散存储到集群内多个DataNode节点上,彻底打破单机硬盘的容量限制,集群整体存储能力就是所有节点硬盘空间的总和,真正实现存储能力的横向拓展。
2. 缩减磁盘寻址开销,最大化优化顺序读写效能
HDFS主要适配一次写入、多次读取的流式数据读取场景,而非高频次随机读写的场景,机械硬盘最突出的性能短板,并不是数据传输速度,而是磁盘寻址耗时,单次磁盘寻址大概需要10ms,这段时间里硬盘磁头只会做移动定位,不会进行任何数据传输工作。
要是块大小设置得过小,读取文件时就需要频繁进行磁盘寻址,寻址耗时在整体读写耗时中的占比会大幅攀升,直接导致系统整体I/O效率急速下降,反之设置大小合适的块,就能有效减少寻址次数,让硬盘长时间处于连续数据传输状态,最大限度利用硬盘带宽,完美适配大数据批量读取的业务场景。
3. 简化元数据管控流程,缓解NameNode运行压力
NameNode作为HDFS的核心管控节点,需要在运行内存中留存所有文件、文件夹以及数据块的元数据信息,若是不采用固定大小的分块机制,各类文件大小参差不齐,元数据管理会变得格外繁琐复杂,而统一块大小之后,NameNode只需记录块ID、归属文件、存储节点、副本信息等简易内容,元数据总量大幅缩减,既能提升元数据读写查找效率,也能让NameNode支撑规模更大、文件更多的集群。
4. 适配分布式容错机制,支撑分布式并行运算
分布式集群运行过程中,节点故障、硬盘损坏都是常见问题,HDFS依靠副本冗余机制实现数据容错,以数据块为单位复制副本,既能精准把控副本存储位置、实现跨节点跨机架存放,规避单点故障带来的数据风险,也能在节点出现故障时,只复制缺失的单个数据块而非整个文件,大幅降低故障修复的时间与资源成本。
与此同时,数据块也是MapReduce这类分布式计算框架的任务调度基础单位,助力实现“计算跟着数据走”的核心调度思路,单个数据块可以对应一个Map任务,多块数据同步并行处理,能充分发挥集群整体算力,这也是大数据分布式运算的底层基础。
三、块大小核心设计权衡:默认128MB的深层逻辑
从早期版本的64MB到如今主流的128MB,HDFS块大小的迭代升级,本质是硬件性能提升与系统设计多方取舍的最终结果,不少人觉得128MB是随意设定的数值,实则不然,这个数值是HDFS设计人员在寻址效率、元数据消耗、任务并行度、故障修复成本四个维度之间,找到的最均衡的数值。
1. 块尺寸偏小的运行弊端
要是把块大小设置得极小,比如4MB、8MB,看似能提高任务并行处理能力,实则会引发一系列系统运行问题:
- 元数据暴涨,同等数据总量下,数据块数量会成倍增加,NameNode内存消耗随之大幅上升,轻则拖慢元数据查找速度,重则引发NameNode内存溢出,直接导致集群无法正常运转。
- 磁盘寻址消耗剧增,文件读取时需要不停切换数据块,磁盘寻址耗时占比飞速上涨,HDFS顺序读写的核心优势完全丧失,大数据批量处理的速度也会大幅下滑。
- 任务调度负担加重,海量小块会催生大量Map任务,任务启动、调度、收尾的资源消耗远超任务执行耗时,集群整体资源会被无端浪费。
2.块尺寸偏大的运行弊端
反过来如果把块大小设置得过大,比如1GB、2GB,同样会削弱分布式系统的原有优势:
- 一是任务并行处理能力大幅降低,单个数据块对应一个Map任务,块体积越大,总任务数量越少,集群多节点算力无法充分释放,整体运算耗时会被大幅拉长。
- 二是故障修复成本变高,单个数据块损坏后,需要传输复制GB级别的数据,修复周期过长,直接影响上层业务运算的正常推进。
- 三是数据就近处理效果变差,超大数据块很难均匀分散到各个节点,容易出现数据集中存放的情况,计算任务无法就近开展,大量数据在节点间来回传输,占用集群网络带宽。
3.128MB:多方权衡的最优适配选择
设计人员结合当时的硬件条件(磁盘传输速度100MB/s-200MB/s、10Gbps网络带宽)做了精准测算,将寻址耗时控制在总读写耗时的1%以内、单次数据传输耗时控制在1秒左右,最终算出最优块大小接近100MB,选取2的整数次幂后,最终将默认值定为128MB。
这个块大小既能将磁盘寻址消耗控制在极低水平、保障磁盘I/O运行效率,又能合理管控数据块总量、减轻NameNode元数据管理压力,同时兼顾任务并行度需求,让单个Map任务运行时长趋于合理,平衡调度消耗与执行效率,故障修复时单个数据块传输耗时也在合理范围,完全适配绝大多数大数据离线业务场景。
四、生产环境块大小动态调配策略
128MB是适配多数场景的通用选择,但并非适合所有业务场景,实际生产环境中,块大小的设置要结合业务数据特点、集群硬件配置以及运算需求,主要遵循三大调整原则:
针对海量大文件、高吞吐离线分析的场景,比如系统日志归档、离线数据仓库运算,建议将块大小上调至256MB甚至512MB,进一步缩减数据块数量、降低元数据管理消耗,提升顺序读取速度。
针对小文件数量多、随机读写较频繁的场景,不建议随意调小块大小,优先做小文件合并优化处理,若业务确实需要调整,可小幅下调至64MB,避免数据块数量暴增导致NameNode负载过高。
针对SSD硬盘集群,磁盘寻址耗时大幅缩短,理论上可以小幅调小块大小,但依旧要兼顾任务并行度与元数据管理消耗,不建议设置过小数值。
块大小调整操作十分简单,既可以修改hdfs-site.xml配置文件中的dfs.blocksize参数完成全局设置,也能在文件上传时临时指定参数,实现不同业务目录的差异化配置,适配多样化的存储需求。
五、基于块设计的HDFS存储哲学解读
回顾HDFS数据块机制与块大小设计思路,不难发现整套设计始终围绕分布式系统核心需求展开,没有一味追求单一性能指标,而是在各类系统矛盾中做好均衡取舍,这也是HDFS底层存储思想的核心所在。
该系统用抽象设计简化复杂问题,通过固定大小的逻辑块屏蔽底层物理存储的差异,让海量文件管理变得更简便,以容错机制为设计前提,正视分布式故障频发的现状,通过块级副本保障数据安全,以数据吞吐为核心追求,舍弃随机读写的灵活性,重点优化顺序I/O速度,适配大数据批量运算场景,以均衡为设计准则,在系统性能、数据安全、资源消耗之间找到最优方案,不片面追求某一项指标。
这种设计思路不仅适用于HDFS,更是所有分布式存储系统的核心设计逻辑,弄懂块大小背后的取舍逻辑,就能抓住HDFS的设计核心,后续开展集群参数调优、故障排查、存储规划工作时,能快速找准问题根源。
六、结论
HDFS数据块看似只是基础存储单元,实则承载了分布式系统的核心设计理念,从64MB到128MB的参数迭代,是硬件技术升级带动的系统优化,而分块存储模式的落地,更是海量数据场景下的必然选择。
实际运维使用过程中,不必死守默认参数不变,更要吃透背后的设计逻辑,结合业务场景灵活调整参数,最大限度发挥HDFS的存储能力,后续会继续讲解HDFS副本存放方案、NameNode元数据优化等内容,帮助大家全面掌握大数据分布式存储技术。