2011-12-19 3 views
4

私は、hadoopファイルシステムに保存されている行指向ファイルから補足情報にアクセスする必要のある、ハープ・ストリーミング・ジョブでCPythonを使用したいと考えています。 「補足」とは、このファイルがstdinを介して配信される情報に加えられていることを意味します。補足ファイルは十分に大きく、私はそれをメモリにスラップして行末の文字を解析することはできません。このファイルを一度に1行ずつ処理するための特にエレガントな方法(またはライブラリ)がありますか?CPython内からのhdfsファイルのデータを(stdinを使わずに)一度に処理する最も良い方法は?

おかげで、

のsetjmp

答えて

3

のHadoopストリーミングジョブでHadoop Distributed Cacheを使用するためのthis documentation for Streamingをチェックしてください。最初にファイルをhdfsにアップロードした後、ジョブを実行する前にHadoopにすべて複製するように指示すると、ジョブの作業ディレクトリにシンボリックリンクが置かれます。あなたはfor line in fなどでファイルを読むには、Pythonのopen()を使うことができます。

分散キャッシュは、ジョブをリソースとして利用するためにファイルを(すぐに)取り込む最も効率的な方法です。あなたのプロセスからhdfsファイルを開くだけではなく、各タスクがネットワークを介してファイルをストリーミングしようとするので...分散キャッシュでは、複数のタスクが同じノードで実行されていても1つのコピーがダウンロードされます。


最初に、ジョブを実行するときにコマンドライン引数に-files hdfs://NN:9000/user/sup.txt#sup.txtを追加します。その後

for line in open('sup.txt'): 
    # do stuff 
+0

ドキュメントへのリンクを変更し、私の答えを少し更新しました。私は古いバージョンのドキュメントを参照していました。今は最新の状態になっているはずです。 –

1

あなたはこのをお探しですか?

http://pydoop.sourceforge.net/docs/api_docs/hdfs_api.html#module-pydoop.hdfs

with pydoop.hdfs.open("supplementary", "r") as supplementary: 
    for line in supplementary: 
     # process line 
+0

は有望に見えます!私は今週、よく見ていきます。ありがとう。 – SetJmp

+0

注意してください。各マップタスクはネットワーク上でそのファイルをストリーミングします。分散キャッシュは、パフォーマンス面で優れています。これは間違いなく動作します。 –

+0

私はPydoopアプローチと分散キャッシュの両方で実験を成功させました。 Pydoopは、特定バージョンのBoost C++ライブラリとHadoopのバージョンに依存しています。このような理由から、私は2つのアプローチのうちのより良い方法として-filesを選択しました。 – SetJmp

関連する問題