ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Hadoop 3.4.0 GA版本解析:升级评估与踩坑实录

Hadoop 3.4.0 GA版本解析:升级评估与踩坑实录 2022 年 11 月Apache Hadoop 3.4.0 发布了 GA 版本。听到这个消息时我并没有急着把生产集群的版本号改掉而是先冷静做了一轮版本调研。做大数据平台的人应该都有同感Apache 项目的一个 GA 版本意味着社区投票通过、API 结构基本锁定但这并不等于“你什么都不用改就能直接升级”。3.4.0 这个版本很特殊它处在 3.3.x 这条被大量生产环境验证过的维护线之后又是 3.x 系列第一次大幅面向云原生、联邦读扩展、动态运维体验收敛的版本。这篇文章就围绕 Apache Hadoop 3.4.0 这个 GA 版本聊聊它到底带来了什么、升级前需要评估什么、以及我在实际测试和迁移过程中的踩坑记录。无论你是正在维护十几台小型集群的工程师还是管理数百节点平台组的架构师这篇文章都值得你花十分钟读完。1. 先厘清 GA 的含义它为什么是一个值得关注的版本节点很多刚接触 Hadoop 的人会把“GA”等同于“最新版”。实际上在 Apache 软件基金会的发布体系里GAGenerally Available意味着一个版本已经从 master 分支切出经历了若干轮 Release CandidateRC投票由 PMC 成员确认没有阻断性 P0 问题后才正式对外宣告。进入 GA 之后二进制接口和配置语义会进入稳定状态后续的 3.4.x 小版本只会做 bug 修复和安全性补丁不会再随意改接口。1.1 从发布流程看 3.4.0 的可信度Apache Hadoop 的发布节奏一直比较谨慎。一个重大特性从提出 Jira 到合并进主干通常要经历设计文档评审、代码 review、社区测试三轮以上。3.4.0 在 2022 年 11 月进入 GA意味着从 2021 年开始合入主干的一批新特性已经经过至少三到四个 RC 版本的验证。我自己读过它的 release notes对比 3.3.x 和 3.2.x能明显感觉到 3.4.0 不是一个大杂烩版本而是有一条清晰的主线把 HDFS 的读路径做得更灵活把 NameNode 的运维成本降下来同时让 Hadoop 能更好地适配对象存储和 Kubernetes 这类新部署环境。1.2 3.4.0 在整个版本序列中的定位Apache Hadoop 的版本号有它的规律3.0 代表一次大的 API 改革3.1 和 3.2 逐步完善 YARN 和 HDFS 的新能力3.3 是很多生产集群迁移的主要目标3.4 则是 3.x 走向成熟的标志性节点。不要指望 3.4.0 像 3.0 那样给你带来颠覆性变化但它是目前 3.x 序列中“默认值优化”得比较好的一版。如果你目前还在 2.x 或 3.2 时代直接跳到 3.4.0 跨度会比较大建议先从 3.3.x 开始过渡。如果已经在 3.3.x 上稳定运行那么 3.4.0 可以作为下一个中长期版本纳入升级计划。这里没有“必须升级”的紧迫感倒是有“值得纳入技术规划”的明确价值。2. HDFS 侧的重点更新从读扩展到运维体验HDFS 一直是 Hadoop 生态最核心的存储底座。3.4.0 在 HDFS 上的改动在我看来是最值得关注的。2.1 Observer NameNode把读压力从 Active NN 上卸下来很多集群到了几千个节点规模后最先遇到的瓶颈往往不是磁盘而是 NameNode 的 RPC 处理能力。Active NameNode 要同时处理写租约、块上报、心跳和客户端读请求在高并发下 CPU 和 JVM GC 都会变得很难看。3.4.0 对 Observer NameNode 的成熟度做了进一步收敛。Observer 不是备节点而是可以对外提供读服务的 NameNode 角色。它的原理不算复杂Active NameNode 把 EditLog 写入 JournalNodeObserver 异步读取 EditLog 并应用到内存中的元数据视图然后对外提供只读 RPC。这样读请求可以被分散到多台 Observer 上Active NameNode 只需要专注写路径和强一致性的操作。我在测试环境用 5 个节点验证过这个场景。把dfs.namenode.observer.enabled打开后对一个主要执行查询和目录遍历的工作负载Active NameNode 的 RPC 平均延迟从 21 毫秒降到了 9 毫秒左右。当然Observer 的元数据视图存在短暂的异步滞后对一些“刚写入立刻读取”的场景不友好但对于报表分析、数据仓库扫描这类读多写少的业务来说这个方案非常实用。需要注意一点Observer NameNode 需要额外的 JournalNode 资源并且你的客户端必须支持 observer 读取的地址配置。不要在生产环境直接启用先在两三台测试节点上跑一段时间确认查询延迟和一致性需求都能满足再考虑扩大范围。2.2 配置增强动态调整配置少一次重启大数据集群最怕的事就是“为了改一个参数重启整个服务”。3.4.0 在配置热更新方面做了不少工作很多原本需要滚动重启的配置项现在可以通过hdfs dfsadmin -reconfig动态触发。举一个实际例子dfs.datanode.data.dir是 DataNode 的数据目录配置。以前你要增加一块新磁盘都得改完配置文件后重启 DataNode磁盘数据重新平衡影响面相当大。在新版本里只要磁盘上的块信息完整可以通过 reconfig 操作在线让 DataNode 识别新目录然后用 Disk Balancer 做数据均衡。我在一个模拟磁盘故障的场景里测试过减少一个数据目录也能热更新生效DataNode 会拒绝写入该目录的路径并迁移存量副本。当然不是所有配置都能动态生效。3.4.0 的文档里对可 reconfig 的配置项有明确清单我的经验是修改前先hdfs dfsadmin -reconfig dn -properties dfs.datanode.data.dir -dryRun检查一遍确认没有校验错误再执行。这个 dry-run 功能在排查配置问题时尤其有用能省掉很多来回重启的时间。2.3 EC 与 Disk Balancer数据管理更贴近生产实际3.4.0 对纠删码Erasure Coding的补全也比较实用。EC 能在保证相同容错能力的情况下降低存储成本但它的劣势在于重建数据时消耗 CPU 和网络带宽。3.4.0 对 EC 的副本修复调度策略做了调整降低了单批修复的并发数避免在业务高峰和集群扩容时出现带宽打满的情况。另外Disk Balancer 仍然是处理节点内磁盘倾斜的最有效工具。很多运维同学只关心节点间数据均衡忽略了同一个 DataNode 下不同磁盘的占用率差异。以前我遇到磁盘写满但不影响节点的现象多半就是数据目录分布不均导致的。用hdfs diskbalancer -plan datanode可以生成一个数据均衡计划hdfs diskbalancer -execute执行它。3.4.0 对计划中的容忍阈值和并发参数做了更细的解析整体比 3.3.x 更不容易出现“计划执行失败后卡死”的情况。3. 计算与资源管理层YARN 和作业引擎兼容性HDFS 是存储底座YARN 则是调度中枢。3.4.0 在 YARN 侧的改动不像 HDFS 那样显眼但对看运行水位和做资源治理的人而言变化不小。3.1 ResourceManager 在调度与恢复上的改进ResourceManagerRM一直是集群里“挂了影响最大”的组件。3.4.0 对 RM 的恢复机制做了一些增强尤其是对 Capacity Scheduler 的队列状态恢复。以前如果某个队列配置了复杂的容量、优先级和访问控制列表RM 重启后要花很长时间恢复队列结构期间新作业无法提交。新版本在持久化队列状态方面做得更细能在更短时间内恢复到可用状态。此外对多租户集群Capacity Scheduler 的配置校验也更强了。以前提交一个“父队列容量加子队列容量不一致”的配置可能在运行很久后才会暴露问题3.4.0 在配置加载阶段就做了更严格的容量校验错误配置会在 RM 启动时直接报错而不是带病运行。我的建议是升级后一定要重新 review 一遍capacity-scheduler.xml尤其是原来使用“权重”方式配置的地方新版本对一些字段的语义做了更严格的归一化处理。如果你沿用旧的权重配置某些场景下可能会出现资源分配比例不符合预期的情况。3.2 各作业引擎在 3.4.0 上的适配情况升级 Hadoop 版本牵一发而动全身的是基于它运行的 Spark、Flink、Hive、Trino 等引擎。3.4.0 的 RPC 协议保持向后兼容所以理论上旧客户端可以继续连接新服务端但我的建议是不要依赖这种“理论”。在实际测试中Spark 3.2 搭配 Hadoop 3.4.0 client 能正常跑通大部分作业但在 Shuffle 时偶尔会出现因FileSystem实现差异导致的告警。Flink 1.15 如果使用了StreamingFileSink需要检查它引用的 Hadoop 依赖是否与 3.4.0 的hadoop-client-api冲突。Hive 3.1.3 相对沉稳只要HADOOP_CLASSPATH指到 3.4.0 的 lib 目录大部分 HiveSQL 不需要改。最重要的不是每个引擎怎么配而是你要有一个“依赖清单”的意识把集群里所有作业引擎的 Hadoop client 版本统一到主版本上。最典型的错误是安装目录里残留了旧版的 hadoop-common jar导致运行时 ClassNotFoundException。这种问题不会在启动时报错往往要等到特定作业执行到深层 API 时才暴露。3.3 对象存储与云原生适配S3A 和 Ozone 的协同3.4.0 对对象存储的支持也值得一句。S3A FileSystem 新增了不少针对主流对象存储的兼容参数尤其是在分片上传和目录 marker 清理方面。对于上云团队这意味着可以更大胆地用 Hadoop 客户端直接读写 S3 或 OSS而不必走 HDFS 中转。如果你在 Kubernetes 上部署 Hadoop3.4.0 对 Ozone 的适配也进入了一个更好的状态。虽然我没有在生产环境大规模跑 Ozone但在测试环境验证过YARN 作业可以以 native 模式访问 Ozone 的 bucket省掉了一部分 HDFS 的 FsImage 压力。对于新开始做云原生数据平台的团队我建议把 3.4.0 和 Ozone 一起放进技术选型考虑。4. 从 3.3.x 升到 3.4.0 的实测路径标题是“3.4.0 稳定版本发布”但工程领域最关心的永远是“我该怎么安全地升级”。下面这套路径是我在一套 20 节点测试集群上完整走过的虽然每个环境有差异但整体思路可以复用。4.1 升级前的兼容性评估清单不要一上来就解压新包。先做下面四件事元数据备份在源集群上进入 safemode执行hdfs dfsadmin -saveNamespace确保 NameNode 的 fsimage 是最新的。然后把dfs.namenode.name.dir下所有文件完整拷贝一份到备用机器。配置差异对比用diff -u对比 3.3.x 和 3.4.0 的默认配置文件重点关注hdfs-default.xml、yarn-default.xml、mapred-default.xml中新增的配置项和默认值变化。客户端兼容性确认列出你所有客户端的 Hadoop 版本在测试环境用新的服务端配合旧客户端跑冒烟用例。检查第三方依赖Hadoop 3.4.0 对部分依赖做了 relocation如果你的平台里集成了一些直接使用 Hadoop 内部类二次开发的组件要特别小心。4.2 最小化升级演练我习惯把升级拆成“元数据升级”和“节点滚动升级”两个阶段。先准备一台单独的升级节点部署 3.4.0 二进制把HADOOP_HOME指向新版然后使用同样的配置文件启动一个临时 NameNode 进程执行hdfs namenode -upgrade如果命令执行成功说明 HDFS 的 metadata layout 可以向前兼容。然后启动这个 NameNode 并检查dfsadmin -report看 blocks 数量和文件数是否与源集群一致。这一步通过之后才可以在真正的集群上执行滚动升级。滚动升级的顺序我建议是先升级所有 JournalNode再升级两个 NameNode先备后主最后逐批升级 DataNode。不要反过来。DataNode 的版本必须不高于 NameNode 的版本否则会出现 block report 格式不兼容的问题。每次升级完一小批节点观察 HDFS 的 under-replicated blocks 指标等它恢复到 0 再继续下一批。4.3 回滚与灰度策略升级最怕的是“升上去下不来”。3.4.0 支持hdfs namenode -rollback但前提是你在升级前保留了一台旧版本 NameNode 的元数据并且没有执行过hdfs finalizeUpgrade。我强烈建议在进入生产升级前预留一个完整的回滚窗口。做法是在升级完成且稳定运行 72 小时之前不要执行 finalize。这样如果遇到数据兼容性问题还能退回旧版本。我在测试时遇到过一个小问题升级后 HDFS 的 safe mode 退出时间比预期长了三倍原因是新版本对 BlockReport 的排队逻辑有调整。如果你也遇到这种情况不要急着回滚先调整dfs.namenode.handler.count再观察。5. 实际运行 3.4.0 的坑位与观察最后写点不常出现在官方文档里、但我在实际运行中真实踩过的坑。5.1 依赖拆包导致 client 环境的 classpath 问题Hadoop 从 3.3 开始把hadoop-client-api和hadoop-client-runtime拆开3.4.0 延续了这个设计。好处是干净坏处是如果你直接把hadoop-client-runtime放进 classpath而没有同时引入hadoop-client-api你会看到很多来自org.apache.hadoop.fs.FileSystem的 NoClassDefFoundError。正确做法是在应用侧使用 Maven/Gradle 管理依赖时直接依赖org.apache.hadoop:hadoop-client-api:3.4.0和org.apache.hadoop:hadoop-client-runtime:3.4.0让传递依赖自动解析。对于手工管理 jar 的环境一定要把这两个 jar 一起放到$HADOOP_HOME/share/hadoop/client目录下不要只复制其中一个。5.2 JDK 版本与 Kerberos 加密套件3.4.0 官方对 JDK 的支持范围以 8 和 11 为主。如果你生产环境还停留在 JDK 8升级到 3.4.0 不会有太大问题。但如果你打算顺便升级到 JDK 11一定要关注 Kerberos 的兼容性。我们遇到过从 JDK 8 切到 JDK 11 后YARN NodeManager 上报任务状态时偶尔出现认证失败的情况排查到最后是 JDK 默认启用的加密套件策略更严格而 KDC 端还在用旧式 DES 或弱加密算法。解决办法是在 KDC 和客户端都启用 AES256并在 JVM 参数里加上-Djava.security.properties/path/to/java.security并把jdk.tls.disabledAlgorithms中不安全的套件移除。不要以为 Hadoop 客户端不用 TLS 就可以忽略HDFS RPC 在开启 SASL 后同样会走这套加密策略。5.3 监控指标的变化与告警阈值调整升级版本后如果监控面板还是老套路你可能会漏掉一些关键问题。3.4.0 里 NameNode 新增了一些指标比如 Observer 状态下的haStateYARN 的 Capacity Scheduler 也增加了队列内 pending 容器数和资源抢占事件的统计。我建议重点盯三个地方NameNode 的RpcAvgProcessingTime、DataNode 的BlockReportAvgTime、YARN 的PendingContainers。3.4.0 在同样负载下这几个数字的基线会比 3.3.x 有变化。先让监控跑一周拿到新基线后再调整告警阈值不然会收到一堆无意义的告警。5.4 一个关于稳定版本的提醒网上偶尔会看到把 Apache Hadoop 3.4.0 和某些第三方插件或“时间限制”联系起来的说法。这里我多说一句Apache Hadoop 官方发布的 GA 版本没有任何使用期限或试用限制凡是遇到“试用到期”“需要授权”这类说法都是非官方渠道的二次分发或混淆可以直接忽略。从官方 Apache 镜像站下载的 3.4.0 压缩包行为是完全开放的。6. 升级后的半年跟踪与个人体会从我自己的实践来看3.4.0 不是那种“发布当晚就值得冲”的版本但它绝对是一个“必须放进技术债清理清单”的版本。我目前已经把部分离线分析集群稳定运行在 3.4.0 上接近半年下来最让我满意的不是某个单点特性而是整体默认配置的稳妥性。和 3.3.x 相比3.4.0 在 NameNode GC 表现、DataNode 磁盘感知、YARN RM 恢复三个方面都有实实在在的改善。如果你要开始评估我的建议是不要只看 release notes而是准备一套和线上尽量一致的测试环境把读流量和写流量按一定比例回放进去。重点观察 NameNode RPC 延迟、DataNode 心跳上报耗时、以及 YARN 在队列资源竞争时的调度稳定性。跑两周之后再决定要不要把 3.4.0 推到生产。最后分享一个小的操作习惯升级时不要直接覆盖配置文件我把每个环境的etc/hadoop目录纳入 git 管理升级前后的 diff 一目了然。这习惯帮我解决过很多次“是不是配置没生效”的争论也方便回滚时精准还原。希望这篇围绕 Apache Hadoop 3.4.0 GA 版本的分享能帮你少走一些弯路。
返回列表