2011-04-22 47 views
0

我有一个Java应用程序,我将其作为概念证明移植到云体系结构中。我想通过在单独的虚拟机上的文件块上运行相同的处理程序来处理非常大的文本文件。许多虚拟机读取并发文本文件

工作节点= N

头节点上运行主机和一个工人,n-1个工作节点

我心里有两个想法:

  1. 主机读取文件中的行,由-line,将第一行发送到第一个工作节点,第二行到第二个工作节点等,每n行重复一次。

  2. 主读取文件中的行数。然后工作者节点指示从文件中同时读取no_of_lines/n。

我正在考虑使用基于RMI或基于套接字的方法来传输数据。谁能告诉我哪种上述方法最有效率?如果这个问题不能在没有指定我将使用哪个java结构的情况下得到解答,那么我会很感激这些建议。

另外,如果每个节点都知道它应该读取哪些行,那么锁定会是并发文件访问的问题吗?

感谢您的任何建议

伊恩

回答

2

先来的第二个问题,从来就没有在许多程序读取一个文件IFF没有任何程序问题写入文件:每个程序都有自己的文件 - 位置指针。即使某些程序正在写入文件,如果该程序始终写入文件的末尾,在任何一个合理的系统中,始终都是这样,那么可能没有任何问题。

至于第一个问题,IFF文件中的所有行都是恒定长度的,那么问题总是效率问题之一:读取多行比读取一行更有效。

如果我在做这个项目,主人会要求工作人员阅读(n_lines_in_file/n_workers)行。在我看来,主人的读物中没有多少意义,并将它们传递给工人。不过,假设每行都采用与其他工作相同数量的工作进程。

如果那不是真的,或者如果有其他变量你没有告诉,我的策略无疑会改变。

+0

感谢皮特,输入将是一个数百兆字节的文本文件,可能为兆兆字节。我将从一台机器上的单个文件开始,但我还需要探索可首先以分布式方式创建数据集的选项。我现在正在查看SRB,我可能会编写一个程序,它可以从单个文件输入,也可以从分布式文件存储中读取。有什么想法吗?欢呼声 PS。相同的查询将在每行上运行,并且长度不完全相同,但包含相同的字段 – bashcrufter 2011-04-23 12:22:49

1

当你分解一个程序时,你应该确保你没有创建比你想要保存更多的开销。例如,与进行RMI调用相比,阅读几行文本相对便宜。将数据复制到许多主机可能比您打算执行的处理更昂贵。

处理需要多长时间?这将指导您确定每项工​​作的有效程度。您可能会发现线程的最佳数量是一个。 ;)

+0

您好Peter,因为文件大小为100s MB - > TB。您认为使用RMI调用会在使用它们向VM发送大量数据时产生大量开销吗?当数据太大时,瓶颈似乎是I/O,因此我在考虑SRB/iRODS。干杯 – bashcrufter 2011-04-23 12:26:50

+0

你是正确的,IO可能是一个问题。这意味着您需要一种尽可能高效地分发数据并尽可能少复制的解决方案。例如你可以有一个RMI调用来发送文件名和文件的区域来读取,而不是实际的数据。 (假设所有serverc都访问数据)RMI调用并不是免费的,但如果你保持调用的数量低,我怀疑它们不会有太大的影响。 – 2011-04-23 16:05:51