JStorm源码分析(一):Storm执行脚本
JStorm源码分析文件
对于整个JStorm源码分析系列,我将JStorm源码分析的文件放在我的GitHub上JStorm源码剖析,欢迎大家fork和star
storm脚本
Storm脚本是python脚本 调用storm脚本时,执行其中的main方法,mian方法源代码如下:
main方法中有两个参数: COMMAND = args[0] ARGS = args[1:]
所有的COMMAND: COMMANDS = {
“jar”: jar, “kill”: kill, “shell”: shell, “nimbus”: nimbus, “ui”: ui, “logviewer”: logviewer,
“drpc”: drpc, “supervisor”: supervisor, “localconfvalue”: print_localconfvalue, “remoteconfvalue”: print_remoteconfvalue, “repl”: repl, “classpath”: print_classpath, “activate”: activate, “deactivate”: deactivate, “rebalance”: rebalance, “help”: print_usage, “list”: listtopos, “dev-zookeeper”: dev_zookeeper, “version”: version, “monitor”: monitor
}
执行命令,提交Topology任务到集群: 命令如下:
storm jar WordCount.jar com.stone.WordCountMain wordcount
脚本的执行流程如下:
(1)获得COMMAND = args[0]参数,COMMAND = “jar”
(2)在COMMANDS 中找到对应的命令jar
(3)调用def jar 方法
(4)在def jar方法中,调用exec_storm_class
def exec_storm_class(klass,jvmtype="-server",jvmopts=[],extrajars=[],args=[], fork=False):
globalCONFFILE storm_log_dir=confvalue("storm.log.dir",[CLUSTER_CONF_DIR]
if(storm_log_dir==Noneorstorm_log_dir=="nil"): storm_log_dir=STORM_DIR+"/logs"
all_args=[
JAVA_CMD,jvmtype,get_config_opts(),
"-Dstorm.home="+STORM_DIR,
"-Dstorm.log.dir="+storm_log_dir,
"-Djava.library.path="+confvalue("java.library.path",extrajars),
"-Dstorm.conf.file="+CONFFILE,
"-cp",get_classpath(extrajars),
]+jvmopts+[klass]+list(args) print("Running:"+"".join(all_args))
if fork:
os.spawnvp(os.P_WAIT,JAVA_CMD,all_args)
else:
os.execvp(JAVA_CMD,all_args)#replacesthecurrentprocessand #neverreturns
(5)在exec_storm_class中最终操作系统调用os.spawnvp(os.P_WAIT,JAVA_CMD,all_args)或 者os.execvp(JAVA_CMD,all_args)完成命令的执行。
也就是执行:
storm jar WordCount.jar com.stone.WordCountMain wordcount
实际上是调用:
java -client WordCount.jar com.stone.WordCountMain wordcount
相关系列文章
JStorm源码分析(六)Supervisor启动Worker的过程
微信公众号
有兴趣的同学可以关注一下小编哟!