Linux分发大文件并收集结果



(不要建议Hadoop或map reduce解决方案,即使它们在逻辑上听起来相同)

我有一个大文件——70GB的原始html文件,我需要进行解析以获得我需要的信息。

在使用标准I/O:之前,我已经成功地与10GB文件进行了delt

cat input_file | python parse.py > output_file

在我的python脚本中,它从标准输入读取每个html(每行读取一个html),并将结果写回标准输出。

from bs4 import BeautifulSoup
import sys
for line in sys.stdin:
    print ....

代码非常简单,但现在,我正在处理一个大文件,它在一个节点上非常慢。我有一个大约20个节点的集群。我想知道我怎样才能轻松地分发这件作品。

到目前为止我所做的:

split -l 5000 input_file.all input_file_   # I have 60K lines in total in that 70G file

现在,大文件已被拆分为几个小文件:

input_file_aa
input_file_ab
input_file_ac
...

那么我与他们中的每一个合作都没有问题:

cat input_file_aa | python parser.py > output_file_aa 

我要做的可能是将input_file scp到每个节点并进行解析,然后将结果scp回来,但有10多个节点!手动做那件事太乏味了。

我想知道如何轻松地将这些文件分发到其他节点,并进行解析并将结果移回?

我对基本的SHELL、JAVA、Python解决方案持开放态度。提前非常感谢,如果你需要更多的解释,请告诉我。

注意,我确实有一个名为/bigShare/的文件夹,它可以在每个节点上进行评估,并且内容是同步的并保持不变。我不知道架构师是如何实现的(NFS..?我不知道如何检查),但我可以把我的input_file和python脚本放在那里,所以剩下的就是如何轻松登录到这些节点并执行命令。顺便说一句,我戴着红帽子。

使用到stdout的远程管道远程执行命令。然后使本地命令管道连接到本地文件。

示例:

ssh yourUserName@node1 "cat input_file_node1 | python parser.py" >output_file_node1

如果文件尚未复制到不同的节点,则:

ssh yourUserName@node1 "python parser.py" <input_file_node1 >output_file_node1

这假设您的用户名已经配置了基于密钥的身份验证。否则,您将需要手动输入密码(20次!:-()。为了避免这种情况,您可以使用expect,但我强烈建议您设置基于密钥的身份验证。您也可以稍后使用expect执行此操作。

假设您想在自己的主机上处理每个文件的一部分:首先将python脚本复制到远程主机。然后在远程主机上循环:

for x in aa ab ac ...; do
   ssh user@remote-$x python yourscript.py <input_file_$x >output_file_$x &
done;

如果处理节点没有易于生成的名称,您可以在.ssh/config中为它们创建别名,例如:

Host remote-aa
    Hostname alpha.int.youcompany
Host remote-ab
    Hostname beta.int.yourcompany
Host remote-ac
    Hostname gamma.int.yourcompany

不过,这个特定的用例可以通过编辑/etc/hosts更容易地解决。

相关内容

  • 没有找到相关文章

最新更新