-put
と-copyFromLocal
は同じものとして文書化されていますが、ほとんどの例では冗長コピー-copyFromLocalを使用しています。どうして?
-get
と-copyToLocal
についても同じこと
したがって、基本的には、putで実行できます。copyFromLocalで実行できますが、その逆はできません。
同様に、
したがって、copyToLocalの代わりにgetを使用できますが、その逆はできません。
リファレンス: Hadoopのドキュメント .
更新:2015年10月現在の最新情報については、下記の this 回答をご覧ください。
例を見てみましょう:HDFSにパスが含まれている場合:/tmp/dir/abc.txt
そしてローカルディスクにもこのパスが含まれている場合、file://
のようなスキームを指定しない限り、hdfs APIはどちらを意味するかを知りませんまたはhdfs://
。たぶん、コピーしたくないパスを選ぶでしょう。
したがって、-copyFromLocal
があり、ローカルファイルシステムに指定するパラメーターを制限することにより、誤って間違ったファイルをコピーすることを防ぎます。
Put
は、どのスキームを前面に置くかを知っている、より上級のユーザー向けです。
新しいHadoopユーザーにとって、現在どのファイルシステムにいて、ファイルが実際にどこにあるかは、常に少し混乱します。
ドキュメントで主張されていることにもかかわらず、現在(2015年10月)、両方-copyFromLocal
および-put
同じだ。
オンラインヘルプから:
[cloudera@quickstart ~]$ hdfs dfs -help copyFromLocal
-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst> :
Identical to the -put command.
そして、これは sourcesを見る によって確認されます。ここでは、CopyFromLocalクラスがPutクラスを拡張していることを確認できますが、新しい動作は追加しません。
public static class CopyFromLocal extends Put {
public static final String NAME = "copyFromLocal";
public static final String USAGE = Put.USAGE;
public static final String DESCRIPTION = "Identical to the -put command.";
}
public static class CopyToLocal extends Get {
public static final String NAME = "copyToLocal";
public static final String USAGE = Get.USAGE;
public static final String DESCRIPTION = "Identical to the -get command.";
}
お気づきかもしれませんが、これはget
/copyToLocal
でもまったく同じです。
copyFromLocal
はローカルからのコピーに制限されていますが、put
は他の(他のhdfs/local filesystem/..)からファイルを取得できます。「put」コマンドと「copyFromLocal」コマンドはまったく同じように機能します。 「put」コマンドを使用して、1つのhdfsディレクトリから別のディレクトリにファイルをコピーすることはできません。例でこれを見てみましょう。ルートに「test1」と「test2」という名前の2つのディレクトリがあるとします。 「test1」に「customer.txt」というファイルが含まれていて、それをtest2ディレクトリにコピーしようとした場合
$ hadoop fs -put /test1/customer.txt/test2「put」はhdfsではなくローカルファイルシステムでファイルを検索するため、「no such file or directory」エラーが発生します。どちらもローカルファイルシステムからhdfsにのみファイル(またはディレクトリ)をコピーするためのものです。