1

次のコマンドを実行したい:

 hadoop fs -copyToLocal FILE_IN_HDFS | ssh REMOTE_HOST "dd of=TARGET_FILE"

ただし、試してみると、リモートの場所にコピーするのではなく、ターゲットホストに空のファイルを作成し、ローカルのホームドライブにコピーするだけです。

$ hadoop fs -copyToLocal FILE_IN_HDFS | ssh REMOTE_HOST "dd of = test.jar"

0+0Datensätzeein

0+0Datensätzeaus

0バイト(0 B)kopiert、1,10011 s、0,0 kB / s

このコマンドがこのように動作する理由は考えられません。これは私がここで見逃しているJava主義ですか、それとも実際に間違っていますか?

4

2 に答える 2

2

この-copyToLocalオプションでは、HDFS内のファイルとローカルパスの2つの引数が必要です。これがローカルドライブにどのようにコピーできるかさえわかりません。このコマンドは失敗します。

しかし、実際の問題は異なると思います。このオプションは、コマンド-copyToLocalにパイプできるstdoutには何も出力しません。sshここでは、基本的に空のストリームをにパイプしているddので、作成するものはありません。

私はうまくいくように見える次のコマンドを実行します:

hadoop fs -cat $FILE_IN_HDFS | ssh $REMOTE_HOST "dd of=$TARGET_FILE"

このように、ファイルのコンテンツであるストリームをパイプ処理し、それを。が指すファイルにコピーします$TARGET_FILE。私の箱でテストしました、そしてこれはうまくいきます。

これにより、ファイルをローカルにコピーしてから、ファイルをリモートボックスにコピーする必要がなくなり、すべてがストリーミングされます。これは、あなたが探しているものだと思います。

于 2013-02-18T17:19:30.207 に答える
0

これは、最初にcopyToLocal、次にscpの2つのステップで実行できます。また、中間ローカルファイルを削除する必要があります。

hadoop fs -copyToLocal $FILE_IN_HDFS $LOCAL_FILE
scp $LOCAL_FILE $REMOTE_HOST:$TARGET_FILE && rm $LOCAL_FILE
于 2013-02-19T00:17:33.490 に答える