Hadoop 集群从物理机到云原生迁移方案
提出 YARN on K8s Pod 渐进式方案,覆盖评估、数据搬迁、双跑验证到切换的迁移三阶段
袋鼠云
物理机 Hadoop 集群面临扩容周期长、资源利用率低、运维成本高三大痛点。迁移到云原生架构不是简单的"把 Hadoop 装到 K8s 上",而是需要从调度、存储、网络三个维度重新设计。
YARN 与 Kubernetes 调度对比
迁移前需要理解两种调度器的核心差异:
YARN 的优势:
- 原生支持队列隔离和资源抢占,多租户管理成熟
- 与 Hadoop 生态组件(Hive、Spark、Flink)深度集成
- 支持标签调度(Node Label),可以将不同任务调度到不同硬件
Kubernetes 的优势:
- 容器化部署,环境一致性和可移植性好
- 弹性伸缩更灵活,支持 HPA/VPA 自动扩缩容
- 丰富的生态(Service Mesh、CI/CD、监控告警)
关键差异:
- YARN 的资源模型是 CPU + Memory,Kubernetes 是 CPU + Memory + 自定义资源
- YARN 支持资源抢占(Preemption),Kubernetes 原生不支持(需要 Volcano 或 YuniKorn 插件)
- YARN 的 Application Master 概念在 Kubernetes 中没有直接对应
渐进式迁移方案:YARN on K8s Pod
直接将所有作业从 YARN 迁移到 K8s 风险太高。推荐渐进式方案:先在 K8s 集群中运行 YARN,让现有作业无需改造即可获得容器化弹性。
方案架构:
物理机 YARN 集群
↓ 渐进迁移
K8s 集群 + YARN on Pod(Yunikorn 调度器)
↓ 作业逐步改造
K8s 原生调度(Spark on K8s / Flink on K8s)第一阶段:环境准备:
- 部署 K8s 集群(推荐 3 Master + N Worker)
- 安装 Yunikorn 作为 K8s 上的 YARN 替代调度器
- 配置 PV/PVC 实现存算分离(推荐 JuiceFS 或 CephFS)
- 部署监控栈(Prometheus + Grafana)
第二阶段:双跑验证:
- 将部分非关键作业迁移到 K8s 集群
- 配置数据同步(HDFS → JuiceFS),确保两个集群可以读取相同数据
- 运行 2-4 周对比作业执行时间、资源利用率和稳定性
- 记录性能基线和差异
第三阶段:全量切换:
- 分批迁移关键作业,优先迁移无状态的批处理作业
- 实时作业(Flink/Spark Streaming)最后迁移,因为状态管理更复杂
- 保留物理机集群 2-4 周作为回滚保障
- 切换完成后下线物理机集群
大数据基础平台 EasyMR
统一存储、计算与运维,支撑批、流、OLAP 与湖仓一体的国产化大数据底座平台
存算分离改造
存算分离是云原生迁移的核心前提。传统 Hadoop 的 HDFS 将数据和计算绑定在同一集群,迁移到 K8s 后需要将存储独立出来。
方案选择:
- JuiceFS:POSIX 兼容,对上层应用透明,迁移成本最低
- CephFS:Kubernetes 原生支持,运维复杂度较高
- 对象存储(S3/OSS)+ Hadoop 兼容层:成本最低,但延迟较高
迁移步骤:
- 部署存储服务并创建挂载点
- 使用
hadoop distcp或rsync将 HDFS 数据迁移到新存储 - 修改 Hive/Spark 的
fs.defaultFS指向新存储 - 验证数据一致性和读写性能
- 灰度切换流量,确认无问题后完成切换
国产信创
面向国产化替代与信创改造场景,支撑数据平台平滑迁移、统一纳管、性能保障与安全可控。
风险清单与回滚策略
主要风险:
- 网络延迟:K8s Pod 之间的网络延迟可能高于物理机,影响 Shuffle 性能
- 存储性能:对象存储的随机读写性能远低于 HDFS,需要评估工作负载是否适合
- 状态管理:Flink/Spark 的 Checkpoint 写入远程存储可能变慢
- 运维复杂度:K8s 集群本身的运维需要 Kubernetes 专业知识
回滚策略:
- 保留物理机集群作为回滚目标,切换后至少保留 2 周
- 数据同步保持双向,确保可以随时切回
- 建立回滚决策标准:如果 K8s 集群的作业失败率超过物理机的 2 倍,触发回滚
Flink on K8s 生产注意事项
Flink on K8s 有两种部署模式:Application Mode 和 Session Mode。生产环境推荐 Application Mode,因为每个作业有独立的集群,资源隔离更好。
关键配置:
kubernetes.cluster-mode: true
kubernetes.container.image: flink:1.18-scala_2.12
kubernetes.taskmanager.memory.process.size: 4096m
kubernetes.jobmanager.memory.process.size: 2048m注意事项:
- 配置
kubernetes.pod-template-file自定义 Pod 模板,挂载 PV/PVC 和配置文件 - 启用
kubernetes.enforce-session-mode-deletion确保 Session 集群自动清理 - 监控 Pod 的 OOMKilled 事件,及时调整内存配置


