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 ....

コードは非常に単純ですが、現在、1 つのノードで非常に遅い大きなファイルを扱っています。約 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以上のノードがあります! 私はそれを手動で行うのはとても面倒です。

これらのファイルを他のノードに簡単に配布し、解析して結果を元に戻すにはどうすればよいでしょうか?

私は基本的なシェル、JAVA、Python ソリューションを受け入れています。事前に感謝します。さらに説明が必要な場合はお知らせください。

すべてのノードで評価できる /bigShare/ というフォルダーがあり、コンテンツは同期され、同じままであることに注意してください。アーキテクトがそれをどのように実装したかはわかりませんが (NFS ..? 確認方法がわかりません)、input_file と python スクリプトをそこに置くことができたので、残りはそれらのノードに簡単にログインしてコマンドを実行する方法です。ところで、私は Red Hat を使用しています。

4

2 に答える 2

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

于 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 に答える