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) 对于其他情况:
返回一个字典。键是节点别名,值是函数的返回内容。