pnodeRun
语法
pnodeRun(function, [nodes], [addNodeAlias=true])
参数
function 调用的本地函数(不能使用引号)。它可以是一个没有定义参数的函数,或者是没有参数的封装了初始函数和参数的部分应用。它可以是内置函数或用户自定义函数。
nodes 节点的别名。如果没有指定,系统会调用集群中所有活数据节点/计算节点。
addNodeAlias 是否在结果中加入节点的别名,默认值是true。如果返回的结果已经包含节点的别名,可设置为false。
详情
在集群所有数据节点/计算节点上并行调用本地函数,然后合并结果。
例子
例1. 函数 getChunksMeta 不指定参数。
$ pnodeRun(getChunksMeta,,false);
site |
chunkId |
path |
dfsPath |
type |
flag |
size |
version |
state |
versionList |
---|---|---|---|---|---|---|---|---|---|
local8848 |
bd13090e-7177-01a7-4ac4-840e1b977dcf |
D:130DolphinDB_Win64_Vserverlocal8848storage/CHUNKS/compo/20190605/GOOG |
/compo/20190605/GOOG |
1 |
0 |
0 |
1 |
0 |
cid : 40,pt2=>40:6729; # |
local8848 |
b4935730-6372-b2a1-4f24-6c323037e576 |
e:data/CHUNKS/compo/20190605/AAPL |
/compo/20190605/AAPL |
1 |
0 |
0 |
1 |
0 |
cid : 40,pt2=>40:6613; # |
local8848 |
f8ee72c9-dad3-f49e-430e-5ddb3c61ae18 |
D:130DolphinDB_Win64_Vserverlocal8848storage/CHUNKS/compo/20190604/MSFT |
/compo/20190604/MSFT |
1 |
0 |
0 |
1 |
0 |
cid : 40,pt2=>40:6664; # |
local8848 |
08e26b5a-dfac-799f-4979-0dd3902eae6e |
D:130DolphinDB_Win64_Vserverlocal8848storage/CHUNKS/compo/20190604/GOOG |
/compo/20190604/GOOG |
1 |
0 |
0 |
1 |
0 |
cid : 40,pt2=>40:6635; # |
local8848 |
f9e53a3d-af3e-018d-4bfa-a2b4980f3561 |
D:130DolphinDB_Win64_Vserverlocal8848storage/CHUNKS/compo/20190604/AAPL |
/compo/20190604/AAPL |
1 |
0 |
0 |
1 |
0 |
cid : 40,pt2=>40:6783; # |
local8848 |
417e49e9-5c61-cf9e-4b21-4b35f8e57273 |
D:130DolphinDB_Win64_Vserverlocal8848storage/CHUNKS/compo/20190601/MSFT |
/compo/20190601/MSFT |
1 |
0 |
0 |
1 |
0 |
cid : 40,pt2=>40:6602; # |
local8848 |
3ee64942-1d72-bea7-4bc1-f720132d9288 |
D:130DolphinDB_Win64_Vserverlocal8848storage/CHUNKS/compo/20190602/AAPL |
/compo/20190602/AAPL |
1 |
0 |
0 |
1 |
0 |
cid : 40,pt2=>40:6749; # |
例2. 在下例中,函数 sum 和参数1..10被封装成了部分应用 sum{1..10}。
$ pnodeRun(sum{1..10}, `nodeA`nodeB);
Node |
Value |
---|---|
DFS_NODE2 |
55 |
DFS_NODE3 |
55 |
例3. pnodeRun 对于集群管理非常方便。例如,在一个集群中有4个节点:”DFS_NODE1”, “DFS_NODE2”, “DFS_NODE3” 和 “DFS_NODE4”。在每个节点上执行以下脚本:
def jobDemo(n){
s = 0
for (x in 1 : n) {
s += sum(sin rand(1.0, 100000000)-0.5)
print("iteration " + x + " " + s)
}
return s
};
submitJob("jobDemo1","job demo", jobDemo, 10);
submitJob("jobDemo2","job demo", jobDemo, 10);
submitJob("jobDemo3","job demo", jobDemo, 10);
查看集群中每个节点最近完成的两个批处理作业的状态:
$ pnodeRun(getRecentJobs{2});
Node |
UserID |
JobID |
JobDesc |
ReceivedTime |
StartTime |
EndTime |
ErrorMsg |
---|---|---|---|---|---|---|---|
DFS_NODE1 |
root |
jobDemo2 |
job demo |
2017.11.16T13:04:38.841 |
2017.11.16T13:04:38.841 |
2017.11.16T13:04:51.660 |
|
DFS_NODE1 |
root |
jobDemo3 |
job demo |
2017.11.16T13:04:38.841 |
2017.11.16T13:04:38.843 |
2017.11.16T13:04:51.447 |
|
DFS_NODE2 |
root |
jobDemo2 |
job demo |
2017.11.16T13:04:56.431 |
2017.11.16T13:04:56.432 |
2017.11.16T13:05:11.992 |
|
DFS_NODE2 |
root |
jobDemo3 |
job demo |
2017.11.16T13:04:56.432 |
2017.11.16T13:04:56.434 |
2017.11.16T13:05:11.670 |
|
DFS_NODE3 |
root |
jobDemo2 |
job demo |
2017.11.16T13:05:08.418 |
2017.11.16T13:05:08.419 |
2017.11.16T13:05:29.176 |
|
DFS_NODE3 |
root |
jobDemo3 |
job demo |
2017.11.16T13:05:08.419 |
2017.11.16T13:05:08.421 |
2017.11.16T13:05:29.435 |
|
DFS_NODE4 |
root |
jobDemo2 |
job demo |
2017.11.16T13:05:16.324 |
2017.11.16T13:05:16.325 |
2017.11.16T13:05:34.729 |
|
DFS_NODE4 |
root |
jobDemo3 |
job demo |
2017.11.16T13:05:16.325 |
2017.11.16T13:05:16.328 |
2017.11.16T13:05:34.716 |
$ pnodeRun(getRecentJobs{2}, `DFS_NODE3`DFS_NODE4);
Node |
UserID |
JobID |
JobDesc |
ReceivedTime |
StartTime |
EndTime |
ErrorMsg |
---|---|---|---|---|---|---|---|
DFS_NODE3 |
root |
jobDemo2 |
job demo |
2017.11.16T13:05:08.418 |
2017.11.16T13:05:08.419 |
2017.11.16T13:05:29.176 |
|
DFS_NODE3 |
root |
jobDemo3 |
job demo |
2017.11.16T13:05:08.419 |
2017.11.16T13:05:08.421 |
2017.11.16T13:05:29.435 |
|
DFS_NODE4 |
root |
jobDemo2 |
job demo |
2017.11.16T13:05:16.324 |
2017.11.16T13:05:16.325 |
2017.11.16T13:05:34.729 |
|
DFS_NODE4 |
root |
jobDemo3 |
job demo |
2017.11.16T13:05:16.325 |
2017.11.16T13:05:16.328 |
2017.11.16T13:05:34.716 |
pnodeRun 合并多个节点的结果时遵循以下规则:
(1) 如果 function 返回一个标量:
返回一个表,它具有两列:节点别名和函数结果。
紧接上面的例子:
$ pnodeRun(getJobReturn{`jobDemo1});
Node |
Value |
---|---|
DFS_NODE3 |
2,123.5508 |
DFS_NODE2 |
(42,883.5404) |
DFS_NODE1 |
3,337.4107 |
DFS_NODE4 |
(2,267.3681) |
(2) 如果 function 返回一个向量:
返回一个矩阵。矩阵中的每一列是函数在节点上返回的结果。矩阵的列标签是节点。
(3) 如果 function 返回键-值形式的字典:
返回一个表,每行代表函数在一个节点上的结果。
(4) 如果 function 返回一个表:
返回一个表,它是多个节点上的表的合并。
(5) 如果 function 是一个命令(该命令不返回任何内容):
不返回任何内容。
(6) 对于其他情况:
返回一个字典。键是节点别名,值是函数的返回内容。