Java Linux分发大文件并收集结果

Java Linux分发大文件并收集结果,java,python,shell,distribute,Java,Python,Shell,Distribute,(不要建议使用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

(不要建议使用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 
我要做的可能是将输入文件scp到每个节点,进行解析,然后scp返回结果,但是有10多个节点!我认为手工操作太乏味了

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

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

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

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

例如:

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
sshyourUserName@node1“python parser.py”输出文件节点1

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

通过远程管道到标准输出远程执行命令。然后将本地命令管道到本地文件

例如:

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
sshyourUserName@node1“python parser.py”输出文件节点1

这假定您的用户名已配置为基于密钥的身份验证。否则,您将需要手动输入密码(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;

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

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

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


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

您为什么要构建自己的分布式计算系统?您不希望我们建议的选项有什么问题?如果不知道为什么不合适,我们将丢失重要信息。将其放在NFS驱动器上?@user2357112群集i这是一个企业集群,我没有根在上面安装新结构。例如,我不太确定什么是NFS,但我们确实在每个节点上都有一个文件夹/共享,并且同步了相同的内容。现在我发现我可以轻松分发输入文件,但我如何轻松地让所有节点运行该命令?注意:您不需要您可以重定向stdin:
python parser.pyoutput\u file\u aa
。节省了一点开销。@user2357112 cat xx | python..和python..cat将输入重定向到您的程序。您只需重定向stdin:
python parser.pyoutput\u file\u aa
。节省了一点时间head@user2357112 cat xx | python..和python..expr 1+1”,而不需要重定向(2应该会回来)。您也可以尝试使用较短版本的文件(可以很快恢复)