EMR でハイブを実行しており、いくつかのファイルをすべての EMR インスタンスにコピーする必要があります。
私が理解している1つの方法は、ファイルを各ノードのローカルファイルシステムにコピーすることです。もう1つの方法は、ファイルをHDFSにコピーすることですが、S3からHDFSに直接コピーする簡単な方法は見つかりませんでした。
これについて最善の方法は何ですか?
これを行う最善の方法は、Hadoop の distcp コマンドを使用することです。例 (クラスター ノードの 1 つ):
% ${HADOOP_HOME}/bin/hadoop distcp s3n://mybucket/myfile /root/myfile
これにより、myfile というファイルが mybucket という名前の S3 バケットから/root/myfile
HDFS にコピーされます。この例では、S3 ファイル システムを「ネイティブ」モードで使用していることを前提としています。これは、Hadoop が S3 内の各オブジェクトをファイルとして認識することを意味します。代わりに S3 をブロック モードで使用する場合は、上記の例で s3n を s3 に置き換えます。ネイティブ S3 とブロック モードの違い、および上記の例の詳細については、http://wiki.apache.org/hadoop/AmazonS3 を参照してください。
distcp は非常に強力なツールであることがわかりました。S3 の内外で大量のファイルをコピーするために使用できることに加えて、大規模なデータセットで高速なクラスター間コピーを実行することもできます。すべてのデータを 1 つのノードにプッシュする代わりに、distcp は複数のノードを並行して使用して転送を実行します。これにより、大量のデータを転送する際に、仲介者としてすべてをローカル ファイル システムにコピーする場合に比べて、distcp が大幅に高速になります。
これで、Amazon自体にdistcp上に実装されたラッパー(つまり:s3distcp )があります。
S3DistCpは、Amazon Web Services(AWS)、特にAmazon Simple Storage Service(Amazon S3)で動作するように最適化されたDistCpの拡張機能です。S3DistCpは、ジョブフローのステップとして追加して使用します。S3DistCpを使用すると、Amazon S3からHDFSに大量のデータを効率的にコピーして、Amazon Elastic MapReduce(Amazon EMR)ジョブフローの後続のステップで処理できます。S3DistCpを使用して、Amazon S3バケット間、またはHDFSからAmazonS3にデータをコピーすることもできます。
例AmazonS3からHDFSにログファイルをコピーする
次の例は、AmazonS3バケットに保存されているログファイルを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-.*'
Amazon によると、http ://docs.amazonwebservices.com/ElasticMapReduce/latest/DeveloperGuide/FileSystemConfig.html "Amazon Elastic MapReduce - File System Configuration" で、S3 Block FileSystem は廃止され、その URI プレフィックスは現在 s3bfs になっていることに注意してください。 // そして、「ジョブ フローが失敗する原因となる可能性のある競合状態を引き起こす可能性がある」ため、特に使用を思いとどまらせます。
同じページによると、HDFS は一時的ではありますが (Hadoop ジョブが終了すると消えます)、S3 の下で「ファーストクラス」のファイル システムになりました。