可能我在这里想得很大声,但我如何在不同的计算机上运行一个简单的java程序(没有其他依赖项)(不需要并行处理),条件如下:
- 我有一组数据。假设数据在
.txt
文件中 - 我还有一个简单的java程序(见下文),它使用这些数据作为输入
- 现在我有10台电脑。让我们把它们称为节点
- 我必须在每个节点上运行java程序(节点彼此独立),并从每个节点获取输出并保存转换成另一个CCD_ 2。比方说
output.txt
。这可能就像减少了映射减少技术的一部分
这是我的想法:
- 将数据划分为小的
.txt
(s)。我已经做过了 - 通过将Java程序提取到
.jar
中,在每个节点上安装Java程序。已经完成了
现在我下一步要做什么才能实现它呢?我是并行处理和MPI的新手。只是需要一些指导。
感谢您的提前帮助:)
这里是Java程序:
import java.io.*;
public class CopyFile {
public static void main(String args[]) throws IOException {
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("input.txt");
out = new FileOutputStream("output.txt");
int c;
while ((c = in.read()) != -1) {
// want to do some computation. Let's say finding prime number
}
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}
你用"不需要并行处理"来反驳自己——你实际上把问题定义为令人尴尬的并行,这意味着节点之间不需要同步。
在完成您已经完成的部分(安装java、复制文件)之后,您只需要启动程序。有了10个节点,使用shell或python脚本可能会更快地访问每个节点,但随着节点数量的增加,它变得越来越复杂,这就是为什么你有Hadoop/YARN或MPI来处理这个问题。
例如,MPI中有一个主节点和N个从节点。主机会读取该文件,并将其逐行发送给从属机。完成后,它可以接收并连接来自从属服务器的答案,这与您想在output.txt.中写入的内容相同
如果你把它看作一个Map/Reduce作业,你又错了,因为这将是映射部分。Hadoop或Spark会将该文件作为输入在节点之间进行拆分,您可以像检查它一样检查每个输入。之后,您将发出有趣的行或一些其他数据。在大多数系统中,您可以跳过Reduce部分,这是您想要做的,只需要将映射的结果再次连接起来。