JStorm源码分析-4.Nimbus服务器

在jstorm的架构中,Nimbus的作用是用来操作Topology、上传/下载文件、获取集群状态和拓扑状态等。主要作用是接收client的请求,并在计算之后,修改zk上的数据。

1.启动

使用下面的命令就可以启动nimbus服务器端了

jstorm nimbus

jstorm是一个python脚本,会组装java命令后启动NimbusServer

java -server 
-Djstorm.home=/Users/shishengjie/software/jstorm-0.9.1 
-Dstorm.options= 
-Djava.library.path=/usr/local/lib:/opt/local/lib:/usr/lib  
-Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 
-Dlogfile.name=nimbus.log 
-Dlog4j.configuration=File:/Users/shishengjie/software/jstorm-0.9.1/conf/jstorm.log4j.properties  
-cp /Users/shishengjie/software/jstorm-0.9.1/jstorm-client-extension-0.9.1.jar:/Users/shishengjie/software/jstorm-0.9.1/jstorm-client-0.9.1.jar:/Users/shishengjie/software/jstorm-0.9.1/jstorm-server-0.9.1.jar:/Users/shishengjie/software/jstorm-0.9.1/lib/kryo-2.17.jar:/
com.alibaba.jstorm.daemon.nimbus.NimbusServer 

在使用idea调试的时候,我们需要把相关的参数设置进去。

2. NimbusServer

2.1 启动过程

NimbusServer的启动过程主要是在launchServer方法中,

  1. 读取配置,首先从defaults.yaml中读取默认配置;然后从storm.conf.file指定的文件(如果没有,从classpath查找storm.yaml);最后从命令行读取storm.options中的配置,并依次覆盖。
  2. 检查conf配置是否为集群模式,storm.cluster.mode默认是distributed
  3. 初始化关闭hook,会在jvm关闭时执行cleanup方法
  4. 创建NimbusData,主要是初始化两个用于上传和下载的map,这个map带有过期清除功能,过期后可以回调指定方法。
  5. 使用Curator客户端创建leaderSelector,用于nimbus客户端选择leader,选举成为leader后会调用listener中的方法。
  6. 如果未获得leader角色,会初始化follower的线程,该线程的主要工作是清理已经分配完成的本地文件,从master下载文件。

2.2 leader

成为leader后,nimbus服务器需要很多初始化操作:

  1. 获取hostname和port(配置:nimbus.thrift.port默认为7627),将master的host和port写入到zk下面的/jstorm/master节点的内容里;
  2. cleanupCorruptTopologies清除中断的拓扑,在zk中有记录但是本地dir上面没有的拓扑被认为是被中断的。在zk中找 /jstorm/topology/下面的节点,本地路径/local-storm-dir/nimbus/stormdist下面是拓扑列表,将zk中的列表移除本地有的,剩下都是本地没有的,清除的操作就是从zk中移除节点。
  3. initGroup初始化group: 如果配置了分组模式(nimbus.groupfile.path中指定了文件路径,如conf下的group.ini)那么会解析这个文件,并将group信息保存到NimbusData中。
  4. initTopologyAssign初始化TopologyAssign,这是一个单例,TopologyAssign线程,用于为topology的task分配资源
  5. initTopologyStatus,初始化状态,更新 /jstorm/topology/的子节点的StormBase的状态为StatusType.startup
  6. initMonitor初始化监视器,nimbus.monitor.freq.secs 10s运行一次,根据心跳时间查找dead的task,修改zk中topology的状态为monitor
  7. initCleaner初始化清理器,每隔一段时间(默认600秒),清理/LOCAL-DIR/nimbus/inbox中上传的jar包
  8. 创建ServiceHandler,其实现了thrift的nimbus服务,处理client的请求
  9. initThrift初始化thrift服务器,用来处理client端的请求

3. 提供的服务

3.1 getClusterInfo

这个服务用于从zk中获取集群当前状态:

  1. 从zk获取 /jstorm/topology/下获取子节点和里面的内容StormBase,遍历topology,获取每个拓扑的Assignment,获取group信息,封装到TopologySummary
  2. 获取Supervisor的状态,从/jstorm/supervisors下的所有子节点,内容是SupervisorInfo,将supervisors和assignments封装为SupervisorSummary
  3. 封装为ClusterSummary返回

3.2 上传文件

beginFileUpload
开始上传文件主要确定了文件的上传后的路径和文件名:{localdir}/nimbus/inbox/stormjar-{uuid}.jar,然后创建操作文件的Channel,加入到Uploader中。

uploadhunk
传入文件的全路径后和写入的byte数组,从Uploader获取Channel,将数据写入文件

finishFileUpload
结束上传,从Uploader获取Channel,关闭。

3.3 下载文件

beginFileDownload
创建BufferFileInputStream,然后生成一个uuid作为id返回给client端。将id和BufferFileInputStream实例保存到Downloaders中。
downloadChunk
client端传入了id,从Downloaders中获取BufferFileInputStream,然后读取一个chunk放入byte数组并返回。

3.4 killTopologyWithOpts

首先,确定topology是否处于激活状态,再修改/jstorm/topology/{topologyId}的内容是StormBase的状态为StatusType.kill

3.5 activate与deactivate

修改/jstorm/topology/{topologyId}的内容是StormBase的状态为StatusType.activate和StatusType.inactivate

3.6 rebalance

首先,确定topology是否处于激活状态,再修改/jstorm/topology/{topologyId}的内容是StormBase的状态为StatusType.rebalance

可以看到,nimbus的主要作用是获取配置,修改zk的配置,具体的实现还需要Supervisor进行相应的操作。下一节,我们分析Supervisor的启动和工作方式。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,710评论 4 376
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,839评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,295评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,776评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,198评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,074评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,200评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,986评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,733评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,877评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,348评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,675评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,393评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,209评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,212评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,003评论 2 280

推荐阅读更多精彩内容

  • 这是一个JStorm使用教程,不包含环境搭建教程,直接在公司现有集群上跑任务,关于JStorm集群环境搭建,后续研...
    Coselding阅读 6,182评论 1 9
  • Date: Nov 17-24, 2017 1. 目的 积累Storm为主的流式大数据处理平台对实时数据处理的相关...
    一只很努力爬树的猫阅读 2,106评论 0 4
  • Strom集群结构是有一个主节点(nimbus)和多个工作节点(supervisor)组成的主从结构,主节点通过配...
    看山远兮阅读 2,736评论 0 7
  • 爱是什么呢 它总会有千万种声音 但我想 它是恰好 恰好的遇见 恰好的牵手 恰好的亲吻 恰好的变成互相的影子 然后这...
    南是南风阅读 151评论 0 0
  • 我以为我在改,也以为你很在乎我,也同样在磨合。我努力去做你心中的完人,可能我做的不到位入不了眼。又或许这一切只...
    抹不去的味道阅读 223评论 0 0