除了gearman协议中的定义的提交job到jobServer的下列原语:SUBMIT_JOB,SUBMIT_JOB_BG,SUBMIT_JOB_LOW,SUBMIT_JOB_LOW_BG,SUBMIT_JOB_HIGH,SUBMIT_JOB_HIGH_BG,gearmand添加了两条原语:SUBMIT_REDUCE_JOB和SUBMIT_REDUCE_JOB_BACKGROUND。从名字上看我们就知道SUBMIT_REDUCE_JOB_BACKGROUND是SUBMIT_REDUCE_JOB的后台版本。
一看SUBMIT_REDUCE_JOB名字,我们就可以猜这条原语可能与流行的Map/Reduce有关。是的,这条原语就是专门为简化利用gearman协议进行Map/Reduce计算设计的。虽然,利用已有的gearman协议能够进行Map/Reduce计算,但是如果利用SUBMIT_REDUCE_JOB原语,可以使Map/Reduce计算更加简单,更加自然。
SUBMIT_REDUCE_JOB原语是如何工作的呢?先看看此原语的参数:
- Function name
- Unique Id
- Reducer function name
- Unused
- data
在看看SUBMIT_JOB的参数:
- Function name
- Unique Id
- data
SUBMIT_REDUCE_JOB比SUBMIT_JOB多了两个参数,一个是Reducer function name,另一个是Unused。从字面上我们知道,Unused参数现在不用,保留以后扩展使用。因此,实质上,SUBMIT_REDUCE_JOB只比SUBMIT_JOB多一个参数Reducer function name,其他参数一样。实际上,SUBMIT_REDUCE_JOB中的参数Function name,UniqueId,data与SUBMIT_JOB原语中的Functionname, Unique Id, data参数意义完全一样。那么,SUBMIT_REDUCE_JOB中的Reducer function name参数是什么意思呢?
首先看看SUBMIT_REDUCE_JOB工作的Sequence图,读懂下面的Sequence图就完全理解SUBMIT_REDUCE_JOB的工作机理了(此Sequence图只画出了与SUBMIT_REDUCE_JOB紧密相关的部分,其他部分在此图中省略了)
1)worker向job server注册,告诉job server它有function name功能,可以处理function name的job
2)worker(reducer)向jobserver注册,告诉job server它可以处理功能为reducer function name的job
3)client向job server提交一个job,提交job的命令不再是SUBMIT_JOB,而是SUBMIT_REDUCE_JOB,SUBMIT_REDUCE_JOB包含如下参数:
§ function name
§ unique Id
§ reducer function name
§ data
4)job server返回一个JOB_CREATED命令,表示已经接受并将提交的job放到了内部queue中,此job在jobserver中由job handle唯一标示
5)worker向job server发送GRAB_JOB_ALL命令,而不是GRAB_JOB命令
6)job server返回JOB_ASSIGN_ALL命令给worker,此命令包含如下参数:
§ job handle
§ function name
§ unique id
§ reducer function name
§ data
如果在5)步worker向job server发送的命令不是GRAB_JOB_ALL,而是GRAB_JOB命令,job server就不会向worker返回JOB_ASSIGN_ALL命令,而是JOB_ASSIGN命令,JOB_ASSIGN命令中不会包含reducer function name参数。
7)worker处理收到的job数据
8)由于处理job中,产生了大量数据,必须要用WORK_DATA命令发送数据回client。
9)在正常的WORK_DATA处理流程中,WORK_DATA会先发送给job server,然后job server在将数据转发给相应的client。但是,由于worker收到的job中包含reducer function name,所以worker不会把命令WORK_DATA真发送给job server,而是利用SUBMIT_JOB命令向jobserver提交一个传统的job,SUBMIT_JOB命令包含如下参数:
§ Reducer function name
§ Unique id
§ data
10) Job server向worker返回一个jobhandle
11) Worker(reducer)向job server发送GRAB_JOB命令
12) Job server向worker(reducer)返回命令JOB_ASSIGN命令,JOB_ASSIGN命令包含如下参数:
§ Job handle
§ Reducer function name,此参数就是在3)步client向jobserver提交的job中的第三个参数reducer function name
§ Unique id
§ data
13) worker(reducer)处理收到的job
14) worker(reducer)处理完收到的job,向job server发送WORK_COMPLETE命令,WORK_COMPLETE命令包含如下参数:
§ job handle
§ data, job处理完后返回的数据
15) job server利用WORK_COMPLETE将处理结果转发给worker
16) worker收到结果后,对结果进行聚集Aggregate处理
17) 收到所有在9)步提交的job的结果并进行聚集Aggregate处理后,表示在6)接收到的job就处理完毕了,worker向jobserver发送WORK_COMPLETE命令
18) Job server向client转发收到的WORK_COMPLETE命令
本文详细介绍了Gearman协议中的SUBMIT_REDUCE_JOB原语及其如何简化Map/Reduce计算过程。通过新增的SUBMIT_REDUCE_JOB原语,用户可以更轻松地实现Map/Reduce计算任务,特别是与流行的数据处理框架相整合。该原语增加了Reducerfunctionname参数,使得任务分配和处理更加灵活。文章还提供了Sequence图来直观展示SUBMIT_REDUCE_JOB原语的工作流程,帮助读者深入理解其工作原理。
88

被折叠的 条评论
为什么被折叠?



