2021SC@SDUSC
storm代码阅读(九)
2021SC@SDUSC
Task部分阅读(四)
创建Task数据
mk-task-data函数用来创建与Task相关的数据,其参数为Executor的数据executor-data以及该Task的TaskId。
代码如下:
(defn mk-task-data [executor-data task-id]
(recursive-map
:executor-data executor-data
:task-id task-id
:system-context (system-topology-context (:worker executor-data) executor-data task-id)
:user-context (user-topology-context (:worker executor-data) executor-data task-id)
:builtin-metrics (builtin-metrics/make-data (:type executor-data))
:tasks-fn (mk-tasks-fn <>)
:object (get-task-object (.getRawTopology ^TopologyContext (:system-context <>)) (:component-id executor-data))))
下面介绍一些成员变量:
:executor-data :为Task所在的Executor的数据。
:task-id :为该Task的序号,在整个Topology中是唯一的。
:system-context :通过调用system-topology-context方法获得。该方法会调用mk-topology-context-builder函数创建的TopologyContext对象,其传入的Topology对象是Worker通过system-topology函数产生的。system-topology函数的功能为在用户定义的Topology的基础上添加系统组件(如Acker Bolt等)。
:user-context :产生方法与:system-context类似,只不过:user-context是通过传入Worker的:topology对象来构建TopologyContext的,因此只包含用户定义的Topology。
:builtin-metrics :使用:builtin-metrics/make-data并根据Executor的类型来创建内置的统计信息如消息发送数目等。
:tasks-fn :是Task的核心成员,它通过mk-tasks-fn函数产生,主要用来选择消息的目标节点以及发送消息。
:object :对应于该Task所执行的Spout或Bolt对象。这里首先调用system-context的getRawTopology获取用户定义的Topology,即user-context的Topology对象,之后调用get-task-object方法,根据组件ID获取该组件所对应的Spout或Bolt对象。
get-task-object函数用于获取Task所对应的Spout或Bolt对象,代码如下:
第2~4行获得所有用户定义的spout、bolts和state-spout对象,每个组件只会属于其中一个集合。
第5~10行获取对应的ComponentObject类型,并调用getSetComponentObject方法将其转化为实际对象。
第11~15行进行判断,若obj为ShellComponent,则调用ShellSpout或者ShellBolt进行封装,传入的obj实际上为ShellSpout或者ShellBolt要启动的命令。在Storm中,我们利用ShellSpout以及ShellBolt来完成多语言处理,它们内部含有需要执行的命令。
第16~18行首先进行判断,若obj为JavaObject对象,并且该对象含有full_class_name以及args_list成员变量,则利用instantiate-java-object函数来创建JaveObject所代表的目标对象。
instantiate-java-object函数定义如下: