
背景
规范化治理
-
集群部署方式不统一,有 CM 管理和手动搭建;各集群的 HADOOP 安装、配置、日志目录不统一; -
无统一且全面的监控面板,指标散落在多套系统,定位问题需来回跳转,监控和告警覆盖不完整; -
线上有多套 HDFS 集群,小集群占比高,一些集群机器异构严重,小盘机器掉线频繁; -
DN 坏盘维修流程长,人工参与度高,效率低。
稳定性建设
-
优化 NN 和 DN 锁; -
支持目录保护,防止业务误删; -
支持 Client 禁用 skipTrash,expunge 等命令; -
支持 TraceId,方便定位用户 job; -
完善 NN 处理 FBR 上报功能; -
支持查看某个路径下的 OpenFiles,便于快速定位问题; -
支持查找阻塞 DN 退役的未释放租约文件命令; -
支持动态刷新 RACK信息; -
支持 DN 重入役后移除待复制 blocks 功能; -
支持动态获取配置的 Client 允许设置副本数; -
支持 WEB UI 统计和展示退役时间; -
支持 WEB UI 禁用 Browse Directory 页面; -
支持DN jmx获取CompileInfo信息。
-
避开慢节点; -
避开慢盘; -
优化 Balance 请求 Standby NameNode; -
优化 DN DirectoryScanner 效率和 IO 影响; -
支持 DN 快速感知 blk 文件变化; -
优化心跳逻辑,减少不必要循环; -
删除 Block 流程锁优化功能,减少占锁时间,避免长时间占锁影响性能; -
支持 Balance 跳过回收站数据。
-
支持 HDFS 超级账户白名单; -
支持 path 禁用特殊字符; -
支持禁用1副本; -
支持大目录 DU/Count 跳过鉴权; -
支持 Owner 设置 Quota,方便 job 层面限制中间产生大目录; -
HDFS 的自建 zk 迁至云平台; -
HDFS 机器禁用 SWAP; 制定极端故障预案,覆盖 NN 机器故障、NN元数据目录被误删、JN 机器故障/替换、ZK 路径被删、ZK 服务不可用等场景。
精细化运营
-
集群长期处于较高水位,存储压力大,业务成本高; -
个别业务超预算占用严重,挤占其他业务存储资源,预算机制无强力管控; -
零采购且机器过保率逐年升高。


针对超预算的业务,我们拉通了业务方负责人和 HDFS 管理人员,建立了 HDFS 空间管控共治群。同时也对业务数据每日使用详情,产出分析报表,帮助用户快速识别 HDFS 用量情况。经过一段时间的共治,业务累计优化释放了数十 PB 空间。
统一存储

-
第一级是计算节点端的本地 Cache(计算节点需提供本地磁盘),节省计算和远程访问的带宽,提升本地读写性能; -
第二级是高性能的分布式 Cache,主要解决一级 Cache 容量有限和不能共享的问题。
-
s1:CubeFS EC 灰度,初步替代旧的冷存底座; -
s2:CubeFS EC 成为唯一冷存底座; -
s3:CubeFS 灰度,承接部分温热数据; -
s4:CubeFS 统一存储,完全替代 HDFS。


上线至今,HDFS 已降冷数百 PB 到 CubeFS EC,大幅节省用户存储成本。目前,我们正逐步推进 s3 阶段的落地。
问题案例


(2)中间 staging 产生大量 blocks
-
第一种是大量删除

-
第二种场景是块增长非常快,nn 处理不过来

(3)实时 flink checkpoint hdfs 集群调优。

(1)zk故障导致zkfc挂掉


(2)zk path 被误删
线上某集群的 zkfc 用到的 zk path 发生过被误删,整个恢复流程如下:
1.先停止 snn 上的 zkfc
2.再停止 ann 上的 zkfc
3.snn 机器上执行 hdfs zkfc -formatZK
4.重启 ann 上的 zkfc
5.检查 ann 机器的 zkfc 日志和进程
6.重启 snn 上的 zkfc
7.检查 snn 机器的 zkfc 日志和进程
(3)zk 导致主备切换
线上 HDFS 用到的 zk 版本都是 3.4.5 的,HDFS 客户端有个动态识别集群的功能和 zkfc 用的 zk 是同一组地址,会有大量短链接产生,线上发生过一起 zk sessionid 被 close 导致 HDFS 切主问题。

这个是历史遗留的 zk 使用不当问题,较难从客户端去入手治理,于是我们把 HDFS 服务端的自建 zk 统一迁移到了云平台 zk,和客户端 zk 隔离,迁移流程如下:
1.云平台上申请一组新的 zk
2.先停止 snn 上的 zkfc
3.再停止 ann 上的 zkfc
4.修改 hdfs-site.xml 里面的 ha.zookeeper.quorum 参数,替换为新的 zk 地址,并备份老的 zk 地址
5.更新配置文件不重启
6.snn 机器上执行 hdfs zkfc -formatZK
7.重启 ann 上的 zkfc
8.检查 ann 机器的 zkfc 日志和进程
9.重启 snn 上的 zkfc
10.检查 snn 机器的 zkfc 日志和进程
(1)阻塞退役
-
租约未释放


-
副本数不一致

不存在租约未释放问题,hdfs 上查看文件是 2 副本存放,但是 Expected 是 3。设置副本数变为 3,问题解决。
-
snn 上 dn dead 阻塞退役





-
snn 上缺失 dn 阻塞退役

-
机架错误阻塞退役


(2)退役节点导致 dn 掉线



(3)退役引起 rpc 毛刺

(1)坏盘掉线


(2)Direct buffer OOM


(3)锁问题







(1)不可修复


(2)可修复


(1)balance优化


(1)IO 负载问题
(2)机房网络问题

(3)节点坏道
线上也遇过 dn 坏道,SendDataPacketTransferNanosAvgTime 异常,引发用户 job 慢,退役故障节点后,任务性能恢复。
未来规划

Xiaolong Liu OPPO高级后端工程师
负责OPPO大数据离线存储HDFS的优化与架构演进。
安第斯智能云
本文分享自微信公众号 - 安第斯智能云(OPPO_tech)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。