2011-09-20 12 views
23

私はEMRを超えてハイブを実行しています。 と、いくつかのファイルをすべてのEMRインスタンスにコピーする必要があります。S3からAmazon EMR HDFSにファイルをコピーするにはどうすればよいですか?

各ノードのローカルファイルシステムにファイルをコピーするだけですが、もう1つはファイルをHDFSにコピーすることですが、S3からHDFSにstrightをコピーする簡単な方法は見つかりませんでした。

これについてはどのような方法が最適ですか?

答えて

26

これを行う最良の方法は、Hadoopのdistcpコマンドを使用することです。 (クラスタノードのいずれかで)例:

% ${HADOOP_HOME}/bin/hadoop distcp s3n://mybucket/myfile /root/myfile

これは、HDFS内/root/myfileにmybucketという名前のS3バケットからMYFILEという名前のファイルをコピーします。この例では、S3ファイルシステムを「ネイティブ」モードで使用していることを前提としています。つまり、HadoopはS3内の各オブジェクトをファイルとして認識します。ブロックモードでS3を使用する場合は、上の例でs3nをs3に置き換えます。ネイティブS3とブロックモードの違いと上記の例の詳細については、http://wiki.apache.org/hadoop/AmazonS3を参照してください。

私はdistcpが非常に強力なツールであることを発見しました。大量のファイルをS3の内外にコピーするのに使用できるだけでなく、大きなデータセットを使用して高速のクラスタ間コピーを実行することもできます。すべてのデータを1つのノードにプッシュするのではなく、複数のノードを並列に使用して転送を実行します。これにより、大量のデータを転送する際にdistcpがかなり高速になります。これは、すべてをローカルファイルシステムに仲介としてコピーする方法とは異なります。

+0

distcpを使用してs3をhdfsに移動しているうちに、まだ何らかのエラーが発生しています。私の場合、40または50%を移動した後に非常に大きなファイル(300GB以上)を移動しようとしています。何か案が?? – rht

3

「Amazon Elastic MapReduce - ファイルシステムの設定」では、S3ブロックFileSystemは廃止され、そのURIプレフィックスはs3bfs://になりました。あなたのジョブフローが失敗する可能性のある競合状態」になります。

同じページによると、HDFSはS3の下では「ファーストクラス」のファイルシステムになっていますが、一時的です(Hadoopジョブが終了すると消えてしまいます)。

15

Amazon自体にdistcp、つまりs3distcpが実装されています。

はS3DistCpは Amazon Webサービス(AWS)で動作するように最適化されDistCp、特にアマゾンシンプルなストレージサービス (アマゾンS3)を拡張したものです。 S3DistCpをジョブフローのステップとして追加して使用します。 S3DistCpを使用すると、大量のデータを Amazon S3からHDFSに効率的にコピーすることができ、Amazon Elastic MapReduce(Amazon EMR)ジョブフローの後続の手順で処理できます。この次の例では、ログファイルをコピーする方法を示し

アマゾンS3からHDFSに例をコピーし、ログファイル

S3

のAmazon S3バケットの間、またはHDFSからアマゾン にあなたはまた、データをコピーする S3DistCpを使用することができますAmazon S3バケットにHDFSに格納されています。この例では、 - srcPatternオプションを使用して、デーモンログにコピーされるデータを制限しています。

elastic-mapreduce --jobflow j-3GY8JC4179IOJ --jar \ 
s3://us-east-1.elasticmapreduce/libs/s3distcp/1.latest/s3distcp.jar \ 
--args '--src,s3://myawsbucket/logs/j-3GY8JC4179IOJ/node/,\ 
--dest,hdfs:///output,\ 
--srcPattern,.*daemons.*-hadoop-.*' 
関連する問題