如何并行执行群集中的Unix shell命令(例如awk one liner)(步骤1)并将结果收集回中心节点(步骤2)?
更新:我刚刚找到http://blog.last.fm/2009/04/06/mapreduce-bash-script 它似乎完全符合我的需要。
答案 0 :(得分:2)
如果您要做的就是触发一堆远程命令,您可以使用perl。您可以“打开”ssh命令并将结果传回perl。 (您当然需要设置密钥以允许无密码访问)
open (REMOTE, "ssh user@hostB \"myScript\"|");
while (<REMOTE>)
{
print $_;
}
您希望使用您的机器名称制作一个循环,并为每个机器名称启动一个循环。之后,只需对文件句柄进行非阻塞读取,即可在数据可用时撤回数据。
答案 1 :(得分:1)
parallel可以安装在您的中央节点上,可用于跨多台计算机运行命令。
在下面的示例中,多个ssh连接用于在远程主机上运行命令。 (-j是在中心节点上同时运行的作业数)。然后可以将结果传送到命令以执行“减少”阶段。 (在本例中排序然后是uniq。)
parallel -j 50 ssh {}“ls”::: host1 host2 hostn |排序| uniq -c
此示例假定已在中央节点与群集中的所有计算机之间设置“无密钥ssh登录”。
在远程运行更复杂的“ls”命令时,正确转义字符可能很棘手,有时你必须逃避转义字符。你提到bashreduce,它可以简化这一点。