加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_阳江站长网 (https://www.0662zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 创业 > 模式 > 正文

记一次上千节点Hadoop集群升级过程

发布时间:2020-07-26 16:12:12 所属栏目:模式 来源:IT168网站 原创
导读:继《记一次超万亿规模的Hadoop NameNode性能故障排查过程》之后,虽然解决了Hadoop2.6.0版本在项目中的问题,但客户依然比较担心,一是担心版本过老,还存在其他未发现的问题;二是按目前每天近千亿条的数据增长,终究会遇到NameNode的第二次瓶颈。基于上

继《记一次超万亿规模的Hadoop NameNode性能故障排查过程》之后,虽然解决了Hadoop2.6.0版本在项目中的问题,但客户依然比较担心,一是担心版本过老,还存在其他未发现的问题;二是按目前每天近千亿条的数据增长,终究会遇到NameNode的第二次瓶颈。基于上述原因,我们决定将当前集群由Hadoop2.6.0版本升级到Hadoop3.2.1版本,且启用联邦模式。

历时2周,我们将录信数据库LSQL的源码进行了修改,适配Hadoop联邦机制,以期达到扩容至上万节点的能力。

因为是数十亿数据规模的生产系统,无论是丢数据还是长时间停服务都是不可接受的,所以客户方和录信侧都非常慎重,做了大量的前期准备,进行了多次升级演练,包括各种情况的回退方案、数据丢失的挽回方案、升级后的功能性能验证,大大小小做了十几次测试。但即使做了充分的准备,我们还是遇到了几个预想不到的问题。

永不退缩是录信最深的执着,经过一周的日夜奋战,集群终于成功升级到社区最新Hadoop3.2.1版本,启动3个联邦,彻底解决NameNode负载问题。

记录下升级中遇到的问题,分享给大家,希望能有一点小小的贡献,让大家越过录信趟过的雷!

一、 跨多个联邦后,速度没有变快,反而变慢

理论上,升级成跨联邦机制,读写请求会分别均衡到三个不同的NameNode上,降低NameNode负载,提升读写性能,然而事实是NameNode负载不但没有降低,相反变得非常非常慢。

集群卡顿的程度,对于生产系统来说是不可用的,升级已经进行了三天了,再不解决就要立即启动回退方案。心有不甘,连夜奋战。

抓了堆栈,知道主要问题还是NameNode卡顿,生产系统已经不能继续调查下去了,不想回退,就得让系统可用,那就得从我们最熟悉的地方下手---修改录信数据库LSQL,给所有请求NameNode文件的地方加上缓存,只要请求过的文件,就缓存下来,避免二次请求NameNode。

LSQL修改后NameNode状态有非常大的改善,系统基本可用。但具体为何升级到联邦后NameNode的吞吐量不升反降,我们没能给出合理的解释,只能考虑为历史数据还在一个联邦上,不均衡,之后随着新数据的逐步均衡,会有所好转,但这并不准确可靠。

二、 升级联邦后LSQL不稳定总挂掉

升级后,几乎每隔几天LSQL就会挂掉一次。

观察录信数据库LSQL的宕机日志,发现有大量的如下输出,证明Hadoop NameNode经常位于standby模式,导致Hadoop服务整体不可用,从而引起录信LSQL数据库宕机。

记一次上千节点Hadoop集群升级过程

进一步分析NameNode发现Hadoop的NameNode并未宕机,active与standby都活着。结合Zookeeper日志分析发现,期间发生了NameNode的activer与standby的切换。

记一次上千节点Hadoop集群升级过程

这里涉及两个问题,一是为什么发生了主备切换,二是切换过程中是否会导致服务不可用。

针对主备切换的原因,经过对比切换发生的时间,发现切换时NameNode做了比较大的负载请求,如删除快照,或者业务进行了一些负载较大的查询。这很有可能是因为NameNode负载较高,导致的Zookeeper链接超时。具体为什么NameNode负载很高,这个我们在后面阐述。

至于切换过程中是否会导致服务不可用,我们做了测试。第一次测试,直接通过Hadoop 提供的切换命令切换,结果切换对服务没有影响。第二次测试,直接将其中的Active NameNode给kill掉,问题复现了。可见在Hadoop 3.2.1版本里,active 与standby的切换,在切换过程中,是存在服务不可用的问题的。我们针对报错位置进一步分析如下:

记一次上千节点Hadoop集群升级过程

看RouterRpcClient类的设计实现,应该是存在failover的逻辑。相关配置参数key值如下。

记一次上千节点Hadoop集群升级过程

最终分析RouterRpcClient.java这个类,发现其设计逻辑是有问题的,虽然预留了上面那些参数,但没有生效,NameNode在主备切换过程中,存在两个NameNode同时处于Standby的过程。并且这个阶段,会直接抛错,导致因报错而服务不可用。

我们详细阅读了该类的实现,发现该类虽然预留了重试的逻辑,但是这些重试的逻辑并没生效,存在BUG,故我们对此进行了修复。修复后录信数据库LSQL的宕机问题不再出现,如下是涉及源码的分析过程:

记一次上千节点Hadoop集群升级过程

记一次上千节点Hadoop集群升级过程

记一次上千节点Hadoop集群升级过程

记一次上千节点Hadoop集群升级过程

记一次上千节点Hadoop集群升级过程

记一次上千节点Hadoop集群升级过程

如下是修复版本后,router重试过程中记录的日志:

记一次上千节点Hadoop集群升级过程

  三、 录信数据库LSQL查询的时候间歇性卡顿

Hadoop升级到3.2.1版本后,录信数据库LSQL会出现间歇性的卡顿情形,导致业务查询页面总是在“转圈圈”。

到现场后第二天遇到了该现象,经过了一系列的排查和追踪,最终定位在Hadoop 的NameNode卡顿。具体体现在进行一次ls操作,会卡顿20~30秒的时间。进入NameNode节点的机器观察负载情况,发现CPU的负载占用在3000%上下。

(编辑:应用网_阳江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读