Hadoop 源码学习笔记(7)--Yarn 与 Hdfs 的源码系统设计差异

看过了 Hdfs 和 Yarn 的源码,发现两者的系统设计完全不同,根本不像是同一个 Project 的 Module,觉得很有必要对这两个 Module 源码的系统设计做一次分析。

我私下里认为两者源码系统设计之所以不同的原因无非是:

  1. Hdfs Module 出现的时间较早,整个 Module 的系统设计也是在开源之初就已经确定完成,之后的版本迭代中,都是基于原版 Hdfs 的代码逐步演进的,因此他的整个系统设计比较粗糙,偏实用型,结构大而全。
  2. 在 Yarn 之前, Hadoop 还有一个 ResourceManager 组件,叫做 JobTracker, Yarn 是后续开发人员重新设计的 ResourceManager,因此 Yarn 在设计之初,整个 Project 已经处于社区维护阶段,更由于全新建设的原因,扔掉了 JobTracker 的历史包袱,他的系统设计相对比较良好,拥有服务化和消息总线两把神兵利器。

言归正传,我们回到 Yarn 和 Hdfs 的系统设计本身,虽然 Yarn 和 Hdfs 两个 Module 各自有自身不同的多种节点,但是同一个 Module 中的节点的系统设计大致一致。在这里我只针对 Yarn 中的 ResourceManager 和 Hdfs 中的 NameNode 两者进行系统设计分析,其余节点可以参考着对应 Module 进行查看,不再做一一分析。

NameNode 的系统设计

系统结构

NameNode 作为 Hdfs 的文件系统管理节点,他的整体系统设计可以用下图进行表示

NameNode

整个 NameNode 可以总结为上图。

最上方是两个对外暴露服务,一个是 HttpServer 负责提供 Http 服务展示当前的节点状态,一个是 RPCServer 负责集群间的内部通信。

第二层是一个中介者,负责响应 HttpServer 和 RpcServer 的请求,一般而言所有的请求操作都会通过 FSNamesystem 再向下分发。

第三层是具体的业务模块,主要由 BlockManager 和 FSDirectory,MetricsSystem 构成。其中 BlockManager 负责维护 DataNode 的相关信息,并持有 DataNode 所拥有的 Block 列表;FSDirectory 则负责维护当前 NameNode 的文件系统;MetricsSystem 负责记录一些行为操作细节,例如 gc 时间,节点数量等。

最下方是几个底层模块,上图中我也只列举出了部分常用的 Manager,业务模块通过对底层模块的调用实现其业务逻辑。

启动逻辑

之前的章节 中有简单提过 Hdfs 的启动流程。

protected void initialize(Configuration conf) throws IOException {
    // 启动 MetricsSystem
    NameNode.initMetrics(conf, this.getRole());
    
    if (NamenodeRole.NAMENODE == role) {
        // 启动 HttpServer
        startHttpServer(conf);
    }
    
    // 启动 FSNamesystem
    loadNamesystem(conf);
    
    // 启动 RpcServer
    rpcServer = createRpcServer(conf);
}

在入口函数 NameNode::main 中,我们看到对于各个模块的加载是完全放在 NameNode::initialize 中进行的。

这样的做法自然是足够简单,但和 Yarn 的设计比起来就显得略微粗糙了。

Yarn 的系统设计

本文的主要介绍会在 Yarn 上,作为 Hadoop 2.x 才推出的 ResourceManager,它的系统设计相较于 Hadoop 有了很大的提升。

系统结构

ResourceManager

上图中列出了 ResourceManager 中的一些关键组件,这些组件都继承了 Service 接口,也就是说在 ResourceManager 中的各个组件都已经 Service 化了。

ResourceManager 中默认实现了 HA 逻辑,当同时存在多个 ResourceManager 时,会通过内置的 EmbeddedElector 进行主从选举。默认的 EmbeddedElector 是 ActiveStandbyElectorBasedElectorService,在默认实现类中,同 zkfc 共享同一个主从选举逻辑,具体选举逻辑在上一篇文章中有对应介绍: Hadoop 源码学习笔记(6)--Hdfs 的备份,高可用和横向扩展。选举结束之后,只有 ActiveResourceManager 才能够启动 RMActiveServices。

而 RMActiveServices 是多个 Service 组件组成的一个集合 Service,这些 Service 负责维护当前集群中的 NodeManager 和正在运行的 App 信息。只有启动了 RMActiveServices 的 ResourceManager 才能够接收 Client 提交的 App 信息,并通过 ApplicationMasterLauncher 在 NodeManager 中开启对应的 ApplicationMaster,进入任务处理流程。

Service 化

Service

Service 是 Yarn 中抽象出的一种组件生命周期,由 init、start、stop 三个接口方法,如方法名所示,分别对应服务的初始化、启动和终止三种行为。

在 Yarn 中,系统将每一个组件抽象化成一个 Service,若涉及到多个 Service 聚合使用,则会通过 addService 和 addIfService 方法将多个 Service 聚合到同一个 Service 中,并共享上级 Service 的生命周期。

通过生命周期共享这一策略,可以确保由 ResourceManager 启动的所有 Service 共同享有一套生命周期,上层的 Service 通过分发消息给下层的 Service,确保所有 Service 按需启动和退出。

消息总线

在 Hdfs 中,事件的分发是直接通过对对象的调用进行直接操作的,因此追踪相对简单,方便源码走读。

但是在 Yarn 中,所有事件分发都是通过消息总线完成的。在 ResourceManager 或者 NodeManager 中均会启动一个 AsyncDispatcher 对象,负责接收并分发事件。

AsyncDispatcher

Service 通过向 AsyncDispatcher 中 register EventHandler,可以将 EventType 和 EventHandelr 一一对应的注册进入 AsyncDispatcher 中。当使用 dispatch 进行事件分发时,根据对应的 Event,选取对应 EventHandler 进行事件消费。

通过消息总线机制,只要获取到了 AsyncDispatcher 对象,就可以对任意事件进行监听操作。这对服务管理来说是比较方便的,我们可以保证所有事件分发均运行在同一线程,并且可以在任意位置进行事件注册,但是当我们进行源码走读的时候,由于事件可能在任务位置被注册,故会对走读造成一定影响。

总结

组件 模块逻辑 消息事件分发
Hdfs 全部在 main 方法中依次注册,需要自身维护生命周期 通过组件间的相互调用实现消息分发
Yarn 子模块被抽象成 Service,和顶层 Service 共享同一个生命周期 通过消息总线进行事件分发
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容