web-dev-qa-db-ja.com

HDFSからファイルを転送する

HDFSから、Hadoopクラスターではなくネットワーク内にある別のサーバーのローカルファイルシステムにファイルを転送したいと考えています。

私はできたでしょう:

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

データは巨大で、hadoopゲートウェイマシンのローカルファイルシステムのスペースが限られているため、これを避けてデータを直接ファイルサーバーに送信しました。

この問題の処理方法について、いくつかの指針を示してください。

17
dipeshtech

したがって、おそらく、Hadoopプログラムからの出力として、一連のパーツを含むファイルがあるはずです。

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

では、一度に1つのパートを実行してみましょう。

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

Scpのパスワード修飾子を検索する必要がある場合があります

これが最も簡単な方法です。

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

バイナリファイルでも動作します。

13
cabad

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

2
David Gruzman

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

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

別のアプローチは、これを行うためにDataNode APIからwgetを使用することです。

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

しかし、最も便利な方法であるIMHOは、NameNOde webUIを使用することです。このマシンはネットワークの一部であるため、WebブラウザでNameNode_Machine:50070を指定するだけで済みます。その後、HDFSを参照して、ダウンロードするファイルを開き、Download this fileをクリックします。

2
Tariq

私もこれをやろうとしていました(私はKerberosセキュリティを使用していました)。これは小さな更新後に私を助けました: https://hadoop.Apache.org/docs/r1.0.4/webhdfs.html#OPEN

直接実行curl -L -i --negotiate "http://<Host>:<PORT>/webhdfs/v1/<PATH>?op=OPEN"は機能しませんでした。理由を説明します。

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

  1. ダウンロードするファイルを見つけて一時リンクを作成します-307 Temporary Redirectを返します

  2. このリンクからデータをダウンロードします-HTTP 200 OKを返します。

スイッチャー-Lは、ファイルを取り、直接切断を続けると言っています。 curlコマンド-vに追加すると、出力に記録されます。もしそうなら、私が言ったように、コマンドラインで説明されている2つのステップが表示されます。しかし-古いバージョンのcurl(更新できない)のため、機能しません。

このためのソリューション(シェル):

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.

1
juditth