callx(dfx,...;h,s;x)

描述:

并行计算网格文件dfx,返回多任务结果集拼成的序列。

语法:

callx(dfx,…;h,s;x)

备注:

向分机进程序列h分配任务,并行执行脚本dfx为参数,序列长度表示作业数;缺省为等量作业型,作业数必须等于分机数,此时忽略sx,若作业数不等于分机数,则任务失败。

将第i个作业分配给第i个分机,启动分机计算;作业分配到不可用分机时,会被认定为非正常结束;作业非正常结束时,将分配给下一个分机重新计算,找不到可用分机则任务失败。

xreduce动作,无x时返回每个作业的结果构成的序列。有x时,以每个作业的结果为~,当前值为~~计算x,结果再置于~~,最后返回~~即分机的结果序列。

参数:

dfx

网格文件,dfx可设置为绝对路径或相对路径。相对路径为工具->选项->【环境】菜单下的寻址路径

x

reduce动作,可省略

传递给dfx的参数值。该参数格式一般为序列,需要给dfx传递几个参数,即有几个序列。在并行计算时,将按照该参数的序列长度将计算任务拆分为多个子任务,将序列的每一个成员,作为dfx的参数值传递到各自的子任务中。如果该参数是单值参数,则将单值自动复制到各个子任务中。

h

服务器序列,其中每个服务器的描述均为一个字符串,格式为"地址:端口号",如"192.168.0.86:4001"。缺省将不使用服务器,直接在当前进程中,分配多个线程执行计算。

s

数列构成的序列

选项:

@a

随机分配型,忽略sx,不考虑算力;如果被分配的分机无效或返回错误,则更换分配。

@l

少量作业型,作业数小于分机数,忽略sx根据算力随机分配作业,启动分机计算。

@m

大量作业型,作业数大于分机数;找出计算力最大的分机(可能有多个),随机选择分配作业,重复此过程,直到剩余作业数小于某个阈值。

启动分机计算,分机完成已分配的作业后,再向主机索要剩余可执行作业,直到作业全部完成。任何作业失败则任务失败。

有分机不可用(h成员为null)则不参与分配;

s为数列时,第i个作业将依赖于s(i)分区,分配时要将作业i分配到有s(i)分区的分机上;

s表示可以随意分配,即任何作业可分到任何可用分机;

x时返回作业结果序列;有x时在每个分机进行相应reduce动作后,返回分机的结果序列,此时不可用分机也将在结果序列中占位。

 

示例:

test.dfx为远程节点机服务器的部署文件,节点机分别为【”192.168.0.204”,” 192.168.0.205”,” 192.168.0.206”,端口号为8081,文件内容如下:

(一)  单个参数

 

A

B

1

=connect("demo").query("select * from SCORES  where SUBJECT=?",arg1)

2

return A1

return A1.(SCORE)

 

 

A

 

1

=callx("test.dfx",["English","Math","PE"];["192.168.0.204:8081","192.168.0.205:8081","192.168.0.206:8081"])

参数和服务器列表个数相同,严格依次分配

2

=callx@a("test.dfx",["English","Math","PE"];["192.168.0.204:8081","192.168.0.205:8081"])

随机分配型,随机分配参数到各分机

3

=callx@l("test.dfx",["English"];["192.168.0.204:8081","192.168.0.205:8081"])

少量作业型,按照算力将作业分配到分机

4

=callx@m("test.dfx",["English","Math","PE","Chinese"];["192.168.0.204:8081","192.168.0.205:8081","192.168.0.206:8081"])

大量作业型,随机分配参数到各分机,此时192.168.0.204:8081分机不可用,则不参与分配

(二)  多个参数

 

A

 

1

=connect("demo")

 

 

2

=A1.query("select * from EMPLOYEE where EID in (?) and GENDER=?",arg1,arg2)

 

 

3

=A1.close()

 

 

4

return A2

 

 

 

 

A

 

1

=callx("test.dfx",[[1,20,6,14,5]],"F";"192.168.0.204:8081")

向一台节点机传递2个参数,参数类型为字符串和序列

2

=callx("test.dfx",[[1,20,6,14,5],[22,33,44]],"F";["192.168.0.204:8081","192.168.0.205:8081"])

向多台节点机传递多个参数,当接收的同一参数值相同时可用单值形式传递

3

=callx("test.dfx",[[1,20,6,14,5],[22,33,44]],["F","M"];["192.168.0.204:8081","192.168.0.205:8081"])

多个节点机接收到的同一参数值不同时需以序列形式传递

4

=callx@l("test.dfx",[[1,20,6,14,5]],"M";["192.168.0.204:8081","192.168.0.205:8081"])

少量作业型,随机分配参数到各分机

5

=callx@m("test.dfx",[[1,20,6,14,5],[5,89,100],[58,62,99]],"M";["192.168.0.204:8081","192.168.0.205:8081"])

大量作业型,随机分配参数到各分机,两节点机中都存在分区1/2/3,第一个作业分配给192.168.0.204:8081的分区1,第二个作业分配给192.168.0.205:8081的分区2,第三个作业分配给192.168.0.204:8081的分区3