把一个应用程序移植到yarn到,需要编写两个部分:client和AppMaster。其中client用于向yarn提交应用程序,获得appid,并且启动appMaster,而appMaster在启动后将启动相应的服务,申请新container来运行任务,以及任务失败的fail over等。在storm-yarn项目中,appMaster则需要启动nimbus和ui服务,当提交storm任务后,也需要申请新的container来运行任务,其架构如下图:
接下来看一下storm-yarn的代码。代码比较简单,有以下几个类,都在一个包中:
其中各个类的作用简要介绍如下:
Client.java 程序入口
JStormOnYarn: launch storm on yarn
LaunchCommand: 处理storm-yarn launch命令
MasterClient: 与MasterServer通信以获取storm.yaml
MasterServer: 运行在Yarn中的appMaster,负责在container中启动nimbus和ui server,同时与RM通信,汇报心跳,决定是否启动supervisor
StormAMRMClient: MasterServer辅助功能类,真正执行supervisor服务的启动
StormMasterServerHandler: MasterServer的handler,控制所有storm服务的开关,负责nimbus,ui,supervisor的启动与停止。
由于storm与jstorm的架构几乎一致,因此在jstorm on yarn项目中我也大部分重用了storm-yarn的代码,再针对jstorm进行个别修改。
目前已实现jstorm-yarn launch <master.yaml> 命令,可以提交jstorm到yarn集群上运行。
下一步计划:
1. 运行jstorm example,使之能在yarn上的jstorm集群上运行
2. 实现jstorm-yarn的更多命令