(不要建议Hadoop或地图减少解决方案,即使它们听起来在逻辑上相同)
我有一个大文件 - 70GB的原始html文件,我需要进行解析以获取我需要的信息。
在使用standardI / O之前,我已成功使用10GB文件:
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脚本放在那里,其余的是如何轻松登录这些节点和执行命令。 顺便说一句,我是Red Hat。
答案 0 :(得分:2)
使用远程管道远程执行命令到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
这假定已使用基于密钥的身份验证配置yourUserName。否则,您需要手动输入密码(20次!:-()。为避免这种情况,您可以使用expect
,但我强烈建议您设置基于密钥的身份验证。您可以在以后使用expect
也是。
答案 1 :(得分:2)
假设您想要在自己的主机上处理每个文件的一部分:首先将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可以更容易地解决这个特殊用例。