ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

HDFS底层原理剖析:从Block切片到安全模式的完整链路

HDFS底层原理剖析:从Block切片到安全模式的完整链路 写这篇文章的起因是最近在带团队做数据平台迁移时又被问了一轮关于 HDFS 底层原理的问题。说实话很多同学能背出“NameNode 管元数据、DataNode 管数据、文件按 Block 存储”这套结论但一旦被问到“为什么 Block 要设计成 128MB”“安全模式到底在保护什么”“写文件时某个 DataNode 挂掉pipeline 怎么收场”就答不上来了。这些问题在面试里是常客在实际运维里更是天天见面。这篇我就围绕 HDFS 的 Block、NameNode、DataNode 机制把存储模型、元数据管理、读写流程、安全模式以及常用命令整个链路拆开讲一遍适合刚接触分布式存储的工程师也适合准备大数据面试的朋友按图索骥。1. HDFS 要解决的核心问题单机文件系统天然存在的边界1.1 单机文件系统的两大死穴容量上限和单点失效在没有 HDFS 之前或者说在单机文件系统比如本地磁盘上的 ext4、NTFS时代我们面对数据的典型困境是什么一个是单块磁盘容量有限另一个是磁盘故障直接带走整份数据。先说容量。单机文件系统能管理的空间取决于你能挂几块盘、每块盘多大。今天你装 4 块 16TB 的盘单机裸容量也就是 64TB还要考虑操作系统、元数据开销。数据一旦涨到 PB 级单机方案在物理上就被卡死了。第二个问题更致命磁盘是机械部件损坏是必然事件只是时间早晚。一块盘坏了上面所有文件都可能没法读。企业里应对的办法是做 RAID但 RAID 在单机内部做冗余一旦机器本身出问题主板、电源、网络你仍然拿不到数据。我做大数据运维这些年见过最典型的案例是某个团队早期用 NFS 把几十台机器的目录挂到一起当“共享存储”表面上看起来容量变大了但 NFS 服务端一挂所有客户端全部看到目录消失更麻烦的是没有副本机制底层磁盘损坏后数据直接没有恢复路径。这种把单机问题外包给另一台单机的方案本质上没有解决问题只是把问题移动了位置。1.2 HDFS 给出的答案横向扩展与多副本容错HDFS 的设计出发点非常明确用一群廉价的普通服务器组成一个逻辑上单一的文件系统通过横向扩展解决容量问题通过多副本机制解决可靠性问题。你不需要一台超级服务器你只需要一堆普通节点。每个节点贡献出自己的磁盘空间HDFS 把数据切分成很多 Block分散存储在这些节点上。扩容的时候加几台机器进去就能提升存储容量和读写带宽不需要停服务、不需要搬数据这就是分布式存储的核心优势。可靠性方面HDFS 默认把每个 Block 复制成 3 份分布在不同的节点上。一台机器宕机数据还有另外两份副本顶着。这就意味着HDFS 是设计来“容忍机器故障”的而不是像单机文件系统那样把所有鸡蛋放在一个篮子里。要理解 HDFS 底层原理核心就围绕三个角色展开Block 是数据存储的单元NameNode 负责记录“哪个文件由哪些 Block 组成、这些 Block 在哪些节点上”DataNode 负责真正把 Block 落到本地磁盘。下面我逐个拆开讲。2. Block 切片机制为什么偏偏是 128MB2.1 文件是如何被切成 Block 的HDFS 里一个文件会被切分成若干个固定大小的逻辑数据块这就是 Block。默认情况下一个 Block 是 128MB老版本是 64MB。比如你往 HDFS 里放一个 300MB 的文件它会被切分成 3 个 Block128MB 128MB 44MB。最后一个 Block 不满 128MB 没关系HDFS 允许最后一个块小于块大小不会额外占满。这里要注意Block 是“逻辑切片”。一个 128MB 的 Block 在 DataNode 上并不是一整块连续磁盘空间它只是一个被抽象出来的存储单元。DataNode 会把 Block 内容直接写入本地文件系统可能是普通的一个文件但 HDFS 层面把它视为不可分割的最小单位。为什么要切块核心原因是让数据的存储和计算可以并行化。假设一个 1TB 的文件不切块放倒任何一台机器上那读这个文件的时候计算任务也只能跑到那台机器上去读。切成了 8192 个 128MB 的 Block 之后MapReduce 或 Spark 就能让多个节点各自计算一部分数据这就是“数据本地化”的基础——代码往数据上跑而不是数据往代码那里搬。2.2 默认 128MB 是怎么算出来的很多初学者会问Block 为什么不是 1MB也不是 1GB这里面有一个经典的权衡逻辑。早年机械硬盘的顺序传输速率大概在 100MB/s 左右磁盘寻道时间把磁头移动到目标位置大约是 10ms 左右。如果 Block 太小比如 4KB那么读写一个 Block 的时间几乎全花在寻道上带宽利用率会非常低。业界有一个“1:100 原则”寻道时间与传输时间的比值尽量控制在 1 比 100 左右。要让寻道开销占比低于 1%传输时间最好达到 1 秒左右。按 100MB/s 计算1 秒的传输量就是 100MB。这就是为什么 HDFS 的默认 Block 从早期的 64MB 演进到今天的 128MB——底层磁盘速率提升后块大小也随之上调。Block 太大也有代价。最直接的影响是 NameNode 内存里的元数据膨胀以及 MapReduce 并行度的下降。一个 1TB 的文件如果 Block 是 1GB只有 1024 个 Block理论最大并行度就是 1024如果 Block 是 128MB并行度变成 8192。对于离线批处理任务来说更高的并行度意味着更充分的计算资源利用。那 Block 太小有什么问题主要就是元数据压力。NameNode 为每个 Block 维护一份元数据包括 Block ID、所属文件、副本位置等单个 Block 的元数据内存占用大约在 150 字节左右。如果你把 Block 设成 1MB一个 100GB 的文件会产生 10 万个 Block光元数据就吃掉很多内存。128MB 是一个实践检验过的均衡点既能保持高吞吐又不会让元数据膨胀失控。下表把这几个权衡点列出来方便对比权衡维度Block 偏小Block 偏大寻道开销占比高磁盘吞吐浪费低适合顺序读写NameNode 内存压力高Block 数量多低Block 数量少任务并行度高低数据本地化效果一般更好典型使用场景小文件多、实时性高大文件、离线批处理2.3 副本因子与冗余策略的代价默认情况下每个 Block 存 3 份副本。为什么是 3 份这其实是一个可靠性和成本之间的经验平衡。假设单台服务器年故障率是 1%企业级硬件通常更低一份数据只有 1 个副本时一年内丢失概率就是 1%有 2 个副本丢了才叫事故概率降为 0.01%有 3 个副本概率降到 0.0001%。但副本数也不是越多越好每个副本都要占用真实的磁盘空间和写入带宽。3 份副本意味着 1TB 有效数据要占用 3TB 物理空间这个冗余比例在企业里是可以接受的——既保证了足够的容错能力又不会让存储成本失控。副本数可以根据需要对单文件进行调整用hdfs dfs -setrep -w 2 /path/to/file可以把某个文件的副本数改成 2。注意这个命令只影响指定文件不影响集群级默认配置。我在生产环境里见过有人对关键目录用setrep 5来加强保护这种做法确实可以但要清楚代价是存储空间和写入耗时的成倍上升。副本还有一个隐藏成本副本数越低数据被“读取失败后重试”的余地就越小。分布式环境里节点临时不可用、网络抖动、磁盘卡顿都可能导致读块失败。如果只有 1 个副本一旦那个节点出问题这个 Block 直接不可读。所以如果是冷数据临时降到 1 份建议定时任务再把它恢复回 2 份以上。3. NameNode 的元数据机制从全内存到安全模式3.1 为什么 NameNode 把所有元数据放在内存里NameNode 是 HDFS 的“大脑”它管的东西很明确文件系统的目录树、每个文件由哪些 Block 组成、每个 Block 分布在哪些 DataNode 上。你可以把它理解成一本“账本”——DataNode 负责搬砖NameNode 负责记账。这套设计最大的特点就是元数据全内存。一个文件的定位信息、Block 列表、副本位置全部加载在 JVM 堆内存中。好处是访问速度极快NameNode 响应客户端请求不需要经历磁盘 I/O。但代价也非常现实NameNode 的内存大小直接决定了集群能存多少个文件、多少个 Block。业界常见的经验值是每 100 万个 Block 大约需要 150MB 到 200MB 内存再加上目录树的元数据一个管理 1 亿个 Block 的集群NameNode 堆内存经常会飙到 20GB 甚至更高。所以生产集群给 NameNode 配 64GB 内存是很常见的事。这个设计还有一个问题就是大家常说的“单点”。NameNode 一旦宕机整个文件系统就不可用了。虽然 HDFS 有 HAHigh Availability方案Active/Standby 两个 NameNode 共享元数据日志但你要理解一点HA 解决的是可用性不是性能。NameNode 依然是集群的“控制面瓶颈”所以集群规模巨大时有人会用 ViewFs、联邦Federation等方式把元数据空间拆开让多个 NameNode 各自分管一部分目录。3.2 fsimage 与 edits logNameNode 是怎么落盘的NameNode 不可能只把元数据放内存它必须把元数据持久化不然进程一重启整个文件系统的账本就丢了。那它是怎么做的答案就是 fsimage 加 edits log。fsimage 是文件系统元数据在某个时间点的完整快照相当于给账本拍了一张照片。edits log 是自上次快照以来发生的所有修改操作日志相当于照片之后发生的每一笔流水记录。每次文件增删、目录创建、Block 状态变化NameNode 不会直接去更新 fsimage那样太慢而是把这条操作追加写入 edits log。当 NameNode 重启时加载最新的 fsimage然后逐条回放 edits log就能恢复出最新状态。这里要理解一个核心矛盾edits log 不能无限膨胀。如果一直只追加操作日志重启时回放时间会越来越长所以必须定期把“fsimage edits log”合并成一份新的 fsimage把旧日志丢弃。这个合并过程叫 Checkpoint。在非 HA 集群里Secondary NameNode 就是专门干这事的它定期从 Active NameNode 拉取 fsimage 和 edits log在自己的内存里完成合并生成新的 fsimage 再推回 NameNode。在 HA 集群里Standby NameNode 承担这个职责。很多刚入门的朋友误以为 Secondary NameNode 是 NameNode 的备份实际上它不是热备而是“Checkpoint 助手”传统方案下 NameNode 挂掉后它并不能直接顶上。3.3 安全模式到底在保护什么“NameNode 一直处于安全模式”这是 HDFS 运维里最常见的警报表之一也是面试官最爱问的场景。安全模式SafeMode是 NameNode 启动早期的一种保护状态。Why 需要因为 NameNode 启动后只是从本地磁盘加载了 fsimage 和 edits log知道了文件和 Block 的对应关系但它此时并不知道每个 Block 的真实副本分布。这些信息必须等集群里的 DataNode 启动后通过“块报告”上报给 NameNode 之后才完整。如果 NameNode 不等待这些块报告直接允许客户端读写会出现什么情况客户端来读某个文件时NameNode 知道这个文件有哪些 Block但不知道这些 Block 在哪些 DataNode 上只能乱猜或者返回空读到一半还发现副本不齐。为了避免这种“记账记得不完整就开始营业”的情况NameNode 启动后会强制进入安全模式只允许读元数据不允许数据写入和删除操作。退出安全模式的默认条件是集群中达到“最小副本数条件”的 Block 数量占全部 Block 数量的比例超过阈值默认 0.999。也就是说几乎全部 Block 都报告上来了NameNode 才认为可以放心营业。实际运维里卡安全模式的原因就那么几类DataNode 还没全启动完、某些节点数据盘损坏导致大量 Block 上报不全、网络分区导致部分 DataNode 失联。排查套路也很固定先用hdfs dfsadmin -safemode get看当前状态。再用hdfs dfsadmin -report看有多少 DataNode 存活、有没有节点处于异常状态。用hdfs fsck / -files -blocks -locations检查是不是有大量的 Block 处于 under replicated副本不足状态。如果数据节点只是启动慢等 DataNode 全部注册完安全模式会自动退出。千万不能一看到安全模式就急着执行hdfs dfsadmin -safemode leave去强退。我在生产环境见过这种操作造成的后果NameNode 还没拿到足够的块报告就被迫营业客户端读不到部分数据上游任务全部报错。强制离开安全模式只适合你确认底层数据确实没问题、只是因为阈值被设得太高导致无法自动退出的场景并且操作前最好能确认异常副本的范围可控。4. DataNode 的守夜工作心跳、块报告与副本放置4.1 心跳和块报告DataNode 与 NameNode 之间最基本的对话DataNode 是真正存 Block 的节点。它可以多到成百上千台但不会每台都跟 NameNode 保持“实时同步”状态。它靠两个东西跟 NameNode 维持关系心跳Heartbeat和块报告Block Report。心跳是 DataNode 每隔固定时间默认 3 秒向 NameNode 发送一次的“我还活着”信号。NameNode 靠心跳判断 DataNode 的存活状态。如果超过一定时间没收到心跳默认是 10 分 30 秒左右NameNode 就会把这个 DataNode 标记为 Dead。标记为 Dead 之后NameNode 会把这些节点上的 Block 视为需要重新复制的副本并调度其他节点补副本。频繁的心跳会不会打爆 NameNode这就是有心跳机制就要控制频率的原因3 秒一次的心跳包含的信息量很小NameNode 对心跳的处理很轻量所以 1000 个 DataNode 也扛得住。块报告则是 DataNode 向 NameNode 上报自己磁盘上存了哪些 Block。这个操作比心跳重得多所以只在 DataNode 启动时上报一次全量块报告之后如果有块写入、删除、损坏DataNode 再通过增量块报告通知 NameNode。从运维角度看这两个机制意味着什么你向 HDFS 写入一个文件后文件会立即写入 DataNode 本地磁盘但 NameNode 的元数据是经过 DataNode 的增量块报告逐步确认的。所以极端场景下你的写操作已经返回成功但某个 DataNode 随后宕机它还没来得及汇报的 Block 就会被 NameNode 视为“缺失”随后靠其他副本补回来这就是 HDFS 自我修复能力的基础。4.2 副本放置策略三份副本分别放在哪里副本不是随意分布的。HDFS 最常见的副本放置策略是机架感知Rack Awareness第一个副本放在客户端所在的节点如果是集群外客户端则随机选一个节点第二个副本放在与第一个副本不同的机架上第三个副本放在与第二个副本相同机架的另一个节点上。这样放置的深意是前两个副本分布在不同的机架能容忍整个机架断电或交换机故障第二和第三个副本同机架是为了减少跨机架写入的带宽消耗。因为 Block 写入时要走 pipeline 流水线第二个副本传给第三个副本是机架内传输比跨机架更快更省带宽。还有一个细节DataNode 副本放置时NameNode 会尽量让一个 Block 的多份副本不要出现在同一个 DataNode 上。因为如果同一份数据的所有副本都在一台机器上这台机器挂了数据就全没了冗余就等于白做。4.3 DataNode 磁盘坏了会发生什么DataNode 通常会挂多块磁盘磁盘损坏是常态。一个 DataNode 检测到某块磁盘故障它不会整个节点退出而是把这个磁盘上的 Block 标记为异常并报告给 NameNode。NameNode 会把这些 Block 从副本列表中移除然后看剩余副本数量是否达到要求没达到就去其他 DataNode 复制一份补齐。这里有一个很容易被忽略的参数dfs.datanode.failed.volumes.tolerated它表示 DataNode 可以容忍的坏盘数量。默认值是 0意味着只要有 1 块数据盘坏了该 DataNode 就会被标记为异常NameNode 会把它上面的 Block 全部转移到其他节点。如果你的机器挂了很多块数据盘这个默认值会导致集群出现大量的复制流量反而增加网络压力。我在生产环境里会结合硬件的实际情况调整这个参数。如果每台 DataNode 挂 12 块盘我通常把容忍值放到 1 或 2。这样坏一两块盘的时候节点还能继续提供服务只是容量缩水等你有时间做换盘维护但如果你把容忍值放得太大比如设为 10那可能最后一块好盘都没了节点还在“硬撑”这时候性能会急剧恶化不如直接标记异常触发数据迁移。这个参数要根据磁盘数量和运维能力来权衡没有绝对最优解。5. 完整的 HDFS 读写流程链路5.1 写流程拆解一个文件从客户端到落盘的全过程理解 HDFS 写流程是理解整个系统设计的钥匙。我把整个过程拆成几个关键环节第一步客户端发起写请求调用 DistributedFileSystem 的 create 方法。此时客户端会联系 NameNodeNameNode 检查文件路径是否存在、客户端是否有写权限、父目录是否存在。检查通过后NameNode 在内存目录树中创建一个新文件记录但此时还没有任何 Block 数据。第二步客户端开始写数据。HDFS 会先把数据写入本地缓冲区攒够一个 Block128MB或者接近一个 Block 的数据后客户端向 NameNode 发起申请“我有这么多数据要写给我分配 Block 的存储位置”。NameNode 根据副本放置策略返回一组 DataNode 地址列表数量等于副本数这组地址就是数据写入的 pipeline 链。第三步客户端与第一个 DataNode 建立连接第一个 DataNode 再与第二个 DataNode 建立连接第二个与第三个建立连接形成一条 pipeline。客户端把数据分成一个个 packet默认 64KB沿 pipeline 往下游传。第四步每个 DataNode 收到 packet 后先写入本地磁盘实际是写入 Linux 文件系统然后同时把 packet 转发给下游 DataNode。数据块写完下游 DataNode 会向上游返回确认ACK逐级返回最后客户端收到整条 pipeline 的 ACK。第五步所有 Block 写完后客户端调用 close 方法通知 NameNode 文件已经写完。NameNode 此时才在元数据里把文件状态标记为“已写入完成”并向客户端返回成功。这里有一个值得记的细节客户端往 pipeline 里写数据时会同时计算并附带校验和默认使用 CRC32。每个 DataNode 收到数据后也会校验校验失败会尝试重传保证到达每个副本的数据是一致的。所以 HDFS 不仅能检测磁盘硬件坏块还能检测网络传输过程中静默损坏的数据。5.2 读流程拆解靠近数据的那一边先去读读流程比写流程简单但设计思路同样关键。客户端要读一个文件时先向 NameNode 发起 open 请求NameNode 返回该文件每个 Block 的元数据包括 Block ID、长度以及每个 Block 的所有副本所在 DataNode 列表。注意NameNode 不返回实际数据实际数据要客户端自己找 DataNode 要。接着客户端根据返回的 Block 位置列表按照“距离优先”原则选择 DataNode。什么是距离HDFS 的网络拓扑距离从近到远是本地节点、同一机架、同一数据中心、跨数据中心。客户端会优先选择本地节点因为从本机磁盘读不需要走网络如果没有本地副本则选择同一个机架内最近的节点实在不行才跨机架。选定 DataNode 后客户端直接与该 DataNode 建立连接读取 Block 数据。读取过程中客户端会验证校验和如果发现数据损坏会立刻换另一个 DataNode 重新读取。读完之后再向 NameNode 获取下一个 Block 的位置列表继续后面的 Block直到整个文件读完。整个读流程里最值得深思的是客户端绕过 NameNode 直接跟 DataNode 通信。这样设计的好处是NameNode 只承担“告诉你去哪里读”的调度角色而不参与数据传输。数据流不经过 NameNode才能保证千万级并发的数据读取不会把元数据节点压垮。5.3 pipeline 中途节点故障写流程如何自救写流程中一个很现实的问题是如果 pipeline 中某个 DataNode 在写入过程中宕机怎么办假设副本数为 3pipeline 是 Client → DN1 → DN2 → DN3。如果 DN2 在写入过程中挂了流程是这样处理的客户端会收到来自 DN1 或 DN3 的写入异常反馈。客户端会从 pipeline 中移除 DN2然后把剩下的两个节点 DN1 和 DN3 重新组成一条完整的 pipeline继续写数据。此时 NameNode 也知道 DN2 挂了在后续的副本检查中会发现有 Block 少了副本于是调度 DN1、DN3 或者其他存活节点把缺失的副本补满。这个过程中客户端完全不需要重新上传已写入的数据只是重建管道后继续传后面的 packet。已写入的部分在 DN1、DN3 上仍然有效。这就是分布式系统里常见的“局部失败、局部恢复”思路不在失败处回滚全部而是尽可能缩小失败影响范围用后台补偿机制兜底。我在线上也遇到过客户端写超时、但实际数据已经写入成功的场景。此时重试写入会报“文件已存在”吗不会HDFS 的 write 流程在客户端失败时会自动进入 recoverLease 流程清理掉已写入的孤儿数据。如果你手动重试用hdfs dfs -appendToFile或者重跑任务时要确保上一次的写操作已经被完全清理否则可能出现重复数据。这类问题排查起来比较隐蔽经验是重点看任务日志里有没有 lease 相关报错。6. 日常运维记忆点安全模式、常用命令与高频故障6.1 最该记住的一组 HDFS 命令理论讲完落到运维实操。HDFS 常用命令不需要背一大堆但这几类必须熟练# 文件与目录操作 hdfs dfs -ls /data hdfs dfs -mkdir -p /data/logs hdfs dfs -put localfile /data/logs/ hdfs dfs -get /data/logs/remotefile ./localdir hdfs dfs -rm -r /data/old_dir # 查看文件实际占用的存储情况包括副本数 hdfs dfs -du -h /data # 调整文件的副本数 hdfs dfs -setrep -w 3 /data/important # 查看 Block 分布与文件健康状况 hdfs fsck /data/important -files -blocks -locations # 管理安全模式 hdfs dfsadmin -safemode get hdfs dfsadmin -safemode enter hdfs dfsadmin -safemode leave # 查看集群整体状态 hdfs dfsadmin -report其中hdfs fsck是最值得你多看两眼的命令。它不止能告诉你文件能不能读还能列出哪些 Block 副本数不足、哪些 Block 已损坏、Block 分布在哪些节点。排查“文件读不出来”“集群一直有副本补不齐”这类问题时它是第一手信息源。hdfs dfsadmin -report则负责看 DataNode 的存活情况、磁盘容量、剩余空间。它输出的每个 DataNode 状态、最后心跳时间、存储容量是判断“是不是有节点掉线”的最直接依据。6.2 三大高频故障排查思路把常见问题归成三类基本能覆盖大多数人遇到的 HDFS 故障场景。第一类NameNode 卡在安全模式。处理顺序是先确认所有 DataNode 是否已经启动、是否完成块报告。如果 DataNode 正常那就检查是不是大量 Block 副本数不足用 fsck 看 under replicated 数量。如果是因为节点宕机导致的副本不足先把节点恢复安全模式通常会自动退出。如果是因为副本阈值设置太高调整dfs.namenode.safemode.threshold.pct或者确认数据完整后用leave手动退出。第二类文件读取超时或报 Block 损坏。先执行hdfs fsck / -files -blocks -locations | grep -i corrupt看损坏块再定位损坏块所在的 DataNode。HDFS 会自动从其他副本重建损坏块所以处理重点是确认损坏原因磁盘坏道、网络传输丢包、还是 DataNode 进程异常。纯硬件问题就换盘网络问题要查交换机或网卡。第三类Under replicated blocks 长期存在。通常是某个 DataNode 反复掉线、磁盘空间不足、或者副本补建的带宽受限。先看是不是有节点处于“亚健康”状态——心跳时断时续。再检查集群 RPC 队列有没有被打满最后看复制任务的优先级是不是被压到了很低。处理思路是先把根节点恢复让 NameNode 的复制调度能正常完成。6.3 最后给新人的三个检查习惯文章写到这核心机制都讲透了。最后分享几个我在实际运维中沉淀下来的习惯也算给新入门的朋友提个醒。一是每次改完 HDFS 配置不要只看 NameNode 的启动日志还要关注 DataNode 的行为变化。比如调大了 Block 大小旧数据的 Block 不会重新切分新数据才按新配置生效。这个认知不清很容易误判集群容量。二是排查问题一定要先看 fsck 的输出再下结论。很多人一遇到数据读不出来第一反应是“重启 DataNode”但 HDFS 是一个靠元数据和副本机制纠偏的系统多数读异常都能靠 fsck 定位到具体 Block 和节点直接重启往往是浪费时间还可能触发大范围副本迁移。三是关注 HDFS 的“小块文件”问题。这里顺带提一句HDFS 适合大文件不适合海量小文件。上百万个小文件会把 NameNode 内存打爆这也是“元数据全内存”设计带来的副作用。如果业务上逃不开小文件就要在写入侧做合并比如用 SequenceFile、ORC 这类格式把碎文件合并成大文件或者引入小文件合并的定时任务。别等 NameNode 内存告警了才想起来这件事那时候调整成本就高了。分布式存储的原理不像业务代码那样能“试错迭代”它更依赖对底层机制的准确理解。把 Block、NameNode、DataNode 这套核心机制吃透你再看 HDFS 的各种报错、参数调优、架构演进都会有一种豁然开朗的感觉。希望这篇拆解能帮你把零散的知识点串成一张完整的图。
返回列表