2つのHDFSセットアップがあり、HDFS1からHDFS2にいくつかのテーブルをコピー(移行または移動ではなく)したい。あるHDFSから別のHDFSにデータをコピーする方法は? Sqoopまたは他のコマンドライン経由で可能ですか?
DistCp(分散コピー)は、クラスター間でデータをコピーするために使用されるツールです。 MapReduceを使用して、その配布、エラー処理と回復、およびレポートを実行します。ファイルおよびディレクトリのリストをマップタスクへの入力に展開し、それぞれがソースリストで指定されたファイルのパーティションをコピーします。
使用法:$ hadoop distcp <src> <dst>
例:$ hadoop distcp hdfs://nn1:8020/file1 hdfs://nn2:8020/file2
file1
からnn1
がnn2
にファイル名file2
でコピーされます
Distcpは現在のところ最高のツールです。 Sqoopは、リレーショナルデータベースからHDFSへ、またはその逆にデータをコピーするために使用されますが、HDFSからHDFS間ではコピーされません。
詳細:
2つのバージョンがあります-distcp2
の実行時パフォーマンスは、distcp
と比較して
Hadoopには、distcp
と呼ばれる便利なプログラムが付属しており、Hadoopファイルシステムとの間で大量のデータを並行してコピーできます。 distcpの標準的な使用例は、2つのHDFSクラスター間でデータを転送するためです。クラスタが同一バージョンのhadoopを実行している場合、hdfsスキームを使用するのが適切です。
$ hadoop distcp hdfs://namenode1/foo hdfs://namenode2/bar
Namenode1の/foo
ディレクトリ内のデータは、namenode2の/ barディレクトリにコピーされます。 /bar
ディレクトリが存在しない場合は、作成されます。また、複数のソースパスに言及することもできます。
rsync
コマンドと同様に、distcpコマンドはデフォルトで既に存在するファイルをスキップします。 -overwrite
オプションを使用して、宛先ディレクトリの既存のファイルを上書きすることもできます。オプション-update
は、変更されたファイルのみを更新します。
$ hadoop distcp -update hdfs://namenode1/foo hdfs://namenode2/bar/foo
distcp
は、クラスター全体で並行して実行されるマップによってコピーの作業が行われるMapReduceジョブとして実装することもできます。レデューサーはありません。
異なるバージョンを実行している2つのHDFSクラスター間でデータをコピーしようとすると、RPCシステムに互換性がないため、コピープロセスが失敗します。その場合、ソースから読み取るには、読み取り専用のHTTPベースのHFTPファイルシステムを使用する必要があります。ここで、ジョブは宛先クラスターで実行する必要があります。
$ hadoop distcp hftp://namenode1:50070/foo hdfs://namenode2/bar
50070は、namenodeの組み込みWebサーバーのデフォルトのポート番号です。
distcp
は、hadoopファイルシステムとの間でデータを並行してコピーするために使用されます。これは、一般的なhadoop fs -cp
コマンド。バックグラウンドプロセスでは、distcp
はMapReduceジョブとして実装され、マッパーはクラスター全体に並行してコピーするためにのみ実装されます。
使用法:
あるファイルを別のファイルにコピーする
% hadoop distcp file1 file2
ある場所から別の場所にディレクトリをコピーする
% hadoop distcp dir1 dir2
dir2
が存在しない場合は、そのフォルダーを作成して内容をコピーします。 dir2
は既に存在し、dir1
はその下にコピーされます。 -overwrite
オプションは、同じフォルダー内でファイルを強制的に上書きします。 -update
オプションは、変更されたファイルのみを更新します。
2つのHDFSクラスター間でデータを転送する
% hadoop distcp -update -delete hdfs://nn1/dir1 hdfs://nn2/dir2
-delete
オプションは、ソースに存在しないファイルまたはディレクトリを宛先から削除します。
dtIngest を試してください。これは Apache Apex プラットフォーム上で開発されています。このツールは、HDFS、共有ドライブ、NFS、FTP、Kafkaなどのさまざまなソースからさまざまなソースにデータをコピーします。リモートHDFSクラスターからローカルHDFSクラスターへのデータのコピーは、dtIngestでサポートされています。 dtIngestはデータを並行してコピーするためにyarnジョブを実行するため、非常に高速です。障害処理、リカバリなどの面倒を見て、定期的なディレクトリのポーリングをサポートして、継続的なコピーを実行します。
使用法:dtingest [オプション] ... SOURCEURL ... DESTINATIONURLの例:dtingest hdfs:// nn1:8020/source hdfs:// nn2:8020/dest
distcpコマンドは、あるクラスターから別のクラスターに並行してコピーするために使用します。 srcのnamenodeのパスとdstのnamenodeのパスを設定する必要があります。内部ではマッパーを使用します。
例:
$ hadoop distcp <src> <dst>
distcpに設定できるオプションはほとんどありません
-m noの場合データをコピーするためのマッパーを使用すると、コピー速度が向上します。
-atomicデータを自動コミットする場合。
-updateは、古いバージョンのデータのみを更新します。
Hadoopにファイルをコピーするための一般的なコマンドは-cpと-putがありますが、データボリュームが少ない場合にのみ使用されます。
次のように、ソースまたはターゲットクラスターのいずれかを使用して、基になるMapReduceジョブを実行できることに注意してください。
hadoop --config /path/to/hadoop/config distcp <src> <dst>