0

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

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

在使用标准 I/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 脚本放在那里,所以剩下的就是如何轻松登录到这些节点并执行命令。顺便说一句,我在红帽。

4

2 回答 2

2

使用远程管道远程执行命令到标准输出。然后将本地命令管道连接到本地文件。

例子:

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

于 2013-08-21T22:10:04.913 回答
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 可以更轻松地解决这个特殊的用例。

于 2013-08-21T22:11:05.293 回答