CPython内からのhdfsファイルのデータを(stdinを使わずに)一度に処理する最も良い方法は?

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

ありがとう、

SetJmp

4

2 答え

こちらのドキュメントをご覧ください > Hadoop StreamingジョブのHadoop分散キャッシュを参照してください。最初にファイルをhdfsにアップロードした後、ジョブを実行する前にHadoopにすべて複製するように指示すると、ジョブの作業ディレクトリにシンボリックリンクが置かれます。そうすれば、Pythonの open()を使って、 in行などのファイルを読むことができます。

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


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

次に:

for line in open('sup.txt'):
    # do stuff
3
追加された
私はドキュメントへのリンクを変更し、私の答えを少し更新したことに注意してください。私は古いバージョンのドキュメントを参照していました。今は最新の状態になっているはずです。
追加された 著者 Donald Miner,

これをお探しですか?

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
1
追加された
期待しているようだ!私は今週、よく見ていきます。ありがとう。
追加された 著者 SetJmp,
私は、Pydoopアプローチと分散キャッシュの両方で実験を成功させました。 Pydoopは、特定バージョンのBoost C ++ライブラリとHadoopのバージョンに依存しています。このような理由から、私は2つのアプローチのうちのより良い方法として-filesを選択しました。
追加された 著者 SetJmp,
注意してください。各マップタスクはネットワーク上でそのファイルをストリーミングします。分散キャッシュは、パフォーマンス面で優れています。これは間違いなく動作します。
追加された 著者 Donald Miner,