1

大きなmboxファイルがあり、mstorなどのサードパーティAPIを使用して、hadoopを使用してmboxファイルからメッセージを解析しています。それらのファイルをhdfsにアップロードしました。ただし、問題は、このAPIが以下に示すようにローカルファイルシステムパスのみを使用することです。

MessageStoreApi store = new MessageStoreApi(“file location in locl file system”);

このAPIには、ストリームから初期化するコンストラクターが見つかりませんでした。そのため、hdfsストリームを読み取って初期化することができません。

今私の質問は、hdfsからローカルファイルシステムにファイルをコピーし、ローカル一時フォルダから初期化する必要がありますか?それが私が今していることです:

現在、マイマップ関数はmboxファイルのパスを受け取ります。

Map(key=path_of_mbox_file in_hdfs, value=null){

String local_temp_file = CopyToLocalFile(path in hdfs);
MessageStoreApi store = new MessageStoreApi(“local_temp_file”);
//process file

}

または他の解決策はありますか?1つのファイルが1つのブロックに収まるようにブロックサイズを大きくした場合、およびマップ関数でそれらのブロックの場所を取得できる場合は、ほとんどの場合、マップ関数はそれらと同じノードで実行されるため、次のような解決策を期待しています。ブロックが保存されている場合、ローカルファイルシステムに常にダウンロードする必要がない場合がありますか?しかし、それが常に機能するかどうかはわかりません:)

提案、コメントは大歓迎です!

4

1 に答える 1

2

ローカルファイルシステムのパスのようなアクセスのために、HDFSは2つのオプションを提供します:HDFS NFS(NFSv3マウント経由)とFUSEマウントHDFS。

前者はApacheHadoopドキュメントに記載されています(CDHユーザーは代わりにこれに従うことができます)

後者はApacheHadoopwikiに文書化されています(CDHユーザーは代わりに関連するドキュメントをここで見つけることができます)

現在、NFS機能はFUSEオプションよりもアップストリームで維持されています。

于 2013-02-17T08:22:53.077 に答える