2012-08-29 25 views
12

ファイルをHDFSからネットワークにあるhadoopクラスタにはない別のサーバのローカルファイルシステムに転送します。私が行っている可能性がファイルをHDFSから転送する

hadoop fs -copyToLocal <src> <dest> 
and then scp/ftp <toMyFileServer>. 

をデータはHadoopのゲートウェイ・マシンのローカルファイルシステム上の限られたスペースに巨大な原因であるとして、私はこれを避けたかったし、私のファイルサーバに直接データを送りました。

この問題を処理する方法については、いくつかの参考にしてください。

+1

あなたのファイルサーバはあなたのnamenodeに直接接続できますか? –

+0

いいえ、今のところは接続しません。しかし、私はあなたの提案を知りたいです。 – dipeshtech

+0

あなたのnamenodeへのシンプルなSSHトンネルを行い、ファイルサーバーから接続しますか? –

答えて

2

だから、あなたはおそらくあなたのHadoopプログラムからの出力として、部品の束を持つファイルを持っています。

part-r-00000 
part-r-00001 
part-r-00002 
part-r-00003 
part-r-00004 

ですので、一度に1つのパートを行いますか?

ssh <YOUR_HADOOP_GATEWAY> "hdfs dfs -cat <src_in_HDFS> " > <local_dst> 

それはあまりにもバイナリファイルのために働く:

for i in `seq 0 4`; 
do 
hadoop fs -copyToLocal output/part-r-0000$i ./ 
scp ./part-r-0000$i [email protected]:/home/you/ 
rm ./part-r-0000$i 
done 

あなたはSCP

2

ローカルファイルサーバーのディレクトリをローカルにシミュレートするためのネットワークマウントまたはSSHFSが最も簡単なソリューションと考えています。
また、ローカルディレクトリとしてFTPをマウントすることができます http://www.linuxnix.com/2011/03/mount-ftp-server-linux.html

+0

解決のためDavidに感謝します!しかし、どういうわけかクロス環境マウントはここでは利用できません。私はdjc391が今提案している回避策と一緒に行きます。 – dipeshtech

+0

あなたは巨大なデータについて言及しました。そのため、データをローカルに格納することを完全に避ける方法を探しました。クロス環境マウントの意味は? –

9

のパスワード修飾子を検索しなければならないことがありますが、これはそれを行うための最も簡単な方法です。

+0

再帰的に行うことはできますか?ファイルとディレクトリをコピーするには? – coloboxp

1

これを行うにはwebHDFS REST APIを使用できます。ファイルをダウンロードするマシンからcurlを実行します。

curl -i -L "http://namenode:50075/webhdfs/v1/path_of_the_file?op=OPEN" -o ~/destination 

別のアプローチは、これを行うにはwgetを通じてDataNode APIを使用することができます

wget http://$datanode:50075/streamFile/path_of_the_file 

しかし、最も便利な方法、私見、名前ノードのWebUIを使用することです。このマシンはネットワークの一部であるため、WebブラウザでNameNode_Machine:50070を指すことができます。その後、HDFSを参照し、ダウンロードするファイルを開き、Download this fileをクリックします。

0

私もこれをやろうとしていました(私はKerberosセキュリティを使用していました)。これは小規模な更新後に私を助けた:curl -L -i --negotiate "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=OPEN"は私のために働かなかった、私は理由を説明します:https://hadoop.apache.org/docs/r1.0.4/webhdfs.html#OPEN

すぐに実行します。 HTTP 200 OKを返す - - 彼はデータをダウンロードします。このリンクから307 Temporary Redirect

  • を返す

    1. あなたは一時的なリンクをダウンロードし、作成したいファイルを見つける:

      このコマンドは、2つのステップを行います。

    スイッチャー-Lはファイルを受け取り、直接ソーイングを続けると言っています。 curlコマンド-vに追加すると、出力に記録されます。もしそうなら、私が言ったように、コマンドラインに2つのステップが記述されています。しかし、古いバージョンのカール(私はうっかりできません)のために動作しません。 (シェルの)THIS FOR

    SOLUTION:

    LOCATION=`curl -i --negotiate -u : "${FILE_PATH_FOR_DOWNLOAD}?op=OPEN" | /usr/bin/perl -n -e '/^Location: (.*)$/ && print "$1\n"'` 
    

    これは一時的なリンクを取得し、$LOCATION変数に保存します。

    RESULT=`curl -v -L --negotiate -u : "${LOCATION}" -o ${LOCAL_FILE_PATH_FOR_DOWNLOAD}` 
    

    そして、あなたは-o <file-path>を追加する場合、これは、ローカルのファイルに保存します。

    私はそれが助けてくれることを願っています。

    J.

  • 関連する問題